2013-06-12 25 views
37

In Redis è possibile impostare TTL (tempo di permanenza) non per un tasto specifico, ma per un membro per un set?TTL per un membro dell'insieme

Sto utilizzando una struttura per i tag proposta dalla documentazione Redis: i dati sono coppie chiave-valore semplici e le tag sono insiemi contenenti chiavi corrispondenti a ciascun tag, ad es.

> SETEX id:id_1 100 'Lorem ipsum' 
OK 
> SADD tag:tag_1 id:id_1 
(integer) 1 

La chiave id:id_1 scade come previsto, ma non vedo un modo efficiente per rimuovere l'elemento corrispondente dal set tag:tag_1.

Un modo in cui sono venuto è utilizzare un cron job contenente uno script che rimuova periodicamente le chiavi scadute dagli insiemi - aggiungendo tutti i nomi dei tag a un altro set e quindi iterando attraverso tutti i tag, quindi tutti gli id ​​corrispondenti a ciascuno etichettare e verificare se esiste la chiave corrispondente - in caso contrario, chiamando SREM.

Non penso che sarà un modo efficiente e mi piacerebbe eventualmente mantenere i tag il più puliti possibile, perché la dimensione dei set influenzerà probabilmente le prestazioni di ricerca di più tag (SINTER). Esiste un modo più "interno"?

risposta

15

Non è possibile scadere direttamente gli articoli in elenco, set o zset.

È necessario implementare un meccanismo per ricevere una notifica quando scade l'oggetto principale, in modo da poter mantenere i set corrispondenti di conseguenza.

vedere la risposta a questa domanda, penso che si applica al vostro caso d'uso (sostituire sessione id, e l'utente da tag):

Redis, session expiration, and reverse lookup

+0

Sì, è un modo decente e probabilmente gestirò il problema con qualcosa di simile. Poiché l'esistenza di membri scaduti nei set di tag non è un problema in nessun altro modo delle prestazioni, molto probabilmente userò un cron istead di un demone periodicamente - per limitare i sondaggi a un minimo sufficiente. – Przemek

20

No, questo non è possibile (e not planned either). L'approccio recommended consiste nell'utilizzare un set ordinato con punteggio impostato su timestamp e quindi rimuovere manualmente le chiavi scadute. Per richiedere chiavi non scadute, è possibile utilizzare ZRANGEBYSCORE $now +inf, per eliminare le chiavi scadute, ZREMRANGEBYSCORE -inf $now farà il trucco.

Nella mia applicazione, emetto semplicemente entrambi i comandi ogni volta che interrogo il set. Unisco anche questo con il tempo di scadenza (lungo) sul set stesso per eliminare definitivamente i set inutilizzati.

This article attraversa in modo più dettagliato.