[解決済み] Redisで名前の長さはパフォーマンスに影響しますか?
質問
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
キーをもう一度、"に変更します。 ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsem: 1234567890" とすると、このようになります。
58479.53 requests per second
58139.53 requests per second
56179.77 requests per second
つまり、本当に長いキーであっても、redisのスピードに大きな影響を与えないということです。 しかもこれはGETというO(1)の処理についてです。 もっと複雑な操作であれば、この影響はさらに小さくなるはずです。
どのような値を保持しているかが明確にわかるキーを持つことは、省略キーから得られるわずかな速度性能を大きく上回ると思います。
また、これをさらに推し進めると
-r [keyspacelen]
パラメータを使用すると、ランダムなキーを作成できます (ただし、':rand:' が含まれている必要があります)。
関連
-
Redis永続化RDBとAOFの実装プロセス
-
[解決済み] MISCONF RedisがRDBスナップショットを保存するように設定されている。
-
[解決済み] WSL Redis が発生しました システムが init システムとして systemd で起動されていません (PID 1)。操作できません[closed]。
-
[解決済み] Redisですべてを削除するには?
-
[解決済み] Redisを使用してパターンに一致するキーをアトミックに削除する方法
-
[解決済み] Express.jsとは?
-
[解決済み】Redisに使用されている基礎的なデータ構造は何ですか?
-
[解決済み】Redisデータベースを複数持つ意味とは?
-
[解決済み】JSONを表現するためのRedis文字列とRedisハッシュ:効率?
-
[解決済み】RedisはmongoDBよりどれくらい速いのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
RedisTemplatを使った簡単な分散ロックの実装の話
-
CentOS 8.4へのRedis 6.2.6の詳細なインストール方法
-
redis の RedissonLock が待ちロックを実装する方法
-
Redisによる分散ロック(setnx, getset, incr)の実装とタイムアウトの扱い方
-
redisプラグインbloom-filterをcentosにインストールする方法
-
redisでluaスクリプトを使用するためのチュートリアル
-
Redisにおけるビットマップの説明
-
Redisは携帯電話の認証コードを送信する機能を模倣している
-
Redisの文字列はどのように実装されているか
-
redis アプリケーション編 ---- スパイク、サインイン、セッション共有