sql >> Databasteknik >  >> NoSQL >> Redis

StackExchange.Redis - LockTake / LockRelease-användning

Det finns 3 delar till ett lås:

  • nyckeln (det unika namnet på låset i databasen)
  • värdet (en anropsdefinierad token som kan användas både för att indikera vem som "äger" låset och för att kontrollera att frigöring och förlängning av låset görs korrekt)
  • varaktigheten (ett lås är avsiktligt en sak med begränsad varaktighet)

Om inget annat värde kommer att tänka på, kan en guide göra ett lämpligt "värde". Vi brukar använda maskinnamnet (eller en munged version av maskinnamnet om flera processer kan konkurrera på samma maskin).

Observera också att det är spekulativt att ta ett lås , inte blockerande . Det är fullt möjligt att du misslyckas för att få låset, och därför kan du behöva testa för detta och kanske lägga till lite logik för att försöka igen.

Ett typiskt exempel kan vara:

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

Observera att om arbetet är långt (särskilt en slinga) kanske du vill lägga till en och annan LockExtend samtal i mitten - återigen komma ihåg att kontrollera om det lyckades (i fall det tog timeout).

Observera också att alla individuella redis-kommandon är atomära, så du behöver inte oroa dig för två diskreta operationer som konkurrerar. För mer komplexa fleroperationsenheter, transaktioner och skript är alternativ.



  1. mongodb :Ökar maxanslutningar i mongodb

  2. Fråga inbäddade objekt i Mongoid/rails 3 (Lägre än, Min-operatorer och sortering)

  3. fjäderdata - Mongodb - findBy Method för kapslade objekt

  4. Introduktion till Spring Data MongoDB