Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Aktualizacja Redis posortowana po wygaśnięciu klucza

Masz rację, nie możesz „ustawić wygaśnięcia” samej posortowanej wartości zestawu.

Ale możesz pracować z głównym kluczem i przechwytywać zdarzenie, gdy nastąpi wygaśnięcie. Masz co najmniej 2 sposoby, aby to osiągnąć:

  • Korzystanie z powiadomienia o spacji klawiszy
  • Korzystanie z narzędzi Redis

Powiadomienie o spacji klucza

Za pomocą Powiadomienia o przestrzeni na klucze możesz przechwycić zdarzenie EXPIRE, które wyśle ​​wiadomość PUBLISH, którą możesz następnie wykorzystać.

Pozwól, że wyjaśnię podstawowy przepływ:

Skonfiguruj powiadomienia

CONFIG SET notify-keyspace-events Ex
  • E :wydarzenia na klawiszach
  • x :przechwytywanie wygasłych wydarzeń

Teraz Twoja baza danych opublikuje zdarzenie na __key*__:* kanał.

Możesz więc zbudować usługę, która nasłuchuje tych zdarzeń, zaktualizuj zestaw (bezpośrednio lub pośrednio):

psubscribe __key*__:*

Jeśli masz aplikację, która ustawia następującą wartość i datę ważności

set foo bar EX 5

Powinieneś otrzymać następujący komunikat

1) "pmessage"
2) "__key*__:*"
3) "[email protected]__:expired"
4) "foo"

Koła zębate Redis

Używając Redis Gears, przechwytujesz to samo zdarzenie (opiera się to również na powiadomieniu), ale łatwiej jest napisać kod bezpośrednio w bazie danych Redis.

Możesz utworzyć Gears w następujący sposób:(jest to skrypt Pythona, używam RedisInsight do wdrożenia go w Redis)

def process(x):
    execute('LPUSH', 'expired:keys', x['value']['key']);

# Capture an expiration event and adds it to 'expired:events' stream
cap = GB('KeysReader')
cap.foreach(lambda x:
            execute('XADD', 'expired:events', '*', 'key', x['key']))
cap.register(prefix='*',
             mode='sync',
             eventTypes=['expired'],
             readValue=False)

# Consume new messages from expiration streams and process them somehow
proc = GB('StreamReader')
proc.foreach(process)
proc.register(prefix='expired:*',
              batch=100,
              duration=1, 
              trimStream = False)

Spójrz na sekcję rozpoczętą przez cap = GB('KeysReader')

  • To nasłuchuje każdego wygaśnięcia klucza prefix='*' &eventTypes=['expired']
  • W przypadku wygaśnięcia doda wiadomość do 'expired:events' Redis Stream za pomocą polecenia XADD
  • Następnie spójrz na funkcję proc = GB('StreamReader') które będą przetwarzać strumienie
  • za każdym razem, gdy w strumieniu pojawi się nowa wiadomość, wywoła ona funkcję process() funkcja.

Możesz dodać swoją logikę, aby zaktualizować posortowany zestaw w tej funkcji. W moim przykładzie właśnie dodałem wygasły klucz do listy.

Pozwól mi trochę odejść od twojego początkowego pytania.

Wygląda na to, że używasz Sorted Set do tworzenia jakiejś formy indeksowania swoich danych.

W takim przypadku powinieneś spojrzeć na RediSearch, kolejny moduł Redis, który umożliwia indeksowanie Hash pola, a następnie użyj indeksu do wykonania zaawansowanych zapytań i agregacji.

Dzięki RediSearch nie musisz dodawać żadnego kodu do zarządzania indeksem, odbywa się to automatycznie przez bazę danych i możesz wykonywać zapytania dotyczące pól.

Zapraszam do obejrzenia:

  • Moduł RediSearch
  • Rozpoczęcie RediSearch

Przepraszamy, jeśli nie jest to powód, dla którego używasz Sorted Set, ale myślę, że warto to sprawdzić, ponieważ może to znacznie uprościć kod aplikacji, jeśli dzisiaj zarządzasz indeksem ręcznie.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis zapisuje ciągi jako bufory w niektórych systemach operacyjnych, a nie w innych?

  2. Nie udało się uruchomić redis.service:Jednostka redis-server.service jest zamaskowana

  3. Ustawienie cache_store w inicjatorze

  4. Korzystanie z Redis SCAN w NODE

  5. jak skonfigurować różne ttl dla każdej pamięci podręcznej redis przy użyciu @cacheable w springboot2.0