Прав сте, че не можете да "сложите срок на валидност" на самата стойност на сортирания набор.
Но можете да работите с основния ключ и да уловите събитието, когато настъпи изтичането. Имате поне 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
Съжалявам, ако това не е причината да използвате сортиран набор, но мисля, че си струва да проверите, тъй като по този начин може да опрости много кода на приложението ви, ако управлявате индекс ръчно днес.