Redis
 sql >> Baza danych >  >> NoSQL >> Redis

redis:resetuj licznik każdego dnia

Rozważ dwie równoczesne transakcje mające miejsce o północy. Oba mogą wykonać get(dt_key), ale jeden z nich wykona najpierw blok MULTI/EXEC. Zresetuje licznik, ustawi nową datę, zwiększy licznik. Drugi wprowadzi również w swoim bloku MULTI/EXEC, ale ponieważ wartość 'dt' uległa zmianie, wykonanie się nie powiedzie i incr_daily_number zostanie wywołane ponownie. Tym razem get(dt_key) zwróci nową datę, więc po wykonaniu bloku MULTI/EXEC licznik zostanie zwiększony bez żadnego resetu. Dwie transakcje zwrócą nową datę z różnymi wartościami liczników.

Uważam więc, że nie ma tu żadnych warunków rasowych i że pary (data, liczba) będą wyjątkowe.

Można to również zaimplementować za pomocą skryptu Lua po stronie serwera (którego wykonanie jest zawsze atomowe). Zwykle jest to wygodniejsze.

Zauważ, że w rzeczywistości nie ma czegoś takiego jak blokada Redis. Mechanizm blokowania dostępny w API zapewnia klient Pythona, a nie serwer Redis. Jeśli spojrzysz na jego implementację, zdasz sobie sprawę, że jest ona również oparta na blokach SETNX + WATCH/MULTI/EXEC lub skryptach Lua.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Nie można połączyć się z serwerem Redis przy użyciu dostawcy stanu sesji ASP.NET

  2. Redis 10 razy większe zużycie pamięci niż danych

  3. jak aktualizować pamięć podręczną

  4. jak mogę przekazać nieskończoność do redis z Pythona?

  5. Rails Redis ustawia maxmemory i maxmemory-policy