いいえ、Redisは単なるキャッシュではありません。
キャッシュと同様に、Redisはキーと値のペアを格納します。ただし、キャッシュとは異なり、Redisでは値を操作できます。 Redisには、文字列、セット、ハッシュ、リスト、並べ替えられたセットの5つのデータ型があります。各データ型はさまざまな操作を公開します。
Redisを理解する最良の方法は、データベースにどのように保存するかを考えずにアプリケーションをモデル化することです。
StackOverflow.comを構築したいとしましょう。簡単にするために、質問、回答、タグ、ユーザーが必要です。
質問、ユーザー、回答のモデリング
各オブジェクトはマップとしてモデル化できます。たとえば、Questionは、フィールドが{id、title、date_asked、votes、ask_by、status}のマップです。同様に、Answerは、フィールド{id、question_id、answer_text、answered_by、votes、status}を持つマップです。同様に、ユーザーオブジェクトをモデル化できます。
これらの各オブジェクトは、ハッシュとしてRedisに直接保存できます。一意のIDを生成するには、atomicincrementコマンドを使用できます。このようなもの-
$ 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にタグ付けされた質問、投票で並べ替え]をクリックすると、zrevrange
を実行するだけです。 上位の質問に戻ります。
ページを更新せずにリアルタイムの質問
そして最後に、ボーナス機能。質問ページを開いたままにしておくと、新しい質問が追加されたときにSOから通知されます。 Redisはここでどのように役立ちますか?
Redisにはpub-subモデルがあります。 「channel_questions_tagged_redis」などのチャネルを作成できます。次に、subscribe
特定のチャネルへのユーザー。新しい質問が追加されたら、publish
します そのチャネルへのメッセージ。その後、すべてのユーザーにメッセージが表示されます。実際にメッセージをブラウザに配信するには、WebソケットやCometなどのWebテクノロジを使用する必要がありますが、Redisはサーバー側のすべての配管を支援します。
永続性、信頼性など
キャッシュとは異なり、Redisはデータをハードディスクに保持します。マスタースレーブを設定して、信頼性を高めることができます。詳細については、ここで永続性とレプリケーションのトピックを確認してください-http://redis.io/documentation