Maison  >  Article  >  base de données  >  Redis sera-t-il verrouillé lors de la sauvegarde des données ?

Redis sera-t-il verrouillé lors de la sauvegarde des données ?

(*-*)浩
(*-*)浩original
2019-11-23 10:02:533866parcourir

Redis sera-t-il verrouillé lors de la sauvegarde des données ?

Redis n'a pas de mécanisme de verrouillage et il n'y a pas de problème de concurrence pour les connexions multi-utilisateurs.

Cependant, des erreurs telles qu'un délai d'attente de connexion, une connexion bloquée ou une connexion fermée peuvent survenir pendant la simultanéité. (Apprentissage recommandé : Tutoriel vidéo Redis)

Généralement, vous pouvez regrouper la connexion côté client (par exemple en utilisant la synchronisation et en ajoutant des verrous internes lors de la lecture et de l'écriture de Redis). Ou utilisez la commande de traitement des transactions setnx fournie avec Redis côté serveur pour implémenter le verrou.

Dans les activités de commerce électronique, il y a souvent des activités de vente « vente flash ». Dans ce scénario, le serveur est généralement confronté à un traitement de demandes simultanées élevé.

En d'autres termes, en même temps, il y aura un grand nombre d'utilisateurs simultanés qui achèteront un certain produit en même temps, à ce moment-là, il est nécessaire de s'assurer qu'il n'y aura pas de survente. (le nombre de produits finalement achetés par l'utilisateur dépasse le nombre réel de marchandises).

Ici, vous devez appliquer les fonctionnalités de verrouillage et de déverrouillage de redis pour garantir qu'un seul utilisateur effectue chaque opération d'achat, afin d'éviter une concurrence conduisant à des données sales.

Ci-dessous, nous présenterons comment utiliser correctement le verrouillage et le déverrouillage.

setnx

Le responsable Redis recommande d'utiliser la commande set pour les opérations de verrouillage. La méthode d'utilisation est la suivante :

if ($redis->set('my:lock', 1, ['NX'])) {
        # todo
 
        $redis->del('my:lock');
    }

NX — Indique que la clé est définie uniquement lorsque la clé n'existe pas.

Il y a un problème avec cette méthode si un client plante après avoir acquis le verrou ou continue d'occuper le verrou. et ne le libère pas, cela entraînera un blocage, rendant impossible pour les utilisateurs suivants d'obtenir le verrou pour les opérations. Cette opération doit donc définir un délai d'attente.

Améliorations de setnx

En réponse au problème de la méthode ci-dessus, nous utilisons la méthode expire pour définir le délai d'attente. Mais le problème est-il résolu ici ?

Non ! Étant donné que expirer n'est pas une opération atomique ici, si le client plante après avoir exécuté setnx, le délai d'attente ne sera pas défini avec succès à ce moment-là, ce qui entraînera également que l'opération de verrouillage soit confrontée aux problèmes ci-dessus.

if ($redis->set('my:lock', 1, ['NX'])) {
        $redis->expire('my:lock', 10);
        # todo
 
        $redis->del('my:lock');
    }

Pour plus d'articles techniques liés à Redis, veuillez visiter la colonne

Introduction au didacticiel d'utilisation de la base de données Redis pour apprendre !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn