2013-06-12 20 views
37

Czy w Redis można ustawić TTL (czas życia) nie dla określonego klucza, ale dla członka dla zestawu?TTL dla zestawu elementów

Używam struktury dla znaczników proponowanych w dokumentacji Redis - dane są prostymi parami klucz-wartość, a znaczniki są zestawami zawierającymi klucze odpowiadające każdemu znacznikowi, np.

> SETEX id:id_1 100 'Lorem ipsum' 
OK 
> SADD tag:tag_1 id:id_1 
(integer) 1 

Kluczem id:id_1 wygasają zgodnie z oczekiwaniami, ale nie widzę skuteczny sposób, aby usunąć odpowiedni element ze zbioru tag:tag_1.

Jednym ze sposobów, w jaki wpadłem, jest użycie zadania cron zawierającego skrypt, który okresowo usuwa wygasłe klucze z zestawów - przez dodanie wszystkich nazw znaczników do innego zestawu, a następnie iterowanie po wszystkich znacznikach, następnie wszystkie identyfikatory odpowiadające każdemu z nich. tag i sprawdzenie, czy odpowiedni klucz istnieje - jeśli nie, wywołanie SREM.

Nie sądzę, że będzie to skuteczny sposób i prawdopodobnie chciałbym zachować tagi tak czyste, jak to możliwe, ponieważ rozmiar zestawów prawdopodobnie wpłynie na wydajność wyszukiwania przez wiele znaczników (SINTER). Czy istnieje bardziej "wewnętrzny" sposób?

Odpowiedz

15

Nie można bezpośrednio wygaśnąć pozycji na liście, zestawach lub zsets.

Musisz zaimplementować mechanizm powiadamiania o wygaśnięciu głównej pozycji, aby odpowiednio zachować odpowiednie zestawy.

Patrz odpowiedź na to pytanie, myślę, że odnosi się do przypadku użycia (zastąpienie przez ID sesji użytkownika oraz wg słów kluczowych):

Redis, session expiration, and reverse lookup

+0

Tak, to przyzwoity sposób i prawdopodobnie poradzę sobie z tym problemem z czymś podobnym. Ponieważ istnienie wygasłych członków w zestawach znaczników nie stanowi problemu w żaden inny sposób niż wydajność, najprawdopodobniej użyję okresowo uruchamianego programu cron istead - aby ograniczyć ankiety do wystarczającego minimum. – Przemek

20

Nie, nie jest to możliwe (i not planned either). Podejście recommended polega na użyciu uporządkowanego zestawu z ustawionym wynikiem na znacznik czasu, a następnie ręcznym usunięciu wygasłych kluczy. Aby wyszukać klucze, które nie wygasły, można użyć ZRANGEBYSCORE $now +inf, aby skasować wygasłe klucze, ZREMRANGEBYSCORE -inf $now zrobi lewy.

W mojej aplikacji po prostu wydaje się obie komendy za każdym razem, gdy wysyłam zapytanie do zestawu. Łączę to również z (długim) czasem wygasania na samym zestawie, aby ostatecznie usunąć nieużywane zestawy.

This article przechodzi przez to bardziej szczegółowo.

Powiązane problemy