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

1. キャッシュ

文字列型

例:ホット データ キャッシュ (レポート、有名人の不正行為など)、オブジェクト キャッシュ、全ページ キャッシュ、ホット データを改善できるアクセス データ

Key-Value 形式のメモリ内データベースである Redis のアプリケーション シナリオとして最初に思い浮かぶのは、データ キャッシュです。Redis を使用してデータをキャッシュするのは非常に簡単で、シリアル化されたオブジェクトを文字列型で保存するだけです。

異なるオブジェクトのキーが重複しないようにする必要があり、キーはできるだけ短くする必要があります。通常、クラス名 (テーブル名) と主キーを使用して連結します。

シリアル化の効率を向上させ、メモリ使用量を削減するには、優れたシリアル化方法を選択することも重要です。

キャッシュの内容とデータベースの間の一貫性を保つには、通常、次の 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秒後に自動的にロックが解除され、他のプログラムの動作には影響しません。

分散ロックを実装するには、 redissonサードパーティ ライブラリを使用することをお勧めします。を参照してください。

redisson、Java分散ロックの究極のソリューション

文字列型の setnx メソッド。存在しない場合にのみ正常に追加でき、true を返します。

public static boolean getLock(String key) {
    Long flag = jedis.setnx(key, "1");
    if (flag == 1) {
        jedis.expire(key, 10);
    }
    return flag == 1;
}

public static void releaseLock(String key) {
    jedis.del(key);
}

4. グローバルID

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

incrby userid 1000

サブデータベースとサブテーブルのシーンでは、一度に 1 つのセクションを取得します

5. カウンター

int型、incrメソッド

例: 読まれた記事の数、Weibo の「いいね!」の数、一定の遅延は許可されます。最初に Redis に書き込んでから、定期的にデータベースに同期します。

カウント機能は、高頻度の読み取りおよび書き込み特性により、インメモリ データベースとしての Redis の効率を最大限に活用できるため、Redis に最も適した使用シナリオの 1 つとなります。

Redis のデータ構造では、文字列、ハッシュ、およびソート セットはすべて、アトミックな自己インクリメント操作用の incr メソッドを提供します。次の例は、それぞれの使用シナリオを示しています。

(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 型のビットカウント (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),可以用来做大数据量的统计
*/

例: オンライン ユーザー統計、保持されているユーザー統計

setbit onlineusers 01

setbit onlineusers 11

setbit onlineusers 20

ビット単位の AND、ビット単位の OR などをサポートします。

BITOPANDdestkeykey[key...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。      

BITOPORdestkeykey[key...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。

BITOPXORdestkeykey[key...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。

BITOPNOTdestkeykey ,对给定 key 求逻辑非,并将结果保存到 destkey 。

7 日間オンラインだったユーザーを計算する

1

BITOP "AND" "7_days_both_online_users" "day_1_online_users" "day_2_online_users" ...  "day_7_online_users"

参考

Redis ビットマップを使用してユーザー維持率とアクティブ ユーザーをカウントする

ユーザーの日次および月次アクティビティをカウントする方法 - Redis HyperLogLog 詳細説明

8. ショッピングカート

文字列またはハッシュ。String で実行できるハッシュはすべて実行できます

  • キー: ユーザー ID; フィールド: アイテム ID; 値: アイテムの数量。
  • +1: ヒンクル。-1: hdecr。削除: hdel. すべて選択: hgetall。アイテムの数: hlen。

9. ユーザーメッセージのタイムライン

リスト、二重リンクリスト、タイムラインとして直接使用してください。広告掲載オーダー

二重リンクリストとして、リストはキューとしてだけでなく使用することもできます。スタックとして使えば共通の時間軸にもなります。ユーザーが Weibo の投稿を完了すると、lpush を通じてキーが LATEST_WEIBO であるリストに保存され、lrange を通じて現在の最新の Weibo を取得できます。

10. メッセージキュー

Redis における list のデータ構造実装は二重リンク リストであるため、メッセージ キュー (プロデューサー/コンシューマー モデル) に簡単に適用できます。メッセージのプロデューサーは lpush を通じてメッセージをリストに追加するだけでよく、コンシューマーは rpop を通じてメッセージを取り出すことができ、メッセージの順序が保証されます。メッセージキューを優先して実装する必要がある場合は、ソートセットを選択することもできます。また、パブリッシュ/サブスクライブ機能は、メッセージのパブリッシャー/サブスクライバー モデルとしても使用できます。いずれの方法を使用しても、Redis には永続化機能があるため、サーバー障害によるメッセージ損失の心配はありません。

リストには、 blpop/brpopという 2 つのブロック ポップ操作が用意されており、タイムアウトを設定できます。

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

上記の操作は実際には Java のブロックキューです

  • キュー: アドバンストと最初の分割: rpush blpop、先頭が左側、末尾が右側、右側でキューに入り、左側でキューから出ます
  • スタック: 先入れ後出し: rpush brpop

11. 宝くじ

セット構造の不規則性を利用して、Spop を通じて値をランダムに取得します (Redis Spop コマンドは、コレクション内の指定されたキーの 1 つ以上のランダムな要素を削除するために使用され、削除された要素は削除後に返されます)

spop myset

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> 

12. いいね、チェックイン、チェックイン

上記の Weibo ID が t1001、ユーザー ID が u3001 であるとします。

like:t1001 を使用して、t1001 の Weibo に「いいね!」をするすべてのユーザーを維持します

  • Weibo が「いいね!」しました: sadd like: t1001 u3001
  • キャンセル いいね: srem いいね:t1001 u3001
  • いいね: sismember いいね:t1001 u3001
  • 好きなユーザー全員: 好きなメンバー: t1001
  • いいね数: スカードいいね:t1001

データベースよりもはるかにシンプル

13. 製品ラベル

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

  • タグ:i5001 画像は鮮明で繊細です
  • タグ: i5001 トゥルー カラー クリア ディスプレイ
  • タグ: i5001 極限までプロセス

14. 商品審査

// 获取差集
sdiff set1 set2

// 获取交集(intersection )
sinter set1 set2

// 获取并集
sunion set1 set2


場合: iPhone 11 が発売された場合

sadd brand:apple iPhone11

sadd brand:ios iPhone11

sad screensize:6.0-6.24 iPhone11

sad screentype:lcd iPhone 11

フィルター製品、Apple、iOS、画面 6.0 ~ 6.24、画面素材は LCD スクリーン

焼結ブランド:アップルブランド:ios画面サイズ:6.0-6.24画面タイプ:液晶

15. ユーザーの注目と推奨モデル

このシーンは、Weibo の Redis アプリケーションを紹介する PPT で初めて見られ、Weibo の Redis は主にカウントと友達関係に使用されると述べられていましたが、当時、私は友達関係の使用法についてあまり知りませんでした。 , 著者が最初に Redis を使用したのは、従来のデータベースでは集合の積集合を迅速に計算できない機能を集合を使用して解決したいと考えたからだ、という紹介を「Redis の設計と実装」で見ました。後で、Weibo の現在のビジネス シナリオを考えると、確かにこのように実現できるので、推測してみましょう。

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

フォローする ファンをフォローする

お互いにフォローし合いましょう:

  • 悲しい1:フォロー2
  • 悲しい2:ファン1
  • 悲しい1:ファン2
  • 悲しい2:フォロー1

私がフォローしている人たちも彼をフォローしています (交差点を曲がります):

  • 華 1:フォロー 2:ファン

知り合いかも:

  • ユーザー 1 が知っている可能性のある人々 (差分セット): sdiff 2:follow 1:follow
  • ユーザー 2 が知っている可能性のある人: sdiff 1:follow 2:follow

16. リーダーボード

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

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

zincrby hotNews:20220926 1 n6001

今日最もクリックされた 15 アイテムを入手:

zrevrange hotNews:20220926 0 15 withscores

17. 転置インデックス

逆インデックスは、検索関数を構築する最も一般的な方法です。Redis では、逆インデックスは set を通じて確立することもできます。簡単なピンイン + プレフィックス検索関数の例を次に示します。

北京市を想定して、ピンインシソーラスを通じて北京を北京に変換し、接頭辞分割を通じて 2 つの単語をいくつかの接頭辞インデックス (Bei、Beijing、b、be...beijin、beijing など) に分割します。これらのインデックスをセットのキーとして使用し (例: インデックス: 北)、北京の ID を格納すると、逆インデックスが確立されます。次に、検索時にキーワードを通じて対応するセットを取り出し、その中の ID を取得するだけです。

18. 最新のプロジェクト一覧を表示

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

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

LPUSH latest.comments

おすすめ

転載: blog.csdn.net/MinggeQingchun/article/details/130533914