Есть ли способ, которым я мог бы установить ключ через N секунд? - PullRequest
0 голосов
/ 26 июня 2018

Я использую Python 3.6.1 :: Anaconda 4.4.0 (64-bit) и redis-cli 3.2.100 на Windows 10 до pip install redis==2.10.6

Я знаю, что есть способ установить ключ с истекшим сроком действия через N секунд после использования SETEX.

> SETEX s 10 "hi"
OK
> TTL s  # variable s still alive for 9 seconds
(integer) 9
> GET s
"hi"
> GET s  # ↑ within 10 seconds
"hi"     
> GET s  # ↓ 10 seconds later
(nil)

Но теперь мне нужен способ, которым я мог бы установить ключ через N секунд, например, SETAF, а также способ найти ключ, родившийся, например, через N секунд.AFTTL

> SETAF s 10 "hi"  # set s="hi" after 10 seconds
OK
> GET s
(nil)
> AFTTL s
(integer) 5
> GET s            # ↑ within 10 seconds
(nil)
> GET s            # ↓ 10 seconds later
"hi"

Ответы [ 2 ]

0 голосов
/ 07 июля 2018

Наконец, я использую следующий способ:

Сначала определите метод для удаления ключа в redis

r это redis.StrictRedis экземпляр

def remove_alarm(code, alarm_last): # alarm_last means how many seconds the key will keep alive
    time.sleep(alarm_last)
    r.srem('alarms', code)

В моей основной программе я устанавливаю ключ для повторного ввода имен сигналов и кода значений и запускаю поток для вызова remove_alarm

r.sadd('alarms', code)  # for code, it a paramater to my function
threading.Thread(target=remove_alarm, args=(code, alarm_last)).start()

Хотя ключ «тревоги» будет точно поддерживать в живых больше, чем дает alarm_last (начиная снить займет некоторое время), но для меня это полезно.

0 голосов
/ 26 июня 2018

Нет встроенного способа сделать это.Два метода, которые я могу предложить:

  1. Установите фиктивный ключ таймера в redis, используя SETEX, когда он истекает через N секунд, мы устанавливаем наш фактический ключ. Как мы узнаем, что срок действия ключа истек?Это возможно, если подписаться на события истечения срока действия redis .

EXPIRE генерирует событие expire, если для ключа задано значение expire, или событие expired каждый развремя положительного тайм-аута, установленного для ключа, приводит к удалению ключа (см. документацию EXPIRE для получения дополнительной информации).

Более простой способ (когда вам не нужно выполнять большую часть работы по синхронизации времени) - это использовать очередь задач, такую ​​как Celery , и создать метод Python, который устанавливает требуемый ключ.В Celery можно использовать декораторы и методы, такие как delay или apply_async , которые будут держать задачу в очереди в течение N секунд и выполнять ее после этого, чтобы ваш ключ был установлен в redis через N секунд.

apply_async (args = Нет, kwargs = Нет, task_id = Нет, продюсер = Нет, ссылка = Нет, link_error = Нет, тень = Нет, ** параметры) [источник] Применитьзадачи асинхронно, отправив сообщение.

Параметры:
args (Tuple) - позиционные аргументы для передачи в задачу.

kwargs (Dict) - ключевые аргументы для передачи в задачу.

countdown (float) - количество секунд в будущем, которое должно выполнить задание.По умолчанию немедленное выполнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...