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

redis:nulstil tæller hver dag

Overvej to samtidige transaktioner, der finder sted ved midnat. Begge kan udføre get(dt_key), men den ene vil udføre MULTI/EXEC-blokken først. Det vil nulstille tælleren, indstille den nye dato, øge tælleren. Den anden vil også komme ind i sin MULTI/EXEC-blok, men fordi værdien af ​​'dt' er ændret, vil udførelsen mislykkes, og incr_daily_number vil blive kaldt igen. Denne gang vil get(dt_key) returnere den nye dato, så når MULTI/EXEC-blokken udføres, vil tælleren blive forøget uden nogen nulstilling. De to transaktioner returnerer den nye dato med forskellige tællerværdier.

Så jeg mener, at der ikke er nogen racebetingelse her, og at parrene (dato, antal) vil være unikke.

Du kunne også have implementeret dette ved hjælp af et Lua-script på serversiden (hvis udførelse altid er atomisk). Det er normalt mere bekvemt.

Bemærk, at der faktisk ikke er sådan noget som en Redis-lås. Låsemekanismen, der er tilgængelig i API'en, leveres af Python-klienten - ikke af Redis-serveren. Hvis du ser på dens implementering, vil du indse, at den også er baseret på SETNX + WATCH/MULTI/EXEC-blokke eller Lua-scripting.




  1. Hvordan implementerer man server push i Flask framework?

  2. Håndtering af brugerdefineret BSON Marshaling

  3. 5 måder at få måneden fra en dato i MongoDB

  4. Find dokumenter med matrix, der ikke indeholder en bestemt værdi