W bieżącej gałęzi wydania Redis (2.6) , nie możesz otrzymywać powiadomień o wygaśnięciu przedmiotów. Prawdopodobnie zmieni się w kolejnych wersjach.
W międzyczasie, aby spełnić swoje wymagania, musisz ręcznie zaimplementować obsługę powiadomień o wygaśnięciu. Masz więc:
session:<sessionid> -> a hash storing your session data - one of the field is <userid>
user:<userid> -> a set of <sessionid>
Musisz usunąć sessionid
od użytkownika ustawionego po wygaśnięciu sesji. Możesz więc zachować dodatkowy posortowany zestaw, którego wynik jest znacznikiem czasu.
Podczas tworzenia sesji 10 dla użytkownika 100:
MULTI
HMSET session:10 userid:100 ... other session data ...
SADD user:100 10
ZADD to_be_expired <current timestamp + session timeout> 10
EXEC
Następnie musisz zbudować demona, który odpytuje zset, aby zidentyfikować sesję do wygaśnięcia (ZRANGEBYSCORE
). Dla każdej wygasłej sesji musi zachować strukturę danych:
- wyjmij sesję z zestawu zset (
ZREMRANGEBYRANK
) - pobierz identyfikator użytkownika sesji (
HMGET
) - usuń sesję (
DEL
) - usuń sesję z zestawu identyfikatorów użytkownika (
SREM
)
Główną trudnością jest upewnienie się, że nie ma warunków wyścigu, gdy demon odpytuje i przetwarza przedmioty. Zobacz moją odpowiedź na to pytanie, aby zobaczyć, jak można ją wdrożyć:
jak obsłużyć wygaśnięcie sesji w oparciu o redis?