sql >> Database >  >> NoSQL >> Redis

redis:teller elke dag resetten

Overweeg twee gelijktijdige transacties die om middernacht plaatsvinden. Beide kunnen get(dt_key) uitvoeren, maar men zal eerst het MULTI/EXEC-blok uitvoeren. Het zal de teller resetten, de nieuwe datum instellen, de teller verhogen. De tweede zal ook in zijn MULTI/EXEC-blok komen, maar omdat de waarde van 'dt' is gewijzigd, zal de uitvoering mislukken en zal incr_daily_number opnieuw worden aangeroepen. Deze keer zal get(dt_key) de nieuwe datum retourneren, dus wanneer het MULTI/EXEC-blok wordt uitgevoerd, wordt de teller verhoogd zonder enige reset. De twee transacties retourneren de nieuwe datum met verschillende tellerwaarden.

Dus ik geloof dat er hier geen rasconditie is en dat de (datum, aantal) koppels uniek zullen zijn.

Je had dit ook kunnen implementeren met behulp van een Lua-script aan de serverzijde (waarvan de uitvoering altijd atomair is). Het is meestal handiger.

Merk op dat er eigenlijk niet zoiets bestaat als een Redis-slot. Het vergrendelingsmechanisme dat beschikbaar is in de API wordt geleverd door de Python-client - niet door de Redis-server. Als je naar de implementatie kijkt, zul je je realiseren dat het ook gebaseerd is op SETNX + WATCH/MULTI/EXEC-blokken of Lua-scripting.




  1. Kan ik de bestaande index in MongoDB wijzigen zonder deze te laten vallen?

  2. Node.js + mangoest bevriest knooppunt bij meer dan 100 resultaten

  3. Duw items in mongo-array via mangoest

  4. Redis as Hibernate tweede niveau cache