Ponowne polecenie, aby uzyskać wszystkie dostępne klucze?

501

Czy istnieje polecenie Redis do pobierania wszystkich kluczy z bazy danych? Widziałem niektóre biblioteki python-redis, które je pobierają. Zastanawiałem się jednak, czy jest to możliwe z poziomu klienta redis.

Lalith
źródło

Odpowiedzi:

720

Spróbuj spojrzeć na KEYSpolecenie. KEYS *wyświetli listę wszystkich kluczy przechowywanych w Redis.

EDYCJA: zwróć uwagę na ostrzeżenie u góry KEYSstrony dokumentacji:

Złożoność czasu: O (N), gdzie N jest liczbą kluczy w bazie danych, przy założeniu, że nazwy kluczy w bazie danych i podany wzorzec mają ograniczoną długość.

AKTUALIZACJA (wersja 2.8 lub nowsza): SCAN jest lepszą alternatywą KEYSw tym sensie, że nie blokuje serwera ani nie zużywa znacznych zasobów. Wolę z niego korzystać.

yojimbo87
źródło
96
Przykład użycia interfejsu CLI:redis-cli keys "*"
XåpplI'-I0llwlg'I -
4
Korekta: wszystkie polecenia redis są jednowątkowe i zablokują serwer. Jedyna różnica polega na tym, że KEYSmoże on blokować serwer na dłużej podczas odpytywania dużego zestawu danych
Leo
155

Zaktualizowano dla Redis 2.8 i nowszych

Jak zauważono w komentarzach do poprzednich odpowiedzi na to pytanie, KEYSjest to potencjalnie niebezpieczne polecenie, ponieważ Twój serwer Redis nie będzie mógł wykonywać innych operacji, dopóki go obsłuży. Innym ryzykiem KEYSjest to, że może on zużyć (w zależności od wielkości twojej przestrzeni kluczowej) dużo pamięci RAM do przygotowania bufora odpowiedzi, co może prawdopodobnie wyczerpać pamięć serwera.

Wersja 2.8 Redis wprowadziła rodzinę poleceń SCAN , które są o wiele bardziej uprzejme i mogą być używane w tym samym celu.

Interfejs CLI zapewnia również dobry sposób pracy z nim:

$ redis-cli --scan --pattern '*'
Itamar Haber
źródło
59

Może się zdarzyć, że używając redis-cli, połączysz się ze swoim zdalnym serwerem redis, a następnie polecenie:

KEYS *

nic nie pokazuje lub lepiej, pokazuje:
(empty list or set)

Jeśli masz absolutną pewność, że serwer Redis, którego używasz, to ten, na którym masz dane, być może twój redis-cli nie łączy się z prawidłową instancją bazy danych Redis.

Jak wspomniano w dokumentach Redis, nowe połączenia domyślnie łączą się z db 0 .

W moim przypadku KEYSpolecenie nie pobierało wyników, ponieważ moja baza danych miała wartość 1. Aby wybrać żądaną bazę danych, użyj WYBIERZ .
Db jest identyfikowany przez liczbę całkowitą.

SELECT 1
KEYS *

Publikuję te informacje, ponieważ żadna z poprzednich odpowiedzi nie rozwiązała mojego problemu.

Evhz
źródło
31

-> Zdobądź wszystkie klucze z redis-cli

-redis 127.0.0.1:6379> keys *

-> Uzyskaj listę wzorów

-redis 127.0.0.1:6379> keys d??

Spowoduje to wygenerowanie kluczy rozpoczynających się od „d” z trzema znakami.

-redis 127.0.0.1:6379> keys *t*

Otrzymasz klucze z dopasowanym znakiem „t” w kluczu

-> Policz klucze z linii poleceń według

-redis-cli keys * |wc -l

-> Lub możesz użyć dbsize

-redis-cli dbsize
denny
źródło
Właśnie skopiowałem odpowiedzi i spróbowałem. Dał „nieznany klawisz polecenia”. „klucz” to nie polecenie, „klucze” to. Popraw key *t*się keys *t*.
Kunal Dethe
Dzięki koleś za te informacje. To był mój błąd. Obecny jestem na telefonie komórkowym. Zmienię to polecenie eairlier.
denny
Bardzo przydatna ściągawka to
Hassan Baig
19

Spójrz na poniższy ściągawki Redis . Aby uzyskać podzbiór kluczy redis za pomocą redis-cli, używam polecenia

KEYS "prefix:*"
wami
źródło
6

Tak, możesz uzyskać wszystkie klucze za pomocą tego

var redis = require('redis');
redisClient = redis.createClient(redis.port, redis.host);    
  redisClient.keys('*example*', function (err, keys) {
})
Albin Mathew
źródło
4
Nie do końca to, o co prosił PO (redis-cli), ale dzięki za zwrócenie na to uwagi.
Herick,
4

SKANOWANIE nie wymaga od klienta ładowania wszystkich kluczy do pamięci, tak jak robi to KLUCZ. SCAN daje iterator, którego możesz użyć. Miałem rekordy 1B w mojej redis i nigdy nie mogłem uzyskać wystarczającej ilości pamięci, aby zwrócić wszystkie klucze naraz.

Oto fragment kodu python, aby pobrać wszystkie klucze ze sklepu pasujące do wzorca i usunąć je:

import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("key_pattern*"):
    print key
Patrick Collins
źródło
3
redis-cli -h <host> -p <port> keys * 

gdzie * to wzorzec listy wszystkich klawiszy

gobi
źródło
2
Musiałem zacytować gwiazdę w następujący sposób:redis-cli -h <host> -p <port> keys '*'
agregacja
3

Wzór KLUCZY

Dostępne od 1.0.0.

Złożoność czasu: O (N), gdzie N jest liczbą kluczy w bazie danych, przy założeniu, że nazwy kluczy w bazie danych i podany wzorzec mają ograniczoną długość.

Zwraca wszystkie klucze pasujące do wzorca.

Ostrzeżenie: Nie zaleca się używania tego polecenia, ponieważ może to zepsuć wydajność, gdy jest wykonywane na dużych bazach danych zamiast KLUCZY, których można użyć SKANOWANIA lub ZESTAWÓW .

Przykład użycia polecenia KLUCZE:

redis> MSET firstname Jack lastname Stuntman age 35
"OK"
redis> KEYS *name*
1) "lastname"
2) "firstname"
redis> KEYS a??
1) "age"
redis> KEYS *
1) "lastname"
2) "age"
3) "firstname"
anandchaugule
źródło
1

Jeśli Twoje redis jest klastrem, możesz użyć tego skryptu

#!/usr/bin/env bash
redis_list=("172.23.3.19:7001,172.23.3.19:7002,172.23.3.19:7003,172.23.3.19:7004,172.23.3.19:7005,172.23.3.19:7006")

arr=($(echo "$redis_list" | tr ',' '\n'))

for info in ${arr[@]}; do
  echo "start :${info}"
  redis_info=($(echo "$info" | tr ':' '\n'))
  ip=${redis_info[0]}
  port=${redis_info[1]}
  echo "ip="${ip}",port="${port}
  redis-cli -c -h $ip -p $port set laker$port '湖人总冠军'
  redis-cli -c -h $ip -p $port keys \*

done

echo "end"
bajt mamba
źródło
1

Zdobądź wszystkie klucze w Redis

Zdobądź wszystkie klucze, używając opcji --scan:

$ redis-cli --scan --pattern '*'

Wyświetl wszystkie klucze za pomocą polecenia KLUCZE:

$ redis-cli KEYS '*'
Netwons
źródło
0

Aby uzyskać wszystkie klucze dostępne na serwerze redis, należy otworzyć redis-cli i wpisać: KEYS * Aby uzyskać dodatkową pomoc, odwiedź tę stronę: Ten link

behzad babaei
źródło
0

Jeśli używasz Laravel Framework, możesz po prostu użyć tego:

$allKeyList = Redis::KEYS("*");

print_r($allKeyList);

W Core PHP:

$redis = new Redis();

$redis->connect('hostname', 6379);

$allKeyList = $redis->keys('*');

print_r($allKeyList);
Vinay Singh
źródło
0

Możesz po prostu połączyć się z serwerem redis za pomocą redis-cli, wybrać bazę danych i wpisać KLUCZE *, pamiętaj, że da ci wszystkie klucze obecne w wybranej bazie danych redis.

użytkownik1157635
źródło