2014-11-11 13 views
6

Muszę przejrzeć pamięć podręczną Redis i sprawdzić, jaka jest wielkość naszej największej przechowywanej wartości. Mam doświadczenie z Pythonem lub mogę korzystać bezpośrednio z redis-cli. Czy istnieje sposób na powtórzenie wszystkich kluczy w bazie danych, abym mógł następnie sprawdzić rozmiar każdej wartości?Dowiedz się, jaki jest największy rozmiar ciągu znaków dla kluczy w bazie danych Redis.

Wygląda na to, że SCAN to sposób na iterację za pomocą klawiszy, ale wciąż pracuję nad tym, jak to wykorzystać, aby uzyskać rozmiary wartości i przechowywać maksimum w trakcie pracy.

Odpowiedz

7

Jako że wspomniałeś o redis-cli jako opcji, posiada ona funkcję kompilacji, która spełnia dokładnie to, o co prosisz (i wiele więcej).

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). 

Oto próbka wyjścia letni:

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) 

Można zobaczyć pełną Przykâadowa here

+0

Trudno to pokonać! Fajnie ... dzięki. –

0

myślę, że zorientowali się podstawową ideę, używając 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

który wygląda jak odpowiednie podejście, ale uwaga, że ​​GET jest tylko dla wartości łańcuchowych, podczas gdy klucze mogą zawierać inne struktury danych - być może sprawdzanie typu przed próbą uzyskania długości będzie b etter. Możesz także użyć DUMP do przybliżonego oszacowania rozmiaru, niezależnie od struktury danych. –

+0

Tak, zdałem sobie sprawę, że raz go uruchomię. Dodano obsługę błędów, aby po prostu przejść od tych, które nie są wartościami ciągowymi. Dzięki –

3

Oto rozwiązanie, które wykorzystuje 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 

ten powinien działać szybciej niż kod Pythona, które udostępniasz , Ben Roberts, szczególnie, że skrypt Lua używa STRLEN przez GET + Python's len.

+0

Wierzę, że nie możesz skanować z Lua ze względu na jego indeterministyczny charakter. –

+0

@ItamarHaber: Czy jest coś w dokumentacji na ten temat? Nie mogę znaleźć niczego, co zalecałoby użycie 'SCAN' zamiast skryptu Lua. –

+0

IIRC jest tylko domyślnie dorozumiana, ale spróbuj uruchomić skrypt, a przekonasz się - natychmiast otrzymasz błąd z tego powodu. Inną pułapką związaną z tym skryptem i, tak jak opisałem powyżej, jest błąd, jeśli klikniesz na klawisze inne niż ciąg. –

Powiązane problemy