Redis
 sql >> Database >  >> NoSQL >> Redis

Configurazione di redis per eliminare in modo coerente prima i dati meno recenti

AFAIK, non è possibile configurare Redis per eliminare in modo coerente prima i dati meno recenti.

Quando le opzioni *-ttl o *-lru vengono scelte in maxmemory-policy, Redis non utilizza un algoritmo esatto per selezionare le chiavi da rimuovere. Un algoritmo esatto richiederebbe un elenco aggiuntivo (per *-lru) o un heap aggiuntivo (per *-ttl) in memoria e un riferimento incrociato con la normale struttura dei dati del dizionario Redis. Sarebbe costoso in termini di consumo di memoria.

Con il meccanismo attuale, gli sfratti si verificano nel ciclo di eventi principale (ovvero i potenziali sfratti vengono controllati ad ogni iterazione del ciclo prima dell'esecuzione di ogni comando). Fino a quando la memoria non torna al di sotto del limite di memoria massima, Redis seleziona casualmente un campione di n chiavi e seleziona per la scadenza quella più inattiva (per *-lru) o quella che è la più vicina al suo limite di scadenza (per *-ttl). Per impostazione predefinita vengono considerati solo 3 campioni. Il risultato non è deterministico.

Un modo per aumentare la precisione di questo algoritmo e mitigare il problema è aumentare il numero di campioni considerati (parametro maxmemory-samples nel file di configurazione). Non impostarlo troppo alto, poiché consumerà un po' di CPU. È un compromesso tra precisione di rimozione e consumo di CPU.

Ora, se hai davvero bisogno di un comportamento coerente, una soluzione è implementare il tuo meccanismo di sfratto su Redis. Ad esempio, puoi aggiungere un elenco (per chiavi non aggiornabili) o un set ordinato (per chiavi aggiornabili) per tenere traccia delle chiavi che devono essere sfrattate per prime. Quindi, aggiungi un demone il cui scopo è controllare periodicamente (usando INFO) il consumo di memoria e interrogare le voci dell'elenco/set ordinato per rimuovere le chiavi pertinenti.

Tieni presente che altri sistemi di memorizzazione nella cache hanno il loro modo di affrontare questo problema. Ad esempio, con memcached, esiste una struttura LRU per lastra (che dipende dalle dimensioni dell'oggetto), quindi anche l'ordine di sfratto non è accurato (sebbene più deterministico rispetto a Redis in pratica).