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.