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

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

Redis と、V​​elocity や Enterprise Library Caching Framework などのキャッシュ テクノロジの間に違いは見当たりません。実質的には、一意のキーを使用してオブジェクトをメモリ内データ ストアに追加しているだけです。リレーショナル セマンティクスはないようです...

何が足りないのでしょうか?

ベストアンサー1

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

キャッシュと同様に、Redis はキーと値のペアを保存します。ただし、キャッシュとは異なり、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 を生成するには、アトミック インクリメント コマンドを使用できます。次のようになります。

$ 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 の Sorted Set 機能を使用します。Sorted Set を使用すると、各要素にスコアを関連付けることができます。その後、スコアに基づいて要素を取得できます。

では、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 タグが付けられた質問 (投票数でソート)」をクリックすると、 を実行してzrevrange上位の質問を返します。

ページを更新せずにリアルタイムで質問する

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

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

持続性、信頼性など

キャッシュとは異なり、Redisはハードディスク上にデータを保持します。マスタースレーブ設定により信頼性を高めることができます。詳細については、永続性とレプリケーションのトピックを参照してください。ここ

おすすめ記事