Funkcja, z którą łączył się Eli, pozwala na słuchanie po wygaśnięciu klucza. Jednak nie daje wartości klucza. Ponadto, w oparciu o złożony problem z Githubem, wygląda na to, że nie można oczekiwać, że ta funkcja zostanie wbudowana w najbliższym czasie (https://github.com/antirez/redis/issues/1876). Rozwiązaniem, którego używam, jest utworzenie specjalnego klucza wygasającego "shadow", który jest powiązany z kluczem, w którym masz rzeczywistą wartość.
Więc powiedzmy, że masz klucz o nazwie testkey
i ma on całkowitą wartość 100
. Co więcej, klucz wygaśnie po 10 sekundach, w którym chcesz uzyskać wartość klucza. (Może inkrementowałeś klucz w ciągu 10 sekund, jakie istniało).
Najpierw należy skonfigurować odsłuchiwanie zdarzeń związanych z kluczami.W szczególności chcesz posłuchać wydarzeń expired
. Możesz to zrobić ze swojej konfiguracji lub użyć polecenia config set
w trybie redis. (Patrz tutaj, aby uzyskać więcej informacji: http://redis.io/topics/notifications)
CONFIG SET notify-keyspace-events Ex
Teraz możesz zapisać się do specjalnego keyevent
kanału, gdzie użytkownik zostanie powiadomiony, że klucz wygasł.
SUBSCRIBE [email protected]__:expired
Format kanału subskrypcji to [email protected]<db>__:<eventName>
. W naszym przykładzie zakładamy, że pracujemy z domyślną bazą danych 0 i chcemy słuchać zdarzenia expired
.
Po wygaśnięciu testkey
otrzymasz wiadomość na kanale , w której wiadomość jest nazwą klucza, który wygasł. Oczywiście w tym momencie klucz zniknął, więc nie możemy już uzyskać dostępu do wartości! Rozwiązaniem jest użycie specjalnego klucza wydechowego.
Po utworzeniu testkey
utwórz specjalny wygasający klucz "cień" (nie wygasaj aktualnego testkey
). Na przykład:
SET testkey 100
SET shadowkey:testkey "" EX 10
Teraz w kanale [email protected]__:expired
dostaniesz komunikat informujący, że klucz shadowkey:testkey
wygasł. Podaj wartość wiadomości (która jest nazwą klucza), podziel na dwukropek (lub dowolny separator, który zdecydujesz się użyć), a następnie ręcznie pobierz wartość klucza i usuń go.
// set your key value
SET testkey 100
//set your "shadow" key, note the value here is irrelevant
SET shadowkey:testkey "" EX 10
// Get an expiration message in the channel [email protected]__:expired
// Split the key on ":", take the second part to get your original key
// Then get the value and do whatever with it
GET testkey
// Then delete the key
DEL testkey
Zauważ, że wartość Shadowkey nie służy więc chcesz skorzystać z najmniejszą możliwą wartość, która według tej odpowiedzi (Redis store key without a value) jest ciągiem pustym ""
. Konfiguracja wymaga nieco więcej pracy, ale powyższy system robi dokładnie to, czego potrzebujesz. Narzut to kilka dodatkowych poleceń, które pozwalają odzyskać i usunąć klucz oraz koszt przechowywania pustego klucza.
Redis 2.8 do tej pory jest kandydatem do wydania. Jeśli potrzebujesz kontroli nad powiadomieniami o wygaśnięciu klucza, prawdopodobnie lepiej byłoby zaimplementować je jawnie (bez zależności od wersji 2.8). Zobacz http://stackoverflow.com/questions/11810020/how-to-handle-session-expire-basing-redis/11815594#11815594 –
Dobrze, że 2.8 jest nadal RC nie jest problemem. Problem polega na tym, że Redis publikuje zdarzenia z kluczem, zamiast wartości hasła. A ponieważ potrzebujemy tego zachowania dla wszystkich powiadomień, również 2.6. potrzebujemy sposobu, aby powiedzieć Redis, aby przekazał nam cały obiekt w momencie uruchomienia zdarzenia, zamiast klucza. –
Nadal korzystam z rozwiązania opartego na Zset –