1

私が何かをするなら

number_of_keys = redis_instance.keys('foo*').size

ただし、このリクエストには10​​,000個のキーがあります。プロセスを高速化する方法はあり.sizeますか?

問題は、10,000 個のキーを返すのは、実際には必要ないことを考えると少し遅く、無駄が多いことです。必要なのは、キーの数を確認することだけです。

編集: redis_instance がredis classのインスタンスであることを指定する必要があります。

4

2 に答える 2

3

したがって、他のことを言う前に、ドキュメントごとに:

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

したがって、ハッシュにカウントする必要があるものは何でもスローして、物事が乱雑にならないように HLEN を実行できる場合は、それが望ましい方法です。

警告はさておき、これは 100% Lua スクリプトとして実行する必要があります。ここでのボトルネックは間違いなくネットワーク スループットであり、Lua はこれを完全に解決します。Lua はスクリプト サーバー側全体を実行するため、すべてのキーを取得し、ネットワーク転送なしで Redis ボックスでそれらをすべてカウントし、カウントを送り返すだけです。スクリプトは単純です。

local all_keys = redis.call('KEYS', ARGV[1])
return #all_keys

次に、引数として「foo*」だけを使用して呼び出します。純粋な Redis では、(未テスト):

EVAL "your_script.lua" 0 'foo*'

これまで Ruby で Redis を使用したことがないので、それを Ruby に変換する必要があります。

于 2013-07-01T22:56:07.227 に答える
1

この状況では、カウンターを使用して開始カウントを格納し、一致するキーが追加されるたびにカウンターをインクリメントする方が適切です。どのカウンティング トリックが高速であるかに関係なく、キー スペースをスキャンして一致を探すことに依拠しています。INCRキー (例: ) で使用INCR starts_with_fooすると、より高速になり、最終的にはよりスケーラブルになります。

于 2013-06-30T15:54:17.847 に答える