Maison > Questions et réponses > le corps du texte
Il existe un système de requête. Lorsque l'utilisateur interroge, s'il n'y a pas de données dans la base de données, il doit appeler une interface de requête tierce pour obtenir les données, puis insérer les données dans la base de données, puis récupérer les données. données de la base de données et les renvoyer à l'utilisateur. [Le système est développé sur la base de PHP]
Si plusieurs utilisateurs effectuent une requête, plusieurs requêtes seront adressées simultanément à l'interface tierce et le problème de l'insertion répétée des données se posera.
Comment résoudre ce problème ?
Lors de l'appel d'une interface tierce, utilisez Redis
pour vous assurer qu'une seule requête est envoyée au tiers, évitant ainsi les requêtes répétées et l'insertion de données. méthode? ? Comment y parvenir concrètement ?
Merci !
伊谢尔伦2017-05-16 13:03:48
Mécanisme de verrouillage. Avant que le code n'entre dans l'opération, vérifiez si l'opération est verrouillée. Si elle est verrouillée, interrompez l'opération. Sinon, passez à l'opération suivante. La première étape consiste à verrouiller l'opération, puis à exécuter le code. Après avoir exécuté le code, n'oubliez pas de déverrouiller le verrouillage de l'opération. Sinon, vous ne pourrez pas procéder à l’exécution.
Il existe de nombreux codes de verrouillage, et celui indiqué ci-dessus en fait partie. Les fichiers Redismemcachecache peuvent être utilisés si la concurrence des opérations est relativement élevée, il est recommandé d'utiliser redis comme celui ci-dessus. (En fait, il s'agit d'utiliser le type de données chaîne pour attribuer une valeur à la clé de verrouillage {lock}, et lors du déverrouillage, la valeur de la clé sera effacée ou affectée d'une valeur de 0)
$lock_status = $redis->get('lock_state');
if ($lock_status == 0 || empty($lock_status)) {
$redis->set('lock_state', 3600, 1); #操作上锁
#操作代码
$redis->set('lock_state', 3600, 0); #操作解锁
} else {
#上锁后的操作
}
为情所困2017-05-16 13:03:48
//定义锁的时间秒数
$lockSecond = 5;
//获取锁定状态
$lockKey="xxx";
$lockStatus = $redis->get($lockKey);
if ($lockStatus == 0 || empty($lockStatus)) {//无锁
//1.上锁
$redis->set($lockKey, 1, ['nx', 'ex' => $lockSecond]);
//2.业务操作
//3.解锁
$redis->del($lockKey);
} else {
sleep($lockSecond);
//恢复业务操作
}
高洛峰2017-05-16 13:03:48
if (true == $redis_handle->set($lock_key, 1, array('nx', 'ex' => 6))) {
//插入
}
迷茫2017-05-16 13:03:48
Le « verrouillage » redis mentionné par l'affiche est bien sûr réalisable
De plus, un identifiant unique peut-il être défini pour les données interrogées. Il s'agit d'une double vérification