web-dev-qa-db-ja.com

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

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

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

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

238
Matthew Evans

いいえ、Redisはキャッシュ以上のものです。

キャッシュのように、Redisはkey = valueペアを保存します。ただし、キャッシュとは異なり、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を生成するには、atomic incrementコマンドを使用できます。このようなもの -

$ 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ソケットや彗星などのWebテクノロジーを使用する必要がありますが、Redisはサーバー側のすべての配管を支援します。

永続性、信頼性など.

キャッシュとは異なり、Redisはデータをハードディスクに保持します。信頼性を向上させるために、マスタースレーブ設定を使用できます。詳細については、ここで永続性とレプリケーションのトピックを参照してください- http://redis.io/documentation

601

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

Redisson というRedisベースのメモリデータグリッドがあり、簡単にビルドできますJava上の分散アプリケーション。分散LockSemaphoreReadWriteLockCountDownLatchConcurrentMapオブジェクト、その他多数のオブジェクトに感謝​​します。

クラウドで完全に機能し、 AWS ElasticacheAWS Elasticache Cluster 、および Azure Redis Cache サポートをサポート

3

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

  • メモリ内のキーと値のストレージ
  • 複数のデータ型(文字列、ハッシュ、リスト、セット、ソート済みセット、ビットマップ、ハイパーログ)をサポート
  • キャッシュデータを物理ストレージに保存する機能を提供します(必要な場合)。
  • Pub-subモデルをサポート
  • Redisキャッシュは、高可用性(マスター/スレーブ)のレプリケーションを提供します
2
Pankaj Rawat

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

Redisはキャッシュに適していますが、それは本当ですが、単なるキャッシュではありません。高速で完全にメモリ内のデータベースです。ディスク上のデータを保持します。リレーショナルではなく、キーバリューストレージです。

本番環境で使用します。 Redisは、1秒間に数千のリクエストを処理し、自然なライフサイクル全体で顧客のビジネスデータを保持するソフトウェアの構築を支援します。

1
Denys

Redisは、分散環境/マイクロサービスアーキテクチャに最適なキャッシュです。

高速で信頼性が高く、原子性と一貫性を提供し、セット、ハッシュ、リストなどのデータ型の範囲を持っています。

私は過去1年間からそれを使用していますが、非常に迅速に生産準備の整ったソリューションを提供する必要があるとき、そして常にデータをキャッシュするためにそれを使用できるので、救い主として来ます。

0
Manvendra Jina

キャッシュサーバーであることに加えて、Redisは特にデータ構造サーバーです。データ構造はプログラムの基本であるため、データ構造サーバーの形式のキャッシュであることは大きな意味があります。つまり、applicationsです。ストレージデータベースとしてSQLデータベースを使用しており、リスト、ハッシュマップ、ランキングセットなどを作成する必要があると考えてください。これは一種の苦痛です。 Redisは、これらの機能を直接に非常に簡単な方法で提供できるため、開発が大幅に簡素化されます。

一方、データ構造サーバーはキャッシュの形式である必要はありません。 Redisと互換性のあるプロジェクトがありますが、永続的なストレージエンジンがあります。