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.