277

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

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

私は何が欠けていますか?

4

9 に答える 9

665

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

于 2012-04-13T11:45:37.183 に答える
5

キャッシュだけではありません。

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

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

Redissonと呼ばれるメモリ データ グリッドに基づいた Redis があり、Java で分散アプリケーションを簡単に構築できます。Lock分散された 、SemaphoreReadWriteLockCountDownLatchConcurrentMapオブジェクト、および他の多くのオブジェクトに感謝​​します。

クラウドで完全に動作し、AWS ElasticacheAWS Elasticache Cluster、およびAzure Redis Cacheのサポートをサポートします

于 2016-09-28T10:26:16.230 に答える
1

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

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

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

于 2016-09-01T18:58:55.937 に答える