Redis
 sql >> Base de données >  >> NoSQL >> Redis

StackExchange.Redis - Utilisation de LockTake / LockRelease

Il y a 3 parties dans une serrure :

  • la clé (le nom unique de la serrure dans la base de données)
  • la valeur (un jeton défini par l'appelant qui peut être utilisé à la fois pour indiquer qui "possède" le verrou et pour vérifier que la libération et l'extension du verrou sont effectuées correctement)
  • la durée (un verrou est intentionnellement une chose à durée finie)

Si aucune autre valeur ne vient à l'esprit, un guid peut constituer une "valeur" appropriée. Nous avons tendance à utiliser le nom de la machine (ou une version modifiée du nom de la machine si plusieurs processus peuvent être en concurrence sur la même machine).

Notez également que prendre un verrou est spéculatif , pas bloquant . Il est tout à fait possible que vous échouiez pour obtenir le verrou, et par conséquent, vous devrez peut-être tester cela et peut-être ajouter une logique de nouvelle tentative.

Un exemple typique pourrait être :

RedisValue token = Environment.MachineName;
if(db.LockTake(key, token, duration)) {
    try {
        // you have the lock do work
    } finally {
        db.LockRelease(key, token);
    }
}

Notez que si le travail est long (une boucle, en particulier), vous pouvez ajouter occasionnellement des LockExtend appels au milieu - rappelez-vous à nouveau de vérifier le succès (au cas où il expirerait).

Notez également que tous les commandes redis individuelles sont atomiques, vous n'avez donc pas à vous soucier de la concurrence de deux opérations discrètes. Pour les unités multi-opérations plus complexes, transactions et script sont des options.