sql >> Database teknologi >  >> NoSQL >> Redis

StackExchange.Redis - LockTake / LockRelease-brug

Der er 3 dele til en lås:

  • nøglen (det unikke navn på låsen i databasen)
  • værdien (et opkaldsdefineret token, som både kan bruges til at angive, hvem der "ejer" låsen, og til at kontrollere, at udløsning og udvidelse af låsen udføres korrekt)
  • varigheden (en lås er med vilje en ting med begrænset varighed)

Hvis ingen anden værdi kommer til at tænke på, kan en guide lave en passende "værdi". Vi har en tendens til at bruge maskinnavnet (eller en munged version af maskinnavnet, hvis flere processer kunne konkurrere på den samme maskine).

Bemærk også, at det at tage en lås er spekulativt , ikke blokerende . Det er helt muligt, at du fejler for at få låsen, og derfor skal du muligvis teste for dette og måske tilføje noget genforsøgslogik.

Et typisk eksempel kan være:

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

Bemærk, at hvis arbejdet er langvarigt (især en løkke), vil du måske tilføje nogle lejlighedsvise LockExtend opkald i midten - husk igen at tjekke for succes (i tilfælde af at det gik timeout).

Bemærk også, at alle individuelle redis-kommandoer er atomare, så du behøver ikke bekymre dig om to diskrete operationer, der konkurrerer. For mere komplekse multioperationsenheder, transaktioner og scripting er muligheder.



  1. Sorter indlejret række af objekter

  2. Hvordan kan jeg læse fra Redis inde i en MULTI-blok i Ruby?

  3. Hvordan fjerner man fejlretning fra en Express-app?

  4. Hvorfor kan mit Redis Lua-script ikke atomisk opdatere nøgler på forskellige Redis Cluster-noder?