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.

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


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 '*'

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.


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

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


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) {
})

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

3
redis-cli -h <host> -p <port> keys * 

gdzie * to wzorzec listy wszystkich klawiszy


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"

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"

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 '*'

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



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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.