Lệnh Redis để có được tất cả các khóa có sẵn?


502

Có lệnh Redis để tìm nạp tất cả các khóa trong cơ sở dữ liệu không? Tôi đã thấy một số thư viện python-redis tìm nạp chúng. Nhưng đã tự hỏi nếu nó có thể từ redis-client.

Câu trả lời:


721

Hãy thử nhìn vào KEYSlệnh. KEYS *sẽ liệt kê tất cả các khóa được lưu trữ trong redis.

EDIT: xin lưu ý cảnh báo ở đầu trang KEYStài liệu:

Độ phức tạp thời gian: O (N) với N là số lượng khóa trong cơ sở dữ liệu, với giả định rằng các tên khóa trong cơ sở dữ liệu và mẫu đã cho có độ dài giới hạn.

CẬP NHẬT (V2.8 trở lên): SCAN là một giải pháp thay thế ưu việt KEYS, theo nghĩa là nó không chặn máy chủ cũng như không tiêu tốn tài nguyên đáng kể. Thích sử dụng nó.


96
Ví dụ sử dụng CLI:redis-cli keys "*"
XåpplI'-I0llwlg'I -

4
Khắc phục: Tất cả các lệnh redis là một luồng đơn và sẽ chặn máy chủ. Sự khác biệt duy nhất là KEYScó khả năng chặn máy chủ lâu hơn khi truy vấn một tập dữ liệu lớn
Leo

155

Cập nhật cho Redis 2.8 trở lên

Như đã lưu ý trong các nhận xét của các câu trả lời trước cho câu hỏi này, KEYSlà một lệnh nguy hiểm tiềm tàng vì máy chủ Redis của bạn sẽ không có sẵn để thực hiện các hoạt động khác trong khi nó phục vụ nó. Một rủi ro khác KEYSlà nó có thể tiêu thụ (phụ thuộc vào kích thước không gian phím của bạn) rất nhiều RAM để chuẩn bị bộ đệm phản hồi, do đó có thể làm cạn kiệt bộ nhớ máy chủ của bạn.

Phiên bản 2.8 của Redis đã giới thiệu dòng lệnh SCAN lịch sự hơn nhiều và có thể được sử dụng cho cùng mục đích.

CLI cũng cung cấp một cách hay để làm việc với nó:

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

59

Có thể xảy ra khi sử dụng redis-cli, bạn kết nối với máy chủ redis từ xa và sau đó là lệnh:

KEYS *

không hiển thị bất cứ điều gì, hoặc tốt hơn, nó hiển thị:
(empty list or set)

Nếu bạn hoàn toàn chắc chắn rằng máy chủ Redis bạn sử dụng là máy chủ bạn có dữ liệu, thì có thể redis-cli của bạn không kết nối với thể hiện cơ sở dữ liệu chính xác của Redis.

Như được đề cập trong các tài liệu Redis, các kết nối mới kết nối như mặc định với db 0 .

Trong trường hợp của tôi, KEYSlệnh không truy xuất kết quả vì cơ sở dữ liệu của tôi là 1. Để chọn db bạn muốn, hãy sử dụng CHỌN .
Db được xác định bởi một số nguyên.

SELECT 1
KEYS *

Tôi đăng thông tin này vì không có câu trả lời nào trước đây đang giải quyết vấn đề của tôi.


31

-> Nhận tất cả các khóa từ redis-cli

-redis 127.0.0.1:6379> keys *

-> Nhận danh sách các mẫu

-redis 127.0.0.1:6379> keys d??

Điều này sẽ tạo ra các khóa bắt đầu bằng 'd' với ba ký tự.

-redis 127.0.0.1:6379> keys *t*

Điều này sẽ nhận được các khóa có ký tự khớp 't' trong khóa

-> Đếm các phím từ dòng lệnh bằng

-redis-cli keys * |wc -l

-> Hoặc bạn có thể sử dụng dbsize

-redis-cli dbsize

Chỉ cần sao chép câu trả lời và thử. Nó đưa ra "lệnh không xác định 'khóa'". "Phím" không phải là lệnh, "phím" là. Hãy sửa key *t*cho keys *t*.
Kunal Dethe

Cảm ơn anh bạn vì thông tin đó. Đó là lỗi của tôi. Hiện tại tôi đang ở trên điện thoại di động. Tôi sẽ thay đổi lệnh đó.
denny

Chiếc áo rất hữu dụng này
Hassan Baig

19

Hãy xem Redis Cheat Sheet sau đây . Để có được một tập hợp các phím redis với redis-cli, tôi sử dụng lệnh

KEYS "prefix:*"

6

Có, bạn có thể nhận được tất cả các khóa bằng cách sử dụng này

var redis = require('redis');
redisClient = redis.createClient(redis.port, redis.host);    
  redisClient.keys('*example*', function (err, keys) {
})

4
Không chính xác những gì OP đã yêu cầu (redis-cli), nhưng cảm ơn vì đã chỉ ra điều này.
Herick

4

SCAN không yêu cầu khách hàng tải tất cả các khóa vào bộ nhớ như KEYS. SCAN cung cấp cho bạn một trình vòng lặp bạn có thể sử dụng. Tôi đã có một bản ghi 1B trong redis của mình và tôi không bao giờ có thể có đủ bộ nhớ để trả lại tất cả các khóa cùng một lúc.

Đây là một đoạn python để lấy tất cả các khóa từ cửa hàng khớp với một mẫu và xóa chúng:

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 * 

trong đó * là mẫu để liệt kê tất cả các khóa


2
Tôi đã phải trích dẫn ngôi sao, như sau:redis-cli -h <host> -p <port> keys '*'
tổng

3

Mẫu KEYS

Có sẵn từ 1.0.0.

Độ phức tạp thời gian: O (N) với N là số lượng khóa trong cơ sở dữ liệu, với giả định rằng các tên khóa trong cơ sở dữ liệu và mẫu đã cho có độ dài giới hạn.

Trả về tất cả các khóa khớp mẫu.

Cảnh báo: Lệnh này không được khuyến khích sử dụng vì có thể làm hỏng hiệu suất khi được thực thi đối với cơ sở dữ liệu lớn thay vì KEYS, bạn có thể sử dụng SCAN hoặc SETS .

Ví dụ về lệnh KEYS để sử dụng:

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

Nếu redis của bạn là một cụm, bạn có thể sử dụng tập lệnh này

#!/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

Nhận tất cả các phím trong Redis

Nhận tất cả các khóa bằng cách sử dụng tùy chọn --scan:

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

Liệt kê tất cả các khóa bằng lệnh KEYS:

$ redis-cli KEYS '*'

0

Để nhận được tất cả các khóa có sẵn trong máy chủ redis, bạn nên mở redis-cli và gõ: KEYS * Để nhận thêm trợ giúp, vui lòng truy cập trang này: Liên kết này



0

Nếu bạn đang sử dụng Laravel Framework thì bạn chỉ cần sử dụng:

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

print_r($allKeyList);

Trong PHP lõi:

$redis = new Redis();

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

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

print_r($allKeyList);

0

Bạn có thể chỉ cần kết nối với máy chủ redis của mình bằng redis-cli, chọn cơ sở dữ liệu của bạn và nhập KEYS *, hãy nhớ rằng nó sẽ cung cấp cho bạn tất cả các khóa có trong cơ sở dữ liệu redis đã chọn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.