sql >> Database >  >> NoSQL >> Redis

Redis Update gesorteerde set bij verlopen sleutel

Je hebt gelijk, je kunt geen "vervaldatum" op de gesorteerde ingestelde waarde zelf zetten.

Maar u kunt met de hoofdsleutel werken en de gebeurtenis vastleggen wanneer de vervaldatum plaatsvindt. Je hebt minimaal 2 manieren om dit te bereiken:

  • Key Space-melding gebruiken
  • Redis Gears gebruiken

Key Space-melding

Met Key Space Notification kunt u de EXPIRE-gebeurtenis vastleggen die een PUBLISH-bericht verzendt dat u vervolgens kunt consumeren.

Laat me de basisstroom uitleggen:

Meldingen configureren

CONFIG SET notify-keyspace-events Ex
  • E :gebeurtenissen die plaatsvinden op toetsen
  • x :verlopen evenementen vastleggen

Nu zal uw database een evenement publiceren op de __key*__:* kanaal.

U kunt dus een service bouwen die naar deze gebeurtenissen luistert, de set bijwerken (direct of indirect):

psubscribe __key*__:*

Als u een toepassing heeft die de volgende waarde en vervaldatum instelt

set foo bar EX 5

U zou het volgende bericht moeten ontvangen

1) "pmessage"
2) "__key*__:*"
3) "[email protected]__:expired"
4) "foo"

Redis Gears

Met Redis Gears legt u dezelfde gebeurtenis vast (het is ook gebaseerd op melding), maar het is gemakkelijker om code rechtstreeks in uw Redis-database te schrijven.

U kunt als volgt een Gears maken:(dit is een Python-script, ik gebruik RedisInsight om het in Redis te implementeren)

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)

Kijk naar de sectie die is gestart door cap = GB('KeysReader')

  • Hiermee wordt geluisterd naar het verlopen van de sleutel prefix='*' &eventTypes=['expired']
  • In geval van verlopen wordt een bericht toegevoegd aan de 'expired:events' Redis Stream met het XADD-commando
  • Kijk dan naar de functie proc = GB('StreamReader') die de streams zal verwerken
  • elke keer dat er een nieuw bericht in de stream is, wordt het process() aangeroepen functie.

U kunt uw logica toevoegen om de gesorteerde set in deze functie bij te werken. In mijn voorbeeld heb ik zojuist de verlopen sleutel aan een lijst toegevoegd.

Laat me een beetje afwijken van uw oorspronkelijke vraag.

Het lijkt erop dat u Sorted Set gebruikt om een ​​of andere vorm van indexering voor uw gegevens te maken.

Als dit het geval is, moet u RediSearch bekijken, een andere Redis-module waarmee u Hash kunt indexeren velden en gebruik vervolgens de index om enkele geavanceerde zoekopdrachten en aggregatie uit te voeren.

Met RediSearch hoeft u geen code toe te voegen om de index te beheren, dit wordt automatisch gedaan door de database en u kunt op de velden zoeken.

Ik nodig je uit om te kijken naar:

  • De RediSearch-module
  • Aan de slag met RediSearch

Sorry als dit niet de reden is dat u Sorted Set gebruikt, maar ik denk dat het de moeite waard is om dit te controleren, omdat het uw toepassingscode aanzienlijk kan vereenvoudigen als u de index vandaag handmatig beheert.




  1. mongoexport JSON-parseerfout

  2. Hoe gaat Redis Streams om met het gebruik van al het beschikbare geheugen?

  3. Redis haalt alle waarde van de lijst op zonder iteratie en zonder popping

  4. Redis schildwacht-docker-afbeelding / Dockerfile