Redis
 sql >> база данни >  >> NoSQL >> Redis

redis:нулирайте брояча всеки ден

Помислете за две едновременни транзакции, които се случват в полунощ. И двете могат да изпълнят get(dt_key), но единият първо ще изпълни блока MULTI/EXEC. Той ще нулира брояча, ще зададе нова дата, ще увеличи брояча. Вторият ще влезе също в своя MULTI/EXEC блок, но тъй като стойността на 'dt' се е променила, изпълнението ще се провали и incr_daily_number ще бъде извикан отново. Този път get(dt_key) ще върне новата дата, така че когато MULTI/EXEC блокът ще бъде изпълнен, броячът ще бъде увеличен без нулиране. Двете транзакции ще върнат новата дата с различни стойности на брояча.

Така че вярвам, че тук няма условия за състезание и че двойките (дата, брой) ще бъдат уникални.

Можете също така да приложите това с помощта на Lua скрипт от страна на сървъра (чието изпълнение винаги е атомарно). Обикновено е по-удобно.

Имайте предвид, че всъщност няма такова нещо като заключване на Redis. Механизмът за заключване, наличен в API, се предоставя от клиента на Python, а не от Redis сървъра. Ако погледнете реализацията му, ще разберете, че също се основава на SETNX + WATCH/MULTI/EXEC блокове или Lua скриптове.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Поддържа ли се конкурентен потребител на Redis Pub/Sub?

  2. Redis, Node.js и Socket.io:кръстосано удостоверяване на сървъри и разбиране на node.js

  3. Rails Resque смяна на лимит за работници?

  4. Как може Redis да сортира според два различни сортирани набора?

  5. Да внедря ли сериализиране и десериализиране на NodesJS + Passport + RedisStore?