2014-11-11 10 views
6

Ho bisogno di guardare il nostro cache Redis e vedere qual è la dimensione del nostro più grande valore memorizzato. Sono esperto con Python o posso usare direttamente lo redis-cli. C'è un modo per iterare tutte le chiavi nel database in modo da poter quindi controllare la dimensione di ogni valore?Individuare la dimensione massima delle stringhe per le chiavi nel database Redis

Sembra che SCAN sia il modo per scorrere i tasti, ma sto ancora lavorando su come utilizzarlo per ottenere le dimensioni dei valori e archiviare il massimo mentre procedo.

risposta

7

Poiché hai menzionato redis-cli come opzione, ha una funzione di build che fa praticamente quello che chiedi (e molto altro).

redis-cli --bigkeys

# Scanning the entire keyspace to find biggest keys as well as 
# average sizes per key type. You can use -i 0.1 to sleep 0.1 sec 
# per 100 SCAN commands (not usually needed). 

Ecco un esempio di output estivo:

Sampled 343799 keys in the keyspace! 
Total key length in bytes is 9556361 (avg len 27.80) 

Biggest string found '530f8dc7c7b3b:39:string:87929' has 500 bytes 
Biggest list found '530f8d5a17b26:9:list:11211' has 500 items 
Biggest set found '530f8da856e1e:75:set:65939' has 500 members 
Biggest hash found '530f8d619a0af:86:hash:16911' has 500 fields 
Biggest zset found '530f8d4a9ce31:45:zset:315' has 500 members 

68559 strings with 17136672 bytes (19.94% of keys, avg size 249.96) 
68986 lists with 17326343 items (20.07% of keys, avg size 251.16) 
68803 sets with 17236635 members (20.01% of keys, avg size 250.52) 
68622 hashs with 17272144 fields (19.96% of keys, avg size 251.70) 
68829 zsets with 17241902 members (20.02% of keys, avg size 250.50) 

È possibile visualizzare un esempio di output completo here

+0

Difficile da battere! Benissimo ... grazie. –

0

Credo di aver capito un'idea di base, utilizzando il redis-py library

import redis 
r= redis.StrictRedis(...) 
max_len = 0 
for k in r.scan_iter(): 
    try: 
    val_len = r.strlen(k) 
    except: 
    continue 
    if val_len > max_len: 
    max_len = val_len 
print max_len 
+1

che sembra il giusto approccio, ma è da notare che vengono è solo per i valori stringa, mentre le tue chiavi potrebbero contenere altre strutture di dati - magari controllando il tipo prima di provare a ottenere la lunghezza sarebbe b Etter. È inoltre possibile utilizzare DUMP per una stima approssimativa delle dimensioni indipendentemente dalla struttura dei dati. –

+0

Sì, ho capito che una volta l'ho eseguito. Aggiunta la gestione degli errori per passare solo da quelli che non sono valori stringa. Grazie –

3

Ecco una soluzione che utilizza redis's built-in scripting capabilities:

local longest 
local cursor = "0" 

repeat 
    local ret = redis.call("scan", cursor) 
    cursor = ret[1] 
    for _, key in ipairs(ret[2]) do 
    local length = redis.pcall("strlen", key) 
    if type(length) == "number" then 
     if longest == nil or length > longest then 
     longest = length 
     end 
    end 
    end 
until cursor == "0" 

return longest 

Questo dovrebbe correre più veloce del codice Python che fornisci , Ben Roberts, in particolare perché lo script Lua utilizza STRLEN su GET + Python len.

+0

Credo che tu non possa SCANTO da Lua a causa della sua natura indeterministica. –

+0

@ ItamarHaber: c'è qualcosa nella documentazione a riguardo? Non riesco a trovare nulla che suggerisca contro l'uso di 'SCAN' da invece di uno script Lua. –

+0

IIRC è implicito solo implicitamente, ma prova a eseguire lo script e lo vedrai da te - riceverai immediatamente un errore a causa di esso. Inoltre, un altro trabocchetto con quello script e come ho commentato sopra, è che si otterrà un errore se si preme le chiavi non stringa. –

Problemi correlati