Wydrukuj liczbę kluczy w Redis

164

Czy istnieje sposób wydrukowania liczby kluczy w Redis?

Jestem świadomy

keys *

Ale to wydaje się nieco ciężkie. - Biorąc pod uwagę, że Redis jest magazynem kluczowych wartości, być może jest to jedyny sposób, aby to zrobić. Ale nadal chciałbym zobaczyć coś podobnego do

count keys *
andy boot
źródło
4
Istnieje żądanie ściągnięcia dotyczące COUNT, ale zostało odrzucone. github.com/antirez/redis/pull/32 antirez również skomentował KEYS
Alex
Zastanawiałem się, czy nie poparli go tak, jak byłoby O (n) - chyba to potwierdza.
andy boot

Odpowiedzi:

199

Możesz wydać polecenie INFO, które zwróci informacje i statystyki dotyczące serwera. Zobacz tutaj przykładowe dane wyjściowe.

Jak wspomniano w komentarzach mVChr, możesz używać info keyspacebezpośrednio w redis-cli.

hymloth
źródło
1
redis-cli INFO Keyspace | grep ^db
Hackaholic
164

DBSIZE zwraca liczbę kluczy i jest łatwiejsza do przeanalizowania.

Wada: jeśli klucz wygasł, nadal może się liczyć.

http://redis.io/commands/dbsize

seppo0010
źródło
3
W tym przykładzie KEYS *wyklucza wygasły klucz. Redis może również aktywnie eksmitować niektóre wygasłe klucze, ale niekoniecznie wszystkie.
seppo0010
45

OSTRZEŻENIE: Nie uruchamiaj tego na maszynie produkcyjnej.

Na komputerze z systemem Linux:

redis-cli KEYS "*" | wc -l

Uwaga: Jak wspomniano w komentarzach poniżej, jest to operacja O (N), więc w dużej bazie danych z wieloma kluczami nie należy jej używać. W przypadku mniejszych wdrożeń powinno być dobrze.

reptilicus
źródło
3
Niezwykle poręczny i pozwala także filtrować klawisze.
Nick Farina
25
To jest operacja O (n), czy istnieje sposób, aby to zrobić w O (1)?
Zoozy
21
Nie używaj na dużej bazie danych w środowisku produkcyjnym. KEYS Command
Mantas
4
Ktoś to przeczyta, zrobi to któregoś dnia na pudełku produkcyjnym bez przemyślenia, a potem przepchnie to przez krawędź ... prawdopodobnie już się stało.
Stu Thompson
2
Powinno zawierać zastrzeżenie, którego można używać tylko na serwerach nieprodukcyjnych. W przeciwnym razie powinieneś użyć redis.io/commands/SCAN
whitfin
40

Aby uzyskać całkowitą liczbę kluczy, użyj poniższego polecenia:

127.0.0.1:6379> DBSIZE
Pankaj Chauhan
źródło
14

Od wersji Redis 2.6 lua jest obsługiwana, możesz uzyskać taką liczbę kluczy wieloznacznych

eval "return #redis.call('keys', 'prefix-*')" 0

zobacz polecenie eval

jingchao
źródło
8
Używanie KEYSdo liczenia kluczy (z prefiksem lub bez) jest jak wylewanie dziecka z kąpielą.
Itamar Haber,
1
Dla początkujących Lua: #w tym kodzie jest operatorem długości .
yzorg
4

dbsize() zwraca całkowitą liczbę kluczy.

Możesz szybko oszacować liczbę kluczy pasujących do danego wzorca, próbując losowo klucze, a następnie sprawdzając, jaka część z nich pasuje do wzorca.

Przykład w Pythonie; liczenie wszystkich kluczy zaczynających się od prefix_:

import redis
r = redis.StrictRedis(host = 'localhost', port=6379)
iter=1000
print 'Approximately', r.dbsize() * float(sum([r.randomkey().startswith('prefix_') for i in xrange(iter)])) / iter

Nawet iter=100daje przyzwoitą ocenę w moim przypadku, ale jest bardzo szybka w porównaniu do keys prefix_.

Ulepszeniem jest próbkowanie 1000 kluczy przy każdym żądaniu, ale zachowaj łączną liczbę, aby po dwóch żądaniach podzielić przez 2000, po trzech żądaniach podzielić przez 3000. Zatem, jeśli aplikacja jest zainteresowana łączną liczbą dopasowania kluczy dość często, to za każdym razem będzie coraz bliżej prawdziwej wartości.

osa
źródło
1

Po wersji Redis 2.6 wynik polecenia INFO jest dzielony na sekcje. W sekcji „przestrzeń kluczowa” znajdują się pola „klucze” i „wygasłe klucze”, które wskazują liczbę kluczy.

Jiankuan Xing
źródło
4
To nie jest poprawne. Oto przykładowe dane wyjściowe sekcji: # Keyspace db0: keys = 366, expires = 366 W tym przypadku „keys” oznacza całkowitą liczbę kluczy, a „expires” wskazuje liczbę kluczy z ustawionym terminem ważności. Zasadniczo oznacza to, że mają ustawione ttl i mają wygasnąć, a nie, że wygasły.
s1d
-1
eval "local count = redis.call('scan', 0, 'match', 'key:*:key', 'count', 10000) if count ~= 0 then return #count[2] end " 0

eval "local count = redis.call('sscan', 'key.key:all', 0, 'match', '*', 'count', 1000000) if count ~= 0 then return #count[2] end " 0
Laoch Tan
źródło