Số lượng phím in trong Redis


164

Có cách nào để in số lượng phím trong Redis không?

Tôi nhận thức được

keys *

Nhưng điều đó có vẻ hơi nặng. - Cho rằng Redis là một cửa hàng giá trị quan trọng có lẽ đây là cách duy nhất để làm điều đó. Nhưng tôi vẫn muốn thấy một cái gì đó dọc theo dòng

count keys *

4
Có một yêu cầu kéo cho COUNT, mặc dù nó đã bị từ chối. github.com/antirez/redis/pull/32 antirez cũng nhận xét về KEYS
Alex

Tôi tự hỏi liệu họ đã không ủng hộ nó vì nó sẽ là O (n) - đoán điều này xác nhận nó.
andy khởi động

Câu trả lời:


199

Bạn có thể ban hành lệnh INFO, trả về thông tin và số liệu thống kê về máy chủ. Xem ở đây cho một đầu ra ví dụ.

Như đã đề cập trong các bình luận của mVChr, bạn có thể sử dụng info keyspacetrực tiếp trên redis-cli.


1
redis-cli INFO Keyspace | grep ^db
Hackaholic

164

DBSIZE trả về số lượng khóa và phân tích dễ dàng hơn.

Nhược điểm: nếu một khóa đã hết hạn, nó vẫn có thể được tính.

http://redis.io/commands/dbsize


3
Trong ví dụ đó, KEYS *đuổi khóa đã hết hạn. Ngoài ra Redis có thể chủ động đuổi một số khóa đã hết hạn, nhưng không nhất thiết là tất cả chúng.
seppo0010

45

CẢNH BÁO: Không chạy cái này trên máy sản xuất.

Trên hộp Linux:

redis-cli KEYS "*" | wc -l

Lưu ý: Như đã đề cập trong các bình luận bên dưới, đây là thao tác O (N), vì vậy trên một DB lớn có nhiều khóa bạn không nên sử dụng. Đối với việc triển khai nhỏ hơn, nó sẽ ổn.


3
Vô cùng tiện dụng và cũng cho phép bạn lọc các phím.
Nick Farina

25
Đó là thao tác O (n), có cách nào để thực hiện việc này trong O (1) không?
Zoozy

21
Không sử dụng trên cơ sở dữ liệu lớn trong môi trường sản xuất. Lệnh KEYS
Thần chú

4
Ai đó sẽ đọc nó, làm điều này trên một hộp sản xuất một ngày nào đó mà không nghĩ về nó và sau đó đẩy nó ra ngoài lề ... có lẽ đã xảy ra.
Stu Thompson

2
Điều này nên có từ chối trách nhiệm chỉ sử dụng trên các máy chủ không sản xuất. Nếu không, bạn nên sử dụng redis.io/commands/SCAN
whitfin

40

Để có được tổng số lượng khóa, sử dụng lệnh dưới đây:

127.0.0.1:6379> DBSIZE


14

Vì Redis 2.6, lua được hỗ trợ, bạn có thể nhận được số khóa ký tự đại diện như thế này

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

xem lệnh eval


8
Sử dụng KEYSđể đếm các phím (có hoặc không có tiền tố) giống như ném em bé ra ngoài bằng nước tắm.
Itamar Haber

1
Đối với người mới Lua: #trong mã này là toán tử độ dài .
yzorg

4

dbsize() trả về tổng số khóa

Bạn có thể nhanh chóng ước tính số lượng khóa khớp với một mẫu nhất định bằng cách lấy mẫu các khóa một cách ngẫu nhiên, sau đó kiểm tra phần nào của chúng khớp với mẫu đó.

Ví dụ trong trăn; đếm tất cả các khóa bắt đầu bằng 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

Thậm chí iter=100đưa ra một ước tính khá trong trường hợp của tôi, nhưng rất nhanh, so với keys prefix_.

Một cải tiến là lấy mẫu 1000 khóa cho mỗi yêu cầu, nhưng giữ tổng số, để sau hai yêu cầu bạn sẽ chia cho 2000, sau ba yêu cầu bạn sẽ chia cho 3000. Do đó, nếu ứng dụng của bạn quan tâm đến tổng số của các khóa khớp khá thường xuyên, sau đó mỗi lần nó sẽ càng ngày càng gần với giá trị thực.


1

Sau Redis 2.6, kết quả của lệnh INFO được chia theo các phần. Trong phần "không gian phím", có các trường "phím" và "khóa hết hạn" để cho biết có bao nhiêu phím ở đó.


4
Điều này LAF không đúng. Đây là đầu ra mẫu của phần: # Keyspace db0: Keys = 366, hết hạn = 366 Ở đây, 'phím' biểu thị tổng số không có khóa và 'hết hạn' cho biết không có khóa nào được đặt hết hạn. Về cơ bản, điều đó có nghĩa là họ có một bộ ttl và chúng được đặt hết hạn, không phải là chúng đã hết hạn.
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
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.