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')