2012-10-15 12 views
5

assumendo che tutte le chiavi in ​​un'istanza redis abbiano un set di scadenza, volatile-lru e allkeys-lru siano simili. Ma c'è una significativa differenza di prestazioni tra i 2 quando una chiave viene rimossa?Redis maxmemory-policy: prestazioni di volatile-lru vs allkeys-lru

Domanda bonus:

tra 2 distinte istanze configurate con la politica AllKeys-lru, aventi lo stesso contenuto e la stessa configurazione, eccetto:

  • grado A ha tutti sue chiavi con una scadenza set (diversi valori di scadenza)
  • grado B ha nessuno chiave con un scadono set

A parte il sovraccarico di memoria nell'istanza A a causa dei bit di scadenza, c'è una differenza di prestazioni tra il 2 quando una chiave viene rimossa dall'algoritmo allkeys-lru?

In entrambi i casi, sto parlando di istanze di redis 2.4.x su linux 64 bit con maxmemory = 3Gb con 4-5000 chiavi quando viene raggiunto il maxmemory (la maggior parte delle chiavi sono hash).

Grazie

risposta

12

redis.c, line 2311, unstable branch:

/* volatile-lru and allkeys-lru policy */ 
else if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU || 
    server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU) 
{ 
    for (k = 0; k < server.maxmemory_samples; k++) { 
     sds thiskey; 
     long thisval; 
     robj *o; 

     de = dictGetRandomKey(dict); 
     thiskey = dictGetKey(de); 
     /* When policy is volatile-lru we need an additonal lookup 
     * to locate the real key, as dict is set to db->expires. */ 
     if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU) 
      de = dictFind(db->dict, thiskey); 
     o = dictGetVal(de); 
     thisval = estimateObjectIdleTime(o); 

     /* Higher idle time is better candidate for deletion */ 
     if (bestkey == NULL || thisval > bestval) { 
      bestkey = thiskey; 
      bestval = thisval; 
     } 
    } 
} 

Sembra che a parità di allkeys-lru sarebbe strettamente parlando più veloce, ma non da un rilevante entità. È probabile che stiamo parlando di poco più di una frazione di un microsecondo più veloce.

La seconda domanda ha già ricevuto molte risposte, ma per ogni evenienza: sembra che non faccia alcuna differenza allkeys-lru quante chiavi sono impostate per scadere o se ce ne sono. Entrambe le istanze A e B nel tuo esempio vedrebbero le stesse prestazioni quando una chiave viene eliminata dall'algoritmo lru.

+0

Grazie per il vostro chiaro risponditore! – colinux

+0

Citare il codice per rispondere è sicuramente interessante :-) – antirez

+0

@antirez ottenere un commento da chi lo ha scritto è ancora più figo :) – Mahn