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

Redis:Aby ustawić limit czasu dla pary klucz-wartość w Set

Niestety nie. „Kontenery” Redis (tj. listy, skróty, zestawy i posortowane zestawy) nie obsługują wygasania ważności poszczególnych członków, chociaż w przeszłości wielokrotnie prosiliśmy o tę funkcję.

Możesz jednak wdrożyć własną logikę, aby osiągnąć ten wynik. Istnieje kilka możliwych podejść do rozwiązania tego problemu — oto jeden przykład. Zamiast używać zestawu, użyj posortowanego zestawu (ZSET) i ustaw wynik każdego członka na jego czas wygaśnięcia, używając wartości epoki. Ten rodzaj przepływu pracy można zaimplementować na przykład za pomocą skryptu Lua. Aby dodać członków, użyj czegoś takiego:

redis.call('zadd', KEYS[1], os.time()+ARGV[1], ARGV[2])

i EVAL to używając '1 a 60 1' i '1 a 120 2' jako argumentów, zgodnie z twoim przykładem. Aby faktycznie „wygasły” elementy z zestawu, musisz je usunąć, gdy minie ich czas. Możesz to zrobić, wdrażając okresowy proces, który skanuje Twoją listę, lub po uzyskaniu do niej dostępu. Na przykład następującego Lua można użyć do wygaśnięcia członkostwa:

redis.call('zremrangebyscore', KEYS[1], '-inf', os.time())

i EVAL to używając '1 a' jako argumentów w twoim przykładzie.

EDYCJA:Jak osiągnąć powyższe za pomocą Pythona

import time
import redis

def add(r, key, ttl, member):
    r.zadd(key, member, int(time.time()+ttl))

def expire(r, key):
    r.zremrangebyscore(key, '-inf', int(time.time()))

...

r = redis.Redis()
add(r, 'a', 1, 60)
add(r, 'a', 2, 120)

# periodically or before every operation do
expire(r, 'a')



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Czy mogę używać Tornado+ Celery+ RabbitMQ + Redis?

  2. Czy Redigo Redis Pool naprawdę ma być zmienną globalną?

  3. Ustawianie dynamicznej ścieżki w redis.conf za pomocą zmiennej środowiskowej

  4. Kluczowy projekt Redis do aplikacji magazynowych w czasie rzeczywistym

  5. Jak wygasnąć klucz podrzędny HSET w redis?