2014-06-08 11 views

Odpowiedz

6

Niestety, nie. Kontenery "Redis" (tj. Listy, hashe, zestawy i posortowane zestawy) nie obsługują wygaśnięcia liczby członków, chociaż w przeszłości wielokrotnie żądano tej funkcji.

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

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

i eval go za pomocą „1a 60 1” i „1 120 2” jako argumenty, na swoim przykładzie. Aby faktycznie "wygasić" elementy z zestawu, musisz je usunąć, gdy minie ich czas. Możesz to zrobić poprzez wdrożenie okresowego procesu, który skanuje twoją listę lub dostęp do niej. Na przykład, następujący Lua może być używany do wygaśnięcia członków:

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

i eval go za pomocą „1a” jako argumenty na swoim przykładzie.

EDIT: Jak osiągnąć powyższe przy użyciu Python

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

Dziękuje bardzo za wyjaśnienie, czy jest to przykład, w jaki sposób osiągnąć to za pomocą Pythona. – user3218088

+0

Dodano trochę kodu Pythona (nietestowane) - mam nadzieję, że ułatwi ci to wdrożenie :) –

+0

... i dzięki za edycje - powiedział ci, że nie był testowany;) –

Powiązane problemy