Redisでは、たとえばset-allBooksBelongToUser:$userId
。
これは大丈夫ですか、それともパフォーマンスに影響しますか?
あなたが使用することについて話している鍵は、それほど長くはありません。
指定するキーの例はセット用で、セットルックアップメソッドは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:」が含まれている限り)、プレフィックスのサイズを増やすことができますテストコードを任意の長さにします。
Redisは、すべてのキーをメモリに保持するのが好きです。平均キー長が長いほど、メモリに保持できる量は少なくなります。そのため、はい、キーの長さはパフォーマンスに大きな影響を与える可能性がありますが、おそらくあなたが心配する方法ではそれほど重要ではありません。つまり、小さなキースペース(たとえば、メモリに簡単に収まるキースペース)では、128バイトのキーと16バイトのキーのパフォーマンスが劇的に異なることはありません。
この質問に確実に答えることはできません。しかし、私はそれについていくつか質問をして、いくつかの観察を提供することができます。
非常に長いキー(名前)および/または値が使用できる場合、全体的なパフォーマンスにパフォーマンスに影響を与えることは明らかだと思います。これらの影響は、クライアント、ネットワーク、またはサーバーにあります。したがって、最初の質問は次のようになります。
キーと値はRedisとクライアントの間でどれくらいの長さにできますか?
Redis、key lengthおよびlimitsで検索すると、 Redis vs. memcached に関する興味深いブログエントリが作成されます。あなたの質問に答えるために。そのブログエントリへの最初の応答は、Redisの作成者であるSalvatore Sanfilipoによって書かれたようです(昨秋の初め:2010年9月)。その下にある2つのコメントは、サルバトーレの Redis/memcached Benchmark にリンクしています。これは、元の "blagger"(匿名のようです)に応答した数日後に投稿されました。
これは質問に答えません(キーがどのくらいの長さになり、どの時点でパフォーマンスに検出可能な影響があるか)。ただし、質問へのアプローチについての手がかりが得られます。
これら両方の記事の著者は、コードを作成してテストし、結果をグラフ化しました。
あらゆる種類の推測を行うことができます。コードを見て、それを推論しようとすることができます。
ただし、この種の質問にアプローチする最も意味のある方法は、提案された使用パターンを測定するためのコードを作成することと、別の使用パターンをテストするためのコードを作成することです(たとえば、8文字から...長くしたい... 8キロバイト?)...そしてそれを測定します。