php - Comment résoudre le problème de l'insertion répétée de données dans MySQL causée par la concurrence avec Redis?
淡淡烟草味
淡淡烟草味 2017-05-16 13:01:48
0
4
709

Scénario commercial

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]

Description du problème

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 !

淡淡烟草味
淡淡烟草味

répondre à tous(4)
伊谢尔伦

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 {
    #上锁后的操作
}
为情所困
//定义锁的时间秒数
$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);
     //恢复业务操作
   
}
小葫芦
if (true == $redis_handle->set($lock_key, 1, array('nx', 'ex' => 6))) {
     //插入
}
迷茫

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

 ?
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal