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

Redis:За да зададете изчакване за двойка стойности на ключ в Set

За съжаление не. „Контейнерите“ на Redis (т.е. списъци, хешове, набори и сортирани набори) не поддържат изтичане на член, въпреки че тази функционалност е била заявена много пъти в миналото.

Можете обаче да приложите своя собствена логика, за да постигнете този резултат. Има няколко възможни подхода за справяне с това - ето един пример. Вместо да използвате набор, използвайте сортиран набор (ZSET) и задайте резултата на всеки член за времето му на изтичане, като използвате стойности за епоха. Този тип работен процес може да бъде реализиран с помощта на Lua скрипт например. За да добавите членове, използвайте нещо като:

redis.call('zadd', KEYS[1], os.time()+ARGV[1], ARGV[2])

и го EVAL, използвайки '1 a 60 1' и '1 a 120 2' като аргументи, според вашия пример. За да „изтече“ елементите от комплекта, ще трябва да ги изтриете, след като времето им изтече. Можете да направите това или чрез прилагане на периодичен процес, който сканира вашия списък, или при достъп до него. Например следната Lua може да се използва за изтичане на членове:

redis.call('zremrangebyscore', KEYS[1], '-inf', os.time())

и го EVAL, използвайки '1 a' като аргументи според вашия пример.

РЕДАКТИРАНЕ:Как да постигнете горното с помощта на Python

import time
import redis

def add(r, key, ttl, member):
    r.zadd(key, member, int(time.time()+ttl))

def expire(r, key):
    r.zremrangebyscore(key, '-inf', int(time.time()))

...

r = redis.Redis()
add(r, 'a', 1, 60)
add(r, 'a', 2, 120)

# periodically or before every operation do
expire(r, 'a')



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis, слушане на pubsub събития и превръщането им в поток за по-надеждно потребление

  2. Redis Cache в .NET Core 3 изисква ли използването на пакета Stack Exchange?

  3. Как StackExchange.Redis използва множество крайни точки и връзки?

  4. RedisClient LUA API

  5. Определяне защо Redis получава SIGTERM на всяка минута или две