sql >> データベース >  >> NoSQL >> Redis

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

    いいえ、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



    1. ASP.Net MVCサイトをロックせずにセッションを操作する方法はありますか?

    2. PHPアプリケーションにMySQLの代わりにRedisを使用するのはいつですか?

    3. mongodb集計で文字列の配列を返す方法

    4. 要素の正規表現配列を使用したMongoDBクエリ$in