Redisのキーの数を出力する


164

Redisでキーの数を印刷する方法はありますか?

気がついた

keys *

しかし、それは少し重いようです。-Redisがキーバリューストアであることを考えれば、これが唯一の方法です。しかし、私はまだに沿って何かを見たいと思います

count keys *

4
COUNTのプルリクエストがありますが、拒否されました。github.com/antirez/redis/pull/32 antirezもキーにコメントしました
Alex

O(n)になるのでサポートしていないのではないかと思った-これはそれを裏付けていると思う。
アンディブート

回答:


199

サーバーに関する情報と統計を返すINFOコマンドを発行できます。出力例については、こちらをご覧ください。

mVChrのコメントで述べたようinfo keyspaceに、redis-cliで直接使用できます。


1
redis-cli INFO Keyspace | grep ^db
Hackaholic

164

DBSIZE キーの数を返し、解析が容易になります。

欠点:キーの有効期限が切れても、カウントされる可能性があります。

http://redis.io/commands/dbsize


3
その例でKEYS *は、期限切れのキーを削除します。また、Redis 一部の期限切れのキーを積極的に削除する可能性がありますが、必ずしもすべてのキーを削除する必要はありません。
seppo0010 2015

45

警告:これを運用マシンで実行しないでください。

Linuxボックス:

redis-cli KEYS "*" | wc -l

注:以下のコメントで述べているように、これはO(N)操作であるため、多くのキーを持つ大規模なDBでは、これを使用しないでください。小規模な展開の場合は問題ありません。


3
非常に便利で、キーでフィルタリングすることもできます。
Nick Farina

25
これはO(n)操作ですが、O(1)でこれを行う方法はありますか?
Zoozy 2013

21
本番環境の大きなデータベースでは使用しないでください。KEYSコマンド
Mantas 2014年

4
誰かがこれを読んで、いつかプロダクションボックスでこれを何も考えずにやって、それを端から端まで押しやろうとしています...おそらくおそらくすでに起こっています。
Stu Thompson

2
これには、非運用サーバーでのみ使用するための免責事項があります。それ以外の場合は、redis.io / commands
SCAN



14

Redis 2.6以降、luaがサポートされているため、次のようなワイルドカードキーの数を取得できます。

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

evalコマンドを参照


8
KEYSキーを数えるために(接頭辞の有無にかかわらず)を使用することは、赤ちゃんを風呂水で投げ出すようなものです。
Itamar Haber

1
Lua初心者の場合:#このコードのは、長さ演算子です。
yzorg 2018

4

dbsize() キーの総数を返します。

キーをランダムにサンプリングし、パターンに一致するキーの割合を確認することにより、特定のパターンに一致するキーの数をすばやく推定できます。

Pythonでの例。で始まるすべてのキーを数える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

iter=100私の場合はまともな見積もりを出すことさえできますが、に比べて非常に高速keys prefix_です。

改善点は、すべてのリクエストで1000個のキーをサンプリングすることですが、合計数を保持することで、2つのリクエスト後に2000で割り、3つのリクエスト後に3000で割ります。したがって、アプリケーションが合計数に関心がある場合かなり頻繁にキーを照合することで、その後は常に真の値にますます近づきます。


1

Redis 2.6以降、INFOコマンドの結果はセクションごとに分割されます。「keyspace」セクションには、「keys」フィールドと「expired keys」フィールドがあり、そこにいくつのキーがあるかを示します。


4
これは正しくありません。これは、セクションのサンプル出力です。#Keyspace db0:keys = 366、expires = 366ここで、「keys」はキーの総数を示し、「expires」は有効期限が設定されたキーの数を示します。基本的に、それらはttlセットを持ち、期限切れに設定されていることを意味し、期限切れになっているわけではありません。
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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.