複数のRedisデータベースのポイントは何ですか?


159

それで、ある特定の種類のデータでkeysコマンドを使用する必要がある場合があるため、redisに格納するデータを別々のデータベースにセグメント化したいと思った場所に来ました。 。

複数のデータベースにセグメント化しても、すべてがシングルスレッドであり、コアを1つしか使用できません。同じボックスでRedisの別のインスタンスを起動しただけの場合、追加のコアを使用できます。その上、Redisデータベースに名前を付けることも、より論理的な識別子を付けることもできません。つまり、これらすべてを踏まえて、必要な追加のデータベースごとにRedisの追加のインスタンスを起動するのではなく、なぜ/いつ複数のRedisデータベースを使用したいのでしょうか?また、関連して、Redisは追加するデータベースごとに追加のコアを使用しないのはなぜですか?データベース間でシングルスレッドになる利点は何ですか?


Node.jsアプリで、次のようにしてください---> module.exports = {"1": "your name for redis db one"、 "2": "your name for redis db two"、 "3": "your name for redis db three "}など、または必要に応じてキーと値を切り替えます
Alexander Mills

1
Redis 2.8.0以降では、KEYSの代わりにSCANを使用することをお勧めします。SCANは一度に少数の要素を反復処理するため(長期間サーバーをブロックしないため)。
TryHarder

回答:


85

原則として、同じインスタンス上のRedisデータベースは、RDBMSデータベースインスタンスのスキーマと同じです。

つまり、これらすべてを踏まえて、必要な追加のデータベースごとにRedisの追加のインスタンスを起動するのではなく、なぜ/いつ複数のRedisデータベースを使用したいのでしょうか?

同じredisインスタンスでredisデータベースを使用する明らかな利点が1つあり、それが管理です。アプリケーションごとに個別のインスタンスを起動し、3つのアプリがあるとします。これは、3つの個別のredisインスタンスであり、それぞれが本番環境のHAのスレーブを必要とする可能性が高いため、合計6つのインスタンスになります。管理の観点から見ると、すべてを監視したり、アップグレードやパッチを適用したりする必要があるため、これは非常に面倒になります。高I / Oでのredisのオーバーロードを計画していない場合は、スレーブを持つ単一インスタンスの方が簡単で、 SLAを満たしていれば管理が簡単です。


25
複数のRedisインスタンスが常に有効です。限目。異なるデータに対して並列クエリを実行します。あなたのCICDパイプラインはあなたのためのキャッシュ・クラスタを作成し、それを修正するのではなく、.....あなたはポイントを取得していない場合
Cmag

3
これはOPポイントに対処していません:(1)Redisが追加のデータベースごとに追加のコアを利用しようとしないのはなぜですか?(2)データベース間でシングルスレッドになる利点は何ですか?
2019年

93

1つのredisインスタンスで複数のデータベースを使用したくない場合。お気づきのとおり、複数のインスタンスを使用すると、複数のコアを利用できます。データベース選択を使用する場合は、アップグレード時にリファクタリングする必要があります。複数のインスタンスを監視および管理することは難しくなく、苦痛でもありません。

実際、インスタンスに基づいて分離することにより、各データベースではるかに優れたメトリックを取得できます。各インスタンスには、そのデータセグメントを反映する統計情報があり、より適切なチューニングと、より応答性が高く正確なモニタリングが可能になります。最新バージョンを使用し、インスタンスごとにデータを分離します。

ジョナトンが言ったように、keysコマンドを使用しないでください。キーインデックスを作成するだけで、はるかに優れたパフォーマンスが得られます。キーを追加するときはいつでも、キー名をセットに追加してください。keysコマンドは、戻るのにかなりの時間がかかるので、いったん拡大するとひどく役に立ちません。

アクセスパターンによって、データを構造化する方法を決定するようにします。データを思い通りに保存してから、後でアクセスして細かく調べる方法に取り組みます。パフォーマンスがはるかに向上し、データを消費するコードのほうがずっとクリーンでシンプルであることがよくあります。

シングルスレッドに関しては、redisは速度と原子性のために設計されていると考えてください。あるデータベースのデータを変更するアクションが別のデータベースで待機する必要はありませんが、そのアクションがダンプファイルに保存されている場合、またはスレーブでトランザクションを処理している場合はどうでしょうか。その時点で、並行処理プログラミングの雑草に入り始めます。

複数のインスタンスを使用することで、マルチスレッドの複雑さをより単純なメッセージパッシングスタイルシステムに変えます。


57
複数のデータベースの使用は非推奨ですか?その声明の参考資料を教えてください。Redisクラスターでは複数のデータベースはサポートされていませんが、複雑なマルチキーコマンドもサポートされておらず、非推奨ではありません。
ostergaard 2013年

27
Google Codeによると)Redisの「所有者」からのいくつかの(強力な)証拠
ケニーエビット2014

3
redis-clusterで複数のredis dbを使用することはできません。それを除いて、複数のデータベースはまだ事です。
コアダンプ2014

26
廃止されたステートメントの場合は-1。複数のデータベースは推奨されておらず、redis-clusterでサポートされていない場合がありますが、非推奨ではありません。
AgDude、2015年

1
@ the-real-billどのようにして「キーインデックスを作成」できますか?
Kees de Kooter 2017

57

Salvatore Sanfilippo(Redisの作成者)でさえ、Redisで複数のDBを使用することは悪い考えだと考えています。ここで彼のコメントを参照してください:

https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion

私はこれがどのように役立つかを理解していますが、残念ながら、Redisの複数のデータベースエラーはRedisの設計における私の最悪の決定であると考えています...実際の利益がまったくないため、内部が非常に複雑になります。実際には、データベースは、キーやVMのアクティブな期限切れなど、さまざまな理由で適切にスケーリングされません。文字列を使用してDB選択を実行できる場合、この機能がスケーラブルなO(1)辞書層として使用されていることがわかりますが、実際にはそうではありません。

DB番号を使用すると、デフォルトでいくつかのDBを使用することで、この機能とは何か、どのように使用できるかについてのコミュニケーションが向上します。いつかは複数のDBのサポートを完全にやめることができるといいのですが、この機能に多くの人が頼りになっているので、おそらく遅すぎるでしょう。


4
ちょっと待ってください、それで、DB選択を使用することは、実際に接頭辞を使用するよりも効率が悪いのですか?これがこの文章の意味ですか(誰かが説明してくれませんか)?「DB選択を文字列で実行できる場合、この機能がスケーラブルなO(1)辞書層として使用されていることがわかりますが、実際にはそうではありません。」
dvtan 2018

8
  1. 単一のインスタンスに複数のデータベースを配置することの利点は本当にわかりません。複数のサービスが同じデータベースサーバーを使用していると便利なので、キーの衝突を回避できます。

  2. KEYSコマンドはO(n)であり、適切にスケーリングされないため、コマンドを使用して構築することはお勧めしません。別の方法で達成できることのために何を使用していますか?のような機能KEYSが不可欠な場合、redisは最適な組み合わせではないかもしれません。

  3. 彼らはFAQでシングルスレッドサーバーの利点について言及していると思いますが、主なものは単純さです。実際の方法で同時実行性を気にする必要はありません。すべてのアクションがブロックされているため、2つのことで同時にデータベースを変更することはできません。理想的には、各サーバーのコアごとに1つ(または複数)のインスタンスがあり、一貫したハッシュアルゴリズム(またはプロキシ)を使用して、それらの間でキーを分割します。もちろん、一部の機能が失われます-パイプは同じサーバー上のものに対してのみ機能し、ソートが難しくなります。


2:への対応として、すべてのキーが必要な場合のみ、keysコマンドを使用します。私は、hgetallを使用するのと同じ方法で使用します。どちらもO(n)です。正規表現のキーの膨大なセットを検索する必要がある場合、キーは不適切ですが、一部のデータベースのすべてのキーに対して何らかの操作を実行する必要がある場合は問題ありません。3への対応:1つのデータベースでのシングルスレッドの利点を理解しています。あるデータベースでのアクションが別のデータベースでのアクションをブロックする必要がないため、多くのデータベースでそれを理解できません。
イーライ

3

私はメールアドレスのブラックリストを実装するためにredisを使用しており、ブラックリストのレベルごとに異なるTTL値を持っているので、同じインスタンスに異なるDBがあると非常に役立ちます。


1
現在、同じ問題に直面しています。データの異なる部分に異なるLRUポリシーを定義したいと考えています。これをどのように実装したかを教えてください。
user2717436 2017

@ user2717436私があなたのデータベースに関連しているかどうかはわかりませんが、異なるデータベースを異なるセットとして使用し、キーを挿入するときは常にキーのTTLを設定しています。redis.get(1)にブラックリストAがあり、キーをそこに設定するたびに、有効期限を5000に設定しました。そしてredis.get(2)にブラックリストBがあり、そこにキーを設定するたびに、expireを10000に設定しました
kommradHomer

2

Redisデータベースは、新しいバージョンのアプリケーションをデプロイするというまれなケースで使用できます。新しいバージョンでは、さまざまなエンティティを操作する必要があります。


1

1つのインスタンスで複数のデータベースを使用すると、次のシナリオで役立つ場合があります。

同じデータベースの異なるコピーを、リアルタイムデータを使用した本番、開発、またはテストに使用できます。同じ目的を達成するために、人々はレプリカを使用してredisインスタンスを複製することができます。ただし、前者の方法は、既存の実行中のプログラムが適切なデータベースを選択して目的のモードに切り替える方が簡単です。


1

私はこの質問が何年も前のものであることを知っていますが、複数のデータベースが役立つかもしれない別の理由があります。

お気に入りのクラウドプロバイダーの「クラウドRedis」を使用している場合、おそらく最小メモリサイズがあり、割り当てた分に対して支払いを行います。ただし、データセットがそれよりも小さい場合は、割り当てが少し無駄になるため、少しお金が無駄になります。

データベースを使用すると、同じRedisクラウドインスタンスを使用して、(たとえば)開発、UAT、プロダクション、またはアプリケーションの複数のインスタンス、またはその他のものにサービスを提供できます。したがって、割り当てられたメモリをより多く使用するため、コストが少し高くなります。効果的です。

私が見ているユースケースには、それぞれ200〜300Kを使用するアプリケーションのインスタンスがいくつかありますが、私のクラウドプロバイダーの最小割り当ては1Mです。10個のインスタンスを1つのRedisに統合することで、制限をなくすことができるため、Redisのホスティングコストを約90%節約できます。このアプローチには制限と問題があることを感謝していますが、言及する価値があると思いました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.