sql >> Databasteknik >  >> NoSQL >> Redis

Redis:För att ställa in timeout för ett nyckelvärdespar i Set

Tyvärr inte. Redis "behållare" (d.v.s. listor, hash, uppsättningar och sorterade uppsättningar) stöder inte utgången per medlem, även om denna funktionalitet har efterfrågats många gånger tidigare.

Du kan dock implementera din egen logik för att uppnå det resultatet. Det finns flera möjliga tillvägagångssätt för att ta itu med detta - här är ett exempel. Istället för att använda en uppsättning, använd en sorterad uppsättning (ZSET) och ställ in varje medlems poäng till dess utgångstid med hjälp av epokvärden. Den här typen av arbetsflöde kan implementeras med till exempel ett Lua-skript. För att lägga till medlemmar använder du något som:

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

och EVALERA det med '1 a 60 1' och '1 a 120 2' som argument, enligt ditt exempel. För att faktiskt "förfalla" objekten från setet måste du radera dem när deras tid har gått. Du kan göra det antingen genom att implementera en periodisk process som skannar din lista eller när du kommer åt den. Till exempel kan följande Lua användas för att förfalla medlemmar:

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

och EVALERA det med '1 a' som argument enligt ditt exempel.

EDIT:Hur man uppnår ovanstående med 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. Hur får man samma rang för samma poäng i Redis ZRANK?

  2. ImportError:Ingen modul med namnet objectid

  3. Mongodb, sharding och flera fönstertjänster

  4. Mongodb kan inte starta