web-dev-qa-db-ja.com

パターンに一致するキーの数

一致するパターンを持つすべてのキーの数を見つけるにはどうすればよいですか。

たとえば、2つのキーabc:random-text-1abc:random-text-2があります。ここでの一般的なパターンはabc:です。したがって、ここではカウントは2です。

Redisでこれを行うにはどうすればよいですか?

56
shanks

[〜#〜]免責事項[〜#〜]この古い答えが、数百万のキーを備えた本番システムを損傷しないことを願っています。それでも何らかの理由で実稼働環境でredisの一致するキーをカウントしたい場合は、 一致パターンでスキャンを使用する方が良い です。

単純にKEYSで検索し、redisクライアントで検索すると、一致するすべてのキーの番号リストが表示されますよね?

例えば.

KEYS abc:*

あなたにあげます

1) abc:random-text-1
2) abc:random-text-2

または、次を実行できます。

./redis-cli KEYS "abc:*" | wc -l

2出力として。

53
x_maras

ここ から:

eval "return #redis.pcall('keys', 'abc:*')" 0

O(1)ではありませんが、少なくともカウントはサーバー側で行われます。

54
warvariuc

パフォーマンスを考慮すると、KEYSの使用はお勧めしません

警告:KEYSは、実稼働環境でのみ細心の注意を払って使用する必要があるコマンドと見なしてください。大規模なデータベースに対して実行すると、パフォーマンスが低下する場合があります。このコマンドは、デバッグおよびキースペースレイアウトの変更などの特別な操作を目的としています。通常のアプリケーションコードではKEYSを使用しないでください。キースペースのサブセットでキーを見つける方法を探している場合は、セットの使用を検討してください。

Redisバージョン> 2.8.0の場合、 スキャン を検討することをお勧めします。ただし、使用するデータ型に依存します。

redis doc の簡単な例を次に示します。

redis 127.0.0.1:6379> sadd myset 1 2 3 foo foobar feelsgood
(integer) 6
redis 127.0.0.1:6379> sscan myset 0 match f*
1) "0"
2) 1) "foo"
   2) "feelsgood"
   3) "foobar"
20
Joshua

1回限りの場合は、x_marasで説明されているようにKEYSを使用できますが、KEYSは呼び出されるたびにデータベース全体のすべてのキーをスキャンするため、コードでは使用しないでください。

頻繁に実行したい場合、すべてのキーをスキャンすることは常に非効率的であるため、記述したとおりの「良い」方法はありません(SCANを使用しても、単にKEYSと同じことを行うため、より安全な方法)。

ただし、必要なパターンが事前にわかっている場合は、パターンに一致するすべてのキーのセットを保持できます。

SET abc:random-text-1 "blah"
SADD patterns:abc abc:randomtext-1

SET abc:random-text-2 "more blah"
SADD patterns:abc abc:randomtext-2

SCARD patterns:abc
// (integer) 2

SORT patterns:abc BY nosort GET *
// 1) "blah"
// 2) "more blah"
13
ben

コマンドラインから、redis-cli --scan --pattern 'abc:*' | wc -l

8
mushuweasel