私はいくつかのRedisドキュメントを読んでいて、http://try.redis-db.com/でチュートリアルを試しています。これまでのところ、VelocityやEnterprise Library Caching FrameworkなどのキャッシングテクノロジーとRedisの違いはわかりません
実際には、一意のキーを使用して、メモリ内のデータストアにオブジェクトを追加するだけです。リレーショナルセマンティクスはないようです...
何が欠けていますか?
私はいくつかのRedisドキュメントを読んでいて、http://try.redis-db.com/でチュートリアルを試しています。これまでのところ、VelocityやEnterprise Library Caching FrameworkなどのキャッシングテクノロジーとRedisの違いはわかりません
実際には、一意のキーを使用して、メモリ内のデータストアにオブジェクトを追加するだけです。リレーショナルセマンティクスはないようです...
何が欠けていますか?
回答:
いいえ、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のタグが付いた質問、投票順に並べ替え]をクリックすると、aを実行しzrevrange
て上位の質問に戻ります。
そして最後に、ボーナス機能。質問ページを開いたままにすると、新しい質問が追加されたときにSOから通知されます。ここでRedisはどのように役立ちますか?
Redisにはpub-subモデルがあります。「channel_questions_tagged_redis」などのチャネルを作成できます。次に、subscribe
ユーザーを特定のチャネルに誘導します。新しい質問が追加されると、publish
そのチャネルへのメッセージが表示されます。その後、すべてのユーザーがメッセージを受け取ります。メッセージを実際にブラウザーに配信するには、Webソケットや彗星などのWebテクノロジーを使用する必要がありますが、Redisはサーバー側のすべての配管を支援します。
キャッシュとは異なり、Redisはデータをハードディスクに保持します。より良い信頼性を提供するためにマスタースレーブ設定をすることができます。詳細については、こちらの永続性とレプリケーションに関するトピックをご覧ください-http://redis.io/documentation
Redisには、超高速のluaスクリプトのような独自の機能があります。その実行時間は、Cコマンドの実行と同じです。これにより、ロックやセマフォなどの多くの高度なオブジェクトを処理するために必要な高度なRedisデータ操作の原子性ももたらされます。
Javaで分散アプリケーションを簡単に構築できるRedissonと呼ばれるメモリデータグリッドに基づくRedisがあります。分散のおかげでLock
、Semaphore
、ReadWriteLock
、CountDownLatch
、ConcurrentMap
オブジェクトや他の多くの。
クラウドで完全に機能し、AWS Elasticache、AWS Elasticache Cluster、Azure Redis Cacheのサポートをサポート
Redisは、分散環境/マイクロサービスアーキテクチャに最適なキャッシュです。
高速で信頼性が高く、原子性と一貫性があり、セット、ハッシュ、リストなどのさまざまなデータ型があります。
私は過去1年間からそれを使用していますが、常にデータをキャッシュするために常に使用できるため、運用準備の整ったソリューションを非常に高速に提供する必要があり、パフォーマンス関連の問題が発生した場合、それは本当に救世主になります。
キャッシュサーバーであることに加えて、Redisは特にデータ構造サーバーです。データ構造はプログラムまたはアプリケーションの基礎であるため、データ構造サーバーの形でキャッシュであることは、大きな意味があります。SQLデータベースをストレージテクノロジーとして使用していて、リスト、ハッシュマップ、ランキングセットなどを作成する必要がある場合を考えてみてください。Redisは、これらの機能を非常に単純な方法で直接提供できるため、開発を大幅に簡略化できます。
一方、データ構造サーバーはキャッシュの形式である必要はありません。Redisと互換性のあるプロジェクトがありますが、永続的なストレージエンジンがあります。
Redisは、文字列、ハッシュ、リスト、セット、範囲クエリを使用したソート済みセット、ビットマップ、ハイパーログ、radiusクエリおよびストリームを使用した地理空間インデックスなどのデータ構造をサポートしています。Redisには、レプリケーション、Luaスクリプト、LRUエビクション、トランザクション、さまざまなレベルのディスク上の永続性が組み込まれており、Redis Sentinelを介した高可用性とRedisクラスターによる自動パーティション化が提供されます。
Pythonでの実装
https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/