sql >> Databáze >  >> NoSQL >> Redis

redis:reset počítadla každý den

Zvažte dvě souběžné transakce, ke kterým dojde o půlnoci. Oba mohou vykonat get(dt_key), ale jeden provede blok MULTI/EXEC jako první. Vynuluje počítadlo, nastaví nové datum, zvýší počítadlo. Druhý vstoupí také do svého bloku MULTI/EXEC, ale protože se změnila hodnota 'dt', provedení se nezdaří a bude znovu voláno incr_daily_number. Tento čas get(dt_key) vrátí nové datum, takže když bude proveden blok MULTI/EXEC, počítadlo se zvýší bez jakéhokoli resetu. Obě transakce vrátí nové datum s různými hodnotami počítadla.

Takže věřím, že zde není žádná rasová podmínka a že páry (datum, počet) budou jedinečné.

Mohli jste to také implementovat pomocí skriptu Lua na straně serveru (jehož provádění je vždy atomické). Obvykle je to pohodlnější.

Všimněte si, že ve skutečnosti neexistuje nic takového jako zámek Redis. Uzamykací mechanismus dostupný v API poskytuje klient Pythonu, nikoli server Redis. Když se podíváte na jeho implementaci, zjistíte, že je také založena na blocích SETNX + WATCH/MULTI/EXEC nebo na skriptování Lua.




  1. Počet klíčů, kterým končí platnost, uvedených v příkazu info na redis slave není v souladu s tím, co vidím

  2. 5 způsobů, jak získat vteřiny z rande v MongoDB

  3. MongoDB vs. DynamoDB:Co potřebujete vědět

  4. jak zavolat operaci počítání po nálezu pomocí java ovladače mongodb