Redis のドキュメントをいくつか読んで、http://try.redis-db.com/でチュートリアルを試しています。これまでのところ、Redis と、Velocity や Enterprise Library Caching Framework などのキャッシング テクノロジとの間に違いは見られません。
一意のキーを使用して、メモリ内のデータ ストアにオブジェクトを効果的に追加しているだけです。リレーショナルセマンティクスはないようです...
私は何が欠けていますか?
Redis のドキュメントをいくつか読んで、http://try.redis-db.com/でチュートリアルを試しています。これまでのところ、Redis と、Velocity や Enterprise Library Caching Framework などのキャッシング テクノロジとの間に違いは見られません。
一意のキーを使用して、メモリ内のデータ ストアにオブジェクトを効果的に追加しているだけです。リレーショナルセマンティクスはないようです...
私は何が欠けていますか?
いいえ、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にタグ付けされた質問、投票で並べ替え]をクリックすると、aを実行しzrevrange
て上位の質問に戻ります。
そして最後に、ボーナス機能。質問ページを開いたままにしておくと、新しい質問が追加されたときにSOから通知されます。Redisはここでどのように役立ちますか?
Redisにはpub-subモデルがあります。「channel_questions_tagged_redis」などのチャネルを作成できます。次にsubscribe
、特定のチャネルにユーザーを誘導します。新しい質問が追加されると、publish
そのチャネルにメッセージが送信されます。その後、すべてのユーザーにメッセージが表示されます。実際にメッセージをブラウザに配信するには、WebソケットやCometなどのWebテクノロジを使用する必要がありますが、Redisはサーバー側のすべての配管を支援します。
キャッシュとは異なり、Redisはデータをハードディスクに保持します。マスタースレーブを設定して、信頼性を高めることができます。詳細については、ここで永続性とレプリケーションのトピックを確認してください-http://redis.io/documentation
キャッシュだけではありません。
Redis には、超高速の lua スクリプトなどの独自の機能があります。その実行時間は、C コマンドの実行と同じです。これにより、ロックやセマフォなどの多くの高度なオブジェクトの作業に必要な洗練された Redis データ操作の原子性ももたらされます。
Redissonと呼ばれるメモリ データ グリッドに基づいた Redis があり、Java で分散アプリケーションを簡単に構築できます。Lock
分散された 、Semaphore
、ReadWriteLock
、CountDownLatch
、ConcurrentMap
オブジェクト、および他の多くのオブジェクトに感謝します。
クラウドで完全に動作し、AWS Elasticache、AWS Elasticache Cluster、およびAzure Redis Cacheのサポートをサポートします
実際には、相対データ表現 (または任意のタイプのデータ表現) とデータベースの役割 (キャッシュ、永続的な永続性など) の間に依存関係はありません。
Redis はキャッシュに適していますが、それは単なるキャッシュではありません。高速な完全インメモリ データベースです。ディスク上にデータを永続化します。これはリレーショナルではなく、キーと値のストレージです。
生産に使用しています。Redis は、毎秒数千のリクエストを処理し、自然なライフサイクル全体で顧客のビジネス データを保持するソフトウェアを構築するのに役立ちます。