Redisは単なるキャッシュですか?


255

私はいくつかのRedisドキュメントを読んでいて、http://try.redis-db.com/でチュートリアルを試しています。これまでのところ、VelocityやEnterprise Library Caching FrameworkなどのキャッシングテクノロジーとRedisの違いはわかりません

実際には、一意のキーを使用して、メモリ内のデータストアにオブジェクトを追加するだけです。リレーショナルセマンティクスはないようです...

何が欠けていますか?


3
redis.ioから:Redisはオープンソースの高度なKey-Valueストアです。キーには文字列、ハッシュ、リスト、セット、ソート済みセットを含めることができるため、データ構造サーバーと呼ばれることがよくあります。そうは言っても、StackOverflowのフォーマットに適合しないため、質問を閉じることに投票しました。
Linus Thiel

29
SO形式ではないことに同意します。どこがより適切だと思いますか?
Matt Evans

回答:


631

いいえ、Redisは単なるキャッシュではありません。

キャッシュと同様に、Redisはkey = valueペアを保存します。ただし、キャッシュとは異なり、Redisでは値を操作できます。Redisには、文字列、セット、ハッシュ、リスト、ソート済みセットの5つのデータ型があります。各データ型はさまざまな操作を公開します。

Redisを理解する最良の方法は、アプリケーションをデータベースに格納する方法を考えずにアプリケーションをモデル化することです。

StackOverflow.comを構築したいとしましょう。シンプルにするために、質問、回答、タグ、ユーザーが必要です。

質問、ユーザー、回答のモデリング

各オブジェクトはマップとしてモデル化できます。たとえば、質問はフィールド{id、title、date_asked、votes、asked_by、status}を持つマップです。同様に、回答はフィールド{id、question_id、answer_text、answered_by、votes、status}を持つマップです。同様に、ユーザーオブジェクトをモデル化できます。

これらの各オブジェクトは、ハッシュとしてRedisに直接格納できます。一意のIDを生成するには、atomic incrementコマンドを使用できます。このようなもの -

$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK

$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK

投票の処理

さて、誰かが質問または回答を賛成するたびに、あなたはこれを行う必要があります

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

ホームページの質問一覧

次に、ホームページに表示する最新の質問を保存します。.NETまたはJavaプログラムを作成している場合は、質問をリストに格納します。これがRedisにも保存する最良の方法であることがわかりました。

誰かが質問するたびに、そのIDをリストに追加します。

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

ここで、ホームページをレンダリングするときに、Redisに最新の25の質問をします。

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

IDを取得したので、パイプラインを使用してRedisからアイテムを取得し、ユーザーに表示します。

タグ別質問、投票順

次に、各タグの質問を取得します。ただし、SOを使用すると、上位の質問、新しい質問、未回答の質問を各タグの下に表示できます。

これをモデル化するために、Redisのソート済みセット機能を使用します。ソートセットを使用すると、スコアを各要素に関連付けることができます。その後、スコアに基づいて要素を取得できます。

Redisタグに対してこれを実行してみましょう

$ zadd questions_by_votes_tagged:redis 2 question:1 
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2 
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613 
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5 
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5 
1) "question:2"
2) "question:613"
3) "question:1"

ここで何をしたの?並べ替えられたセットに質問を追加し、各質問にスコア(投票数)を関連付けました。質問が賛成投票されるたびに、そのスコアをインクリメントします。ユーザーが[Redisのタグが付いた質問、投票順に並べ替え]をクリックすると、aを実行しzrevrangeて上位の質問に戻ります。

ページを更新しないリアルタイムの質問

そして最後に、ボーナス機能。質問ページを開いたままにすると、新しい質問が追加されたときにSOから通知されます。ここでRedisはどのように役立ちますか?

Redisにはpub-subモデルがあります。「channel_questions_tagged_redis」などのチャネルを作成できます。次に、subscribeユーザーを特定のチャネルに誘導します。新しい質問が追加されると、publishそのチャネルへのメッセージが表示されます。その後、すべてのユーザーがメッセージを受け取ります。メッセージを実際にブラウザーに配信するには、Webソケットや彗星などのWebテクノロジーを使用する必要がありますが、Redisはサーバー側のすべての配管を支援します。

持続性、信頼性など

キャッシュとは異なり、Redisはデータをハードディスクに保持します。より良い信頼性を提供するためにマスタースレーブ設定をすることができます。詳細については、こちらの永続性とレプリケーションに関するトピックをご覧ください-http://redis.io/documentation


15
また、PUB / SUB関連のコマンドを使用する非常にシンプルなサービスバスでもあります。
ジム・デニス

3
ユーザーごとに質問を取得するにはどうすればよいですか?questions:user:1のように、ユーザーごとに質問のリストを作成する必要がありますか、それともタグを使用する必要がありますか?
ディオゴアルベス

2
私がSOで見た非常に有用で詳細な説明
Trong Vu

5

単なるキャッシュではありません。

  • メモリ内のKey-Valueストレージ
  • 複数のデータ型(文字列、ハッシュ、リスト、セット、ソート済みセット、ビットマップ、ハイパーログ)をサポート
  • キャッシュデータを物理ストレージに格納する機能を提供します(必要な場合)。
  • サポートpub-subモデル
  • Redisキャッシュは高可用性(マスター/スレーブ)のレプリケーションを提供します

4

Redisには、超高速のluaスクリプトのような独自の機能があります。その実行時間は、Cコマンドの実行と同じです。これにより、ロックやセマフォなどの多くの高度なオブジェクトを処理するために必要な高度なRedisデータ操作の原子性ももたらされます。

Javaで分散アプリケーションを簡単に構築できるRedissonと呼ばれるメモリデータグリッドに基づくRedisがあります。分散のおかげでLockSemaphoreReadWriteLockCountDownLatchConcurrentMapオブジェクトや他の多くの。

クラウドで完全に機能し、AWS ElasticacheAWS Elasticache ClusterAzure Redis Cacheのサポートをサポート


1

実際には、相対データ表現(または任意のタイプのデータ表現)とデータベースロール(キャッシュ、永続的永続性など)の間に依存関係はありません。

Redisは本当のキャッシュに適していますが、単なるキャッシュではありません。高速で完全にメモリ内のデータベースです。ディスク上にデータを保持します。これはリレーショナルではなく、キーと値のストレージです。

生産で使用しています。Redisは、毎秒数千のリクエストを処理し、自然なライフサイクル全体を通して顧客のビジネスデータを維持するソフトウェアを構築するのに役立ちます。


0

Redisは、分散環境/マイクロサービスアーキテクチャに最適なキャッシュです。

高速で信頼性が高く、原子性と一貫性があり、セット、ハッシュ、リストなどのさまざまなデータ型があります。

私は過去1年間からそれを使用していますが、常にデータをキャッシュするために常に使用できるため、運用準備の整ったソリューションを非常に高速に提供する必要があり、パフォーマンス関連の問題が発生した場合、それは本当に救世主になります。


0

キャッシュサーバーであることに加えて、Redisは特にデータ構造サーバーです。データ構造はプログラムまたはアプリケーションの基礎であるため、データ構造サーバーの形でキャッシュであることは、大きな意味があります。SQLデータベースをストレージテクノロジーとして使用していて、リスト、ハッシュマップ、ランキングセットなどを作成する必要がある場合を考えてみてください。Redisは、これらの機能非常に単純な方法で直接提供できるため、開発を大幅に簡略化できます。

一方、データ構造サーバーはキャッシュの形式である必要はありません。Redisと互換性のあるプロジェクトがありますが、永続的なストレージエンジンがあります。


0

Redisは、文字列、ハッシュ、リスト、セット、範囲クエリを使用したソート済みセット、ビットマップ、ハイパーログ、radiusクエリおよびストリームを使用した地理空間インデックスなどのデータ構造をサポートしています。Redisには、レプリケーション、Luaスクリプト、LRUエビクション、トランザクション、さまざまなレベルのディスク上の永続性が組み込まれており、Redis Sentinelを介した高可用性とRedisクラスターによる自動パーティション化が提供されます。

Pythonでの実装

https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/

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