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

Precisione del comando redis dbsize

Direi che è legato alla scadenza della chiave.

I negozi chiave/valore come Redis o memcached non possono permettersi di definire un timer fisico per ogni oggetto alla scadenza. Ce ne sarebbero troppi. Al contrario, definiscono una struttura di dati per tenere traccia facilmente degli elementi in scadenza e multiplexare tutti gli eventi di scadenza in un unico timer fisico. Tendono anche ad attuare una strategia pigra per affrontare questi eventi.

Con Redis, quando un articolo scade, non succede nulla. Tuttavia, prima dell'accesso a ciascun articolo, viene effettuato sistematicamente un controllo per evitare la restituzione di articoli scaduti e potenzialmente eliminare l'articolo. Oltre a questa pigra strategia, ogni 100 ms viene attivato un algoritmo scavenger per far scadere fisicamente un numero di elementi (ovvero rimuoverli dal dizionario principale). Il numero di chiavi considerate ad ogni iterazione dipende dal carico di lavoro di scadenza (l'algoritmo è adattivo).

La conseguenza è che Redis potrebbe avere un backlog di articoli in scadenza in un determinato momento, quando si ha un flusso costante di eventi di scadenza.

Ora tornando alla domanda, il comando DBSIZE restituisce solo la dimensione del dizionario principale, quindi include elementi scaduti che non sono stati ancora rimossi. Il comando KEYS percorre l'intero dizionario, accedendo alle singole chiavi, quindi esclude tutti gli elementi scaduti. Il numero di articoli potrebbe quindi non corrispondere.