Redis
 sql >> база данни >  >> NoSQL >> Redis

Redis Update Sorted Set on Key Expire

Прав сте, че не можете да "сложите срок на валидност" на самата стойност на сортирания набор.

Но можете да работите с основния ключ и да уловите събитието, когато настъпи изтичането. Имате поне 2 начина да постигнете това:

  • Използване на известие за ключово пространство
  • Използване на Redis Gears

Уведомление за ключово пространство

С помощта на Key Space Notification можете да заснемете събитието EXPIRE, което ще изпрати съобщение PUBLISH, което след това можете да използвате.

Нека обясня основния поток:

Конфигуриране на известия

CONFIG SET notify-keyspace-events Ex
  • E :събития, случващи се на ключове
  • x :заснемане на изтекли събития

Сега вашата база данни ще публикува събитие на __key*__:* канал.

Така че можете да създадете услуга, която да слуша тези събития, които актуализират набора (пряко или косвено):

psubscribe __key*__:*

Ако имате приложение, което задава следната стойност и срок на валидност

set foo bar EX 5

Трябва да получите следното съобщение

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

Redis Gears

Използвайки Redis Gears, вие улавяте същото събитие (то се базира и на известия), но е по-лесно да пишете код директно във вашата Redis база данни.

Можете да създадете Gears, както следва:(това е скрипт на Python, използвам RedisInsight, за да го разположа в 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)

Вижте секцията, започната от cap = GB('KeysReader')

  • Това ще прослуша всеки ключ с изтичане на prefix='*' &eventTypes=['expired']
  • В случай на изтичане ще добави съобщение към 'expired:events' Redis Stream с помощта на командата XADD
  • След това вижте функцията proc = GB('StreamReader') които ще обработват потоците
  • всеки път, когато ново съобщение е в потока, то ще извиква process() функция.

Можете да добавите своята логика, за да актуализирате сортирания набор в тази функция. В моя пример току-що добавих изтекъл ключ към списък.

Позволете ми да се отклоня малко от първоначалния ви въпрос.

Изглежда, че използвате сортиран набор, за да създадете някаква форма на индексиране за вашите данни.

Ако случаят е такъв, трябва да погледнете RediSearch, друг Redis модул, който ви позволява да индексирате Hash полета и след това използвайте индекса, за да направите някои разширени заявки и агрегиране.

С RediSearch не е необходимо да добавяте код за управление на индекса, това се извършва автоматично от базата данни и можете да правите заявки в полетата.

Каня ви да разгледате:

  • Модулът RediSearch
  • Първо начало на RediSearch

Съжалявам, ако това не е причината да използвате сортиран набор, но мисля, че си струва да проверите, тъй като по този начин може да опрости много кода на приложението ви, ако управлявате индекс ръчно днес.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да активирам TLS за Redis 6 на Sidekiq?

  2. Redis срещу Memcached

  3. Как да хванем redis.serializer.SerializationException

  4. Пускане на Redis на Travis CI

  5. Как списъците на Redis могат да се използват за внедряване на чат система?