L'acquisition de verrouillage lors de la mise à jour d'un Redis clé/valeur
Je suis en utilisant AcquireLock méthode de ServiceStack Redis quand la mise à jour et l'obtention de la clé/valeur comme ceci:
public virtual void Set(string key, T entity)
{
using (var client = ClientManager.GetClient())
{
using (client.AcquireLock(key + ":locked", DefaultLockingTimeout, DefaultLockExpire))
{
client.Set(key, entity);
}
}
}
Je l'ai étendu AcqurieLock méthode d'accepter paramètre supplémentaire pour la date d'expiration de la clé de verrouillage. Alors je me demandais que si j'ai besoin d'AcquireLock à tous ou pas? Ma classe utilise AcquireLock dans chaque opération, comme Obtenir des<>, GetAll<>, ExpireAt, SetAll<>, etc..
Mais cette approche ne fonctionne pas à chaque fois. Par exemple, si l'exploitation dans la serrure déclenche une exception, puis sur la touche reste verrouillé. Pour cette situation, j'ai ajouté DefaultLockExpire paramètre AcquireLock méthode à expiration à la fin du "verrouillé".
Est-il une meilleure solution, ou quand avons-nous besoin de l'acquisition de verrous comme le "verrouillage" des blocs multi-thread de programmation.
OriginalL'auteur oruchreis | 2013-02-20
Vous devez vous connecter pour publier un commentaire.
Que Le Vrai Bill réponse l'a dit, vous n'avez pas besoin de verrous pour le Redis lui-même. Ce que le ServiceStack client offre en termes de verrouillage n'est pas pour le Redis, mais pour votre application. Dans une application C#, vous pouvez verrouiller les choses localement avec
lock(obj)
de sorte que quelque chose ne peut se produire simultanément (un seul thread peut accéder à l'verrouillé section à un moment), mais qui ne fonctionne que si vous avez un serveur web. Si vous souhaitez empêcher quelque chose de se produire simultanément, vous avez besoin d'un mécanisme de verrouillage vivant à l'extérieur du serveur web. Redis est un bon ajustement pour cela.Nous avons un cas où il est vérifié si un client dispose d'un panier déjà et si pas, le créer. Entre la vérification et de la création, il y a un moment où un autre demande peut également avoir découvert qu'panier n'existe pas et peut également continuer à en créer un. C'est un cas classique de verrouillage, mais un simple
lock
ne fonctionne pas ici comme le demande peut-être arriver d'une tout autre serveur web. Donc, pour cela, nous utilisons la ServiceStack Redis client (avec un peu d'abstraction) à verrouillage à l'aide de Redis et de ne permettre qu'une seule requête à la fois pour entrer dans le "créer un panier de" section.Donc, pour répondre à votre question: non, vous n'avez pas besoin d'une serrure pour obtenir/valeurs de réglage Redis.
OriginalL'auteur JulianR
Je ne voudrais pas utiliser des verrous pour obtenir/définir les opérations. Redis fera les actions de façon atomique, donc il n'y a aucune chance de l'obtenir "changé en dessous de vous" lors de la configuration ou obtenir. J'ai construit des systèmes où des centaines de clients sont mise à jour/d'exploitation sur les valeurs en même temps et jamais eu besoin d'une serrure pour faire ces opérations (en particulier une expiration).
Je ne sais pas comment le Service de la Pile redis met en œuvre le blocage, il a donc je ne peux pas dire pourquoi, c'est un échec. Cependant, je ne suis pas sûr que j'avais confiance en elle, car il n'existe pas de véritable verrouillage nécessaire sur le Redis côté pour les opérations sur les données. Redis est mono-thread afin de verrouillage ne fait pas de sens.
Si vous faites des opérations complexes, d'où vous aurez une valeur, opèrent sur des choses basées sur elle, puis la mise à jour après un certain temps et ne peut pas avoir le changement de valeur dans l'intervalle, je vous recommande la lecture et de l'groking http://redis.io/topics/transactions pour voir si ce que vous voulez est ce que Redis est bon pour, que votre code doit reconstruit pour éliminer le problème, ou au moins de trouver une meilleure façon de le faire.
Par exemple, SETNX peut-être la route vous avez besoin pour obtenir ce que vous voulez, mais sans plus de détails, je ne peux pas dire que ça va fonctionner.
Pas besoin de faire des hypothèses et fiez pas quelque chose que vous ne connaissez pas. Vous pouvez lire à ce sujet distribué de verrouillage avec le redis ici. C'est pour la distribution de verrouillage de l'application, ce n'est pas pour le verrouillage de redis.
Je n'aurais pas confiance en la méthode décrite pour le verrouillage redis données. Pour les raisons pourquoi, jetez un oeil à la setnx documentation - en particulier la discussion sur le verrouillage. À l'aide d'une banque de données comme une application au niveau de mécanisme de verrouillage lorsque cette banque de données ne gère pas directement, mais au lieu de cela vous avez à la solution, elle doit uniquement être effectuée si la langue ne prend pas en charge la norme de la simultanéité des mécanismes tels que le verrouillage. Je n'ai pas confiance en elle, précisément parce que je sais sur l'utilisation de redis pour l'application du niveau de verrouillage.
Il est PAS destiné à verrouiller le redis données, c'est pour uniquement pour la fourniture d'un distribué de verrouillage mécanisme application qui arrive juste à utiliser Redis. Non pas que cela importe, mais la mise en œuvre utilise à la fois SETNX et GETSET.
La question n'est pas si vous êtes d'accord avec son existence ou pas. Vous avez déclaré au début vous n'avez pas confiance en elle (sans rien y connaître), puis après avoir appris que c'est uniquement pour au niveau de l'application distribuée de verrouillage a répondu:
not a good idea to use redis in this fashion
- sans fournir spécifiques ou en béton info pourquoi ou ce que de fois il l'habitude de travailler pour le but qu'il visait. Fondamentalement, sauf si vous savez de une raison valable, vous ne devriez pas vous conseiller sur les choses que vous ne connaissez pas.OriginalL'auteur The Real Bill
@JulianR dit, le verrouillage ServiceStack.Redis est seulement au niveau des applications distribuées serrures (c'est à dire à remplacer à l'aide d'un DB ou un vide
.lock
fichier sur un système de fichiers distribués) et il ne fonctionne que contre les autres ServiceStack.Redis clients dans d'autres processus à l'aide de la même clé/API pour acquérir le verrou.Vous n'aurez jamais besoin de faire cela pour normal Redis opérations car ils sont tous atomique. Si vous voulez vous assurer d'une combinaison de redis opérations de produire automatiquement des que vous les combiner au sein d'un Redis Transaction ou sinon, vous pouvez exécuter dans un délai d'un côté serveur de script Lua - à la fois permettre atomique de l'exécution d'opérations de traitement par lots.
OriginalL'auteur mythz