sql >> Database >  >> NoSQL >> Redis

Redis:om een ​​time-out in te stellen voor een sleutelwaardepaar in Set

Helaas niet. De "containers" van Redis (d.w.z. lijsten, hashes, sets en gesorteerde sets) ondersteunen geen vervaldatum per lid, hoewel deze functionaliteit in het verleden vaak is aangevraagd.

U kunt echter uw eigen logica implementeren om dat resultaat te bereiken. Er zijn verschillende mogelijke benaderingen om dit aan te pakken - hier is een voorbeeld. Gebruik in plaats van een set een gesorteerde set (ZSET) en stel de score van elk lid in op de vervaltijd met behulp van epoch-waarden. Dit type workflow kan bijvoorbeeld worden geïmplementeerd met behulp van een Lua-script. Gebruik iets als:

. om leden toe te voegen
redis.call('zadd', KEYS[1], os.time()+ARGV[1], ARGV[2])

en EVAL het met behulp van '1 a 60 1' en '1 a 120 2' als argumenten, volgens uw voorbeeld. Om de items uit de set daadwerkelijk te "verlopen", moet je ze verwijderen zodra hun tijd is verstreken. U kunt dat doen door een periodiek proces te implementeren dat uw lijst scant of door deze te openen. De volgende Lua kan bijvoorbeeld worden gebruikt om leden te laten vervallen:

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

en EVAL het met '1 a' als argumenten volgens uw voorbeeld.

EDIT:Hoe het bovenstaande te bereiken met 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. SCAN vs KEYS-prestaties in Redis

  2. MongoDB:wat is pooling en time-out van verbindingen?

  3. Hoe de prestaties van MongoDB te optimaliseren?

  4. MongoDB $dayOfWeek