web-dev-qa-db-ja.com

名前の長さはRedisのパフォーマンスに影響しますか?

Redisでは、たとえばset-allBooksBelongToUser:$userId

これは大丈夫ですか、それともパフォーマンスに影響しますか?

120
Running Turtle

あなたが使用することについて話している鍵は、それほど長くはありません。

指定するキーの例はセット用で、セットルックアップメソッドはO(1)です。セットに対するより複雑な操作(SDIFF、SUNION、SINTER)はO(N)です。おそらく、$userIdの設定は、長いキーを使用するよりも高価な操作でした。

Redisにはredis-benchmarkと呼ばれるベンチマークユーティリティが付属しています。src/ redis-benchmark.cの "GET"テストを変更してキーが "foo"になるようにすると、make installの後に短いキーテストを実行できます。

diff --git a/src/redis-benchmark.c b/src/redis-benchmark.c
--- a/src/redis-benchmark.c
+++ b/src/redis-benchmark.c
@@ -475,11 +475,11 @@
         benchmark("MSET (10 keys)",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"SET foo:Rand:000000000000 %s",data);
+        len = redisFormatCommand(&cmd,"SET foo %s",data);
         benchmark("SET",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"GET foo:Rand:000000000000");
+        len = redisFormatCommand(&cmd,"GET foo");
         benchmark("GET",cmd,len);
         free(cmd);

短いキー「foo」の3回の連続実行のGETテスト速度は次のとおりです。

59880.24 requests per second
58139.53 requests per second
58479.53 requests per second

ソースを再度変更し、キーを「set-allBooksBelongToUser:1234567890」に変更した後のGETテスト速度は次のとおりです。

60240.96 requests per second
60606.06 requests per second
58479.53 requests per second

再びキーを変更する「ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumlorem:1234567890」この提供します:

58479.53 requests per second
58139.53 requests per second
56179.77 requests per second

そのため、本当に長いキーでも、redisの速度に大きな影響はありません。これはGETでのO(1)操作です。より複雑な操作は、これに対する感度がさらに低くなります。

キーが保持している値を明確に識別するキーを持つことは、短縮キーから得られる非常に小さな速度のパフォーマンスをはるかに上回ると思います。

さらに詳しく知りたい場合は、redis-benchmarkユーティリティに-r [keyspacelen]パラメーターがあり、ランダムキーを作成できます(「:Rand:」が含まれている限り)、プレフィックスのサイズを増やすことができますテストコードを任意の長さにします。

181
Ted Naleid

Redisは、すべてのキーをメモリに保持するのが好きです。平均キー長が長いほど、メモリに保持できる量は少なくなります。そのため、はい、キーの長さはパフォーマンスに大きな影響を与える可能性がありますが、おそらくあなたが心配する方法ではそれほど重要ではありません。つまり、小さなキースペース(たとえば、メモリに簡単に収まるキースペース)では、128バイトのキーと16バイトのキーのパフォーマンスが劇的に異なることはありません。

26
bmatheny

この質問に確実に答えることはできません。しかし、私はそれについていくつか質問をして、いくつかの観察を提供することができます。

非常に長いキー(名前)および/または値が使用できる場合、全体的なパフォーマンスにパフォーマンスに影響を与えることは明らかだと思います。これらの影響は、クライアント、ネットワーク、またはサーバーにあります。したがって、最初の質問は次のようになります。

キーと値はRedisとクライアントの間でどれくらいの長さにできますか?

Rediskey lengthおよびlimitsで検索すると、 Redis vs. memcached に関する興味深いブログエントリが作成されます。あなたの質問に答えるために。そのブログエントリへの最初の応答は、Redisの作成者であるSalvatore Sanfilipoによって書かれたようです(昨秋の初め:2010年9月)。その下にある2つのコメントは、サルバトーレの Redis/memcached Benchmark にリンクしています。これは、元の "blagger"(匿名のようです)に応答した数日後に投稿されました。

これは質問に答えません(キーがどのくらいの長さになり、どの時点でパフォーマンスに検出可能な影響があるか)。ただし、質問へのアプローチについての手がかりが得られます。

これら両方の記事の著者は、コードを作成してテストし、結果をグラフ化しました。

あらゆる種類の推測を行うことができます。コードを見て、それを推論しようとすることができます。

ただし、この種の質問にアプローチする最も意味のある方法は、提案された使用パターンを測定するためのコードを作成することと、別の使用パターンをテストするためのコードを作成することです(たとえば、8文字から...長くしたい... 8キロバイト?)...そしてそれを測定します。

4
Jim Dennis