Redis の 16 の一般的な使用シナリオ

1.キャッシュ  

インメモリ データベースとして Key-Value 、Redis はデータ キャッシュとして頭に浮かぶ最初のアプリケーション シナリオです。 stringRedis を使用してデータをキャッシュするのは非常に簡単で、シリアル化されたオブジェクトを型によって保存するだけで済みますが、注意が必要な点がいくつかあります。

  •      異なるオブジェクトのキーが繰り返されないようにする必要があり、キーはできるだけ短くする必要があります.一般に、クラス名(テーブル名)と主キーは連結に使用されます.
  •      優れたシリアル化方法を選択することも非常に重要です。目的は、シリアル化の効率を向上させ、メモリ使用量を削減することです。
  •      キャッシュの内容とデータベースの間の整合性には、一般に次の 2 つのアプローチがあります。 

               1: データベース クエリの後にのみオブジェクトをキャッシュに入れます。オブジェクトが変更または削除されると、対応するキャッシュが直接クリアされます (または有効期限が切れるように設定されます)。

              2: データベースを追加してクエリを実行した後、オブジェクトをキャッシュに入れ、変更後にキャッシュを更新し、削除後に対応するキャッシュをクリアします (または期限切れに設定します)。

2. データの共有と配布

Redis は複数のアプリケーション間で共有できる分散型の独立したサービスであるため、文字列型

例: 分散セッション

<dependency> 
 <groupId>org.springframework.session</groupId> 
 <artifactId>spring-session-data-redis</artifactId> 
</dependency>

3. 分散ロック

現在、分散環境では、Java に付属する単一のロックは適用できなくなりました。Redis バージョン 2.6.12 以降、文字列の set コマンドはいくつかのパラメーターを追加します。

:キーの有効期限を設定します(秒単位)

PX : キーの有効期限を設定します (ミリ秒)

NX : キーが存在しない場合にのみキーを設定します。SET キー値 NX は SETNX キー値と同等です 

XX : キーがすでに存在する場合にのみキーを設定します。

この操作はアトミックであるため、分散ロックは次のように簡単に実装できます。

  set lock_key locked NX EX 1 

       この操作がfalseを返す場合は、キーの追加が失敗したこと、つまり、誰かが現在ロックを占有していることを意味します。そしてtrueが返ってきたら、ロックを取得して操作を続行できることを意味し、操作後に del コマンドでロックを解除します。また、何らかの理由でプログラムがロックを解除しなくても、設定された有効期限により1秒後に自動的にロックが解除され、他のプログラムの動作に影響を与えることはありません。
 

4.グローバルID

int 型、incrby、アトミック性の使用

incrby userid 1000

sub-database と sub-table のシーンで、一度に 1 つのセクションを取得します

5.カウンター

int 型、incr メソッド

例:読んだ記事の数、Weibo のいいね! の数、一定の遅延は許容されます。最初に Redis に書き込み、次に定期的にデータベースに同期します。

カウント機能はRedisの最も適した使用シナリオの1つであるはずです。なぜなら、その高頻度の読み取りと書き込みの特性は、Redisのインメモリデータベースとしての効率を最大限に活用できるからです。In the data structure of Redis, string, hash, and sorted set all provide the incr method for atomic self-increment operations. 次の例は、それぞれの使用シナリオを示しています:

           1: アプリケーションが 1 日あたりの登録ユーザー数を表示する必要がある場合、文字列をカウンターとして使用し、REGISTERED_COUNT_TODAY という名前のキーを設定し、ユーザーが登録するたびに、初期化中に有効期限を午前 0:00 に設定できます。 incr コマンドを使用してキーを 1 増やします。同時に、毎日 0:00 以降、キーの有効期限が切れるため、カウンターは値をゼロにクリアします
          2: 各マイクロブログには、いいね数、コメント数、リツイート数、ビュー数の 4 つの属性があります. このとき、ハッシュを使用してカウントする方がよい. カウンターのキーは weibo:weibo_id に設定されています,ハッシュのフィールドは like_number、comment_number、forward_number、view_number です。対応する操作の後、ハッシュのフィールドは hincrby によって自動インクリメントされます。
          3: アプリケーションにリーダーボードを投稿する機能がある場合は、ソートされたセットを選択し、セットのキーを POST_RANK に設定します。ユーザーが投稿するとき、zincrby を使用してユーザー ID のスコアを 1 増やしますソートされたセットは再ソートされ、リーダーボード上のユーザーの位置がリアルタイムで更新されます。
 

6.電流制限

int 型、incr メソッド

訪問者の IP およびその他の情報をキーとして使用し、訪問ごとに 1 回カウントを増やし、数を超えた場合は false を返します

7. ビット統計 

String 型の Bitcount (1.6.6 ビットマップ データ構造の概要)

文字は 8 ビット バイナリで格納されます

set k1 a
setbit k1 6 1
setbit k1 7 0
get k1 
/* 6 7 代表的a的二进制位的修改
a 对应的ASCII码是97,转换为二进制数据是01100001
b 对应的ASCII码是98,转换为二进制数据是01100010

因为bit非常节省空间(1 MB=8388608 bit),可以用来做大数据量的统计。
*/

8.タイムライン

   list双方向リンクリストとして、キューとしてだけでなく使用できます。重ねて使えば共通の時間軸にもなります。ユーザーが微博の投稿を完了すると、キーlpushに保存されLATEST_WEIBO最新の微博を取得できます。listlrange

9. メッセージキュー

       Redis でのリストのデータ構造の実装は、二重にリンクされたリストであるため、メッセージ キュー (プロデューサー/コンシューマー モデル) に簡単に適用できます。メッセージのプロデューサーは、lpush を介してメッセージをリストに入れるだけでよく、コンシューマーは rpop を介してメッセージを取り出すことができ、メッセージの順序を保証できます。

        優先度の高いメッセージ キューを実装する必要がある場合は、ソート セットを選択することもできます。また、pub/sub 機能は、メッセージのパブリッシャー/サブスクライバー モデルとしても使用できます。いずれの方法を使用しても、Redis には永続化機能があるため、サーバー障害によるメッセージの損失を心配する必要はありません。

リストは 2 つのブロッキング ポップ操作を提供します: blpop/brpop、タイムアウトを設定可能

  • blpop: blpop key1 timeout は、リストの最初の要素を削除して取得します。リストに要素がない場合は、タイムアウトを待つかポップアップ要素が見つかるまでリストをブロックします。
  • brpop: brpop key1 timeout は、リストの最後の要素を削除して取得します。リストに要素がない場合は、タイムアウトを待つか、ポップアップ要素が見つかるまでリストをブロックします

上記の操作。実際、これは Java のブロッキング キューです。学べば学ぶほど。学習コストが低いほど

  • キュー: 高度で最初に分割: rpush blpop、左が頭、右が尾、右がキューに入り、左がキューを出る
  • スタック: 先入れ先出し: rpush brpop

10.くじ引き 

セット構造の無秩序を使用して、Spop を介して ( Redis Spop コマンドを使用して、コレクション内の指定されたキーの 1 つ以上のランダムな要素を削除し、削除された要素は削除後に返されます。) ランダムに値を取得します。

redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SPOP myset
"one"
redis> SMEMBERS myset
1) "three"
2) "two"
redis> SADD myset "four"
(integer) 1
redis> SADD myset "five"
(integer) 1
redis> SPOP myset 3
1) "five"
2) "four"
3) "two"
redis> SMEMBERS myset
1) "three"
redis> 

 11. いいね、サインイン、チェックイン

上記のWeibo IDをt1001、ユーザーIDをu3001とすると

like:t1001 を使用して、t1001 の Weibo が好きなすべてのユーザーを維持します

この Weibo が気に入った: sadd like:t1001 u3001
気に入らなかった:srem
like:t1001 u3001 Liked :sismember like:t1001 u3001
気に入ったすべてのユーザー:smembers like:t1001いいね
の数:scard like:

12 製品ラベル 

通常どおり、tags:i5001 を使用して、製品のすべてのタグを維持します。

  • sadd タグ:i5001 写真は鮮明で繊細です
  • sadd タグ: i5001 トゥルー カラー クリア ディスプレイ
  • sadd タグ: i5001 プロセスを極端に

13. 友達関係、ユーザーの注目度、推薦モデル

ユーザー A の場合、そのフォロワーとファンのユーザー ID を 2 つのセットで保存します。

A:follow: A のすべてのフォローされたユーザー ID を保存します

A:follower: A のすべてのフォロワーのユーザー ID を保存します

次に、sinter コマンドを使用して、A:follow と A:follower の交点に従って、A で相互にフォローしているユーザーを取得できます。A が別のユーザー B のホームページに入ると、A:follow と B:follow の交点が A と B の共同フォーカスであり、A:follow と B:follower の交点は、A がフォローしているユーザーも B をフォローしていることを意味します。

14.リーダーボード

ソートされたセット (ordered set) と人気を計算するアルゴリズムを使用すると、簡単に人気リーダーボードを作成でき、zrevrangebyscore はスコアの逆順でシーケンスを取得でき、zrank はリーダーボードでのメンバーの位置を取得できます (スコアの正の順序で並べられた場合)。逆の順序で位置を取得したい場合は、zcard-zrank を使用する必要があります)

ID 6001 のニュース ヒット数に 1 を追加します。

zincrby hotNews:20190926 1 n6001

今日最もクリックされた 15 のアイテムを取得します。

zrevrange hotNews:20190926 0 15 withscores

15.逆インデックス

転置インデックスは、検索関数を構築する最も一般的な方法です. Redis では、セットを介して転置インデックスを確立することもできます. これは単純なピンイン + プレフィックス検索関数の例です:

北京の都市を想定して、ピンイン シソーラスを使用して北京を北京に変換し、接頭辞セグメンテーションによって 2 つの単語をいくつかの接頭辞インデックスに分割します。これらのインデックスをセットのキーとして使用し (例: index: north)、北京の ID を格納すると、逆インデックスが確立されます。次に、対応するセットを取り出して、検索時にキーワードを使用してその中の id を取得するだけです。
 

16. 最新のプロジェクト一覧を表示する

たとえば、Web アプリケーションの 1 つで、ユーザーが投稿した最新の 20 件のコメントを一覧表示したいとします。最新のコメントの横に「すべてを表示」リンクがあり、他のコメントに移動できます。

新しいコメントが公開されるたびに、その ID を Redis リストに追加します。リストの長さは 5000 に制限できます

LPUSH latest.comments

Redis では、常に更新される最新の ID の常駐キャッシュを使用します。ただし、ID を 5000 個までに制限しているため、ID の取得関数は常に Redis に問い合わせます。データベースへのアクセスは、この範囲を超えた場合にのみ必要です。
 

おすすめ

転載: blog.csdn.net/XikYu/article/details/130098633