セットする
Redisセットは、文字列型の順序付けされていないコレクションです。
コレクションはハッシュテーブルによって実現されるため、追加、削除、検索の複雑さはすべてO(1)です。
- 新しいストレージ要件:大量のデータを保存し、クエリの効率を高めます
- 必要なストレージ構造:大量のデータを保存できる、効率的な内部ストレージメカニズム、クエリが簡単
- セットの種類:ハッシュの格納構造とまったく同じで、キーのみを格納し、値(nil)を格納せず、値を繰り返すことはできません。
基本的なコマンド
コマンド | 機能 |
---|---|
sadd key member1 [member2 ......] | データを追加する |
メンバーズキー | すべてのデータを取得 |
sremキーメンバー1 [メンバー2] | データを削除する |
怖い鍵 | 集計データを取得する |
sismemberキーメンバー | コレクションに指定されたデータが含まれているかどうかを判別する |
> sadd students zhangsan lisi wangwu
(integer) 3
> smembers students
1) "zhangsan"
2) "wangwu"
3) "lisi"
> srem students zhangsan
(integer) 1
> scard students
(integer) 2
> sismember students zhangsan
(integer) 0
拡張コマンド1
コマンド | 機能 |
---|---|
孫キー[数] | コレクション内の指定された量のデータをランダムに取得します |
ポップキー[数] | コレクション内のデータをランダムに取得し、データをコレクションの外に移動します |
srandmember students
"lisi"
> srandmember students 2
1) "wangwu"
2) "lisi"
> spop students
"wangwu"
拡張コマンド2
コマンド | 機能 |
---|---|
焼結キー1 [キー2] | 2つのセットの共通部分を見つける |
sunion key1 [key2] | 2つのセットの和集合を見つける |
sdiff key1 [key2] | 前後の2つのセットの違いを見つける |
sinterstoreの宛先key1 [key2] | 2つのセットの共通部分を見つけて、指定されたセットに格納します |
sunionstore宛先key1 [key2] | 2つのコレクションの和集合を見つけて、指定されたコレクションに格納します |
sdiffstore宛先key1 [key2] | 2つのセットの違いを見つけて、指定されたセットに格納する |
ソースの宛先メンバーを削除 | 指定したデータを元のコレクションからターゲットコレクションに移動します |
> sunion students teacher
1) "zhangsan"
2) "lisi"
3) "yuwen"
4) "shuxue"
アプリケーションシナリオ
ビジネスシナリオ1
Toutiaoを初めて使用する場合、各ユーザーは3つの趣味を設定しますが、後でユーザーのアクティビティと関心ポイントを増やすために、ユーザーは徐々に他の情報カテゴリに興味を持ち、顧客維持率を高める必要があります。
ビジネス分析
- システムは、各カテゴリの最新または最もホットな情報アイテムを分析し、それらをセットのコレクションに編成します
- 一部の情報をランダムに選択します
- 情報分類のホットな情報へのユーザーの注意に協力し、表示される情報の完全なセットに整理する
解決策
- コレクション内の指定された量のデータをランダムに取得します
- コレクション内のデータをランダムに取得し、データをコレクションの外に移動します
ビジネスシナリオ2
ユーザー間のコミュニケーションを促進し、ビジネスユニット率の増加を確実にするために、各ユーザーには多数の友達がいる必要があります。実際、職場の新規参入者は職場に
友達がいません。どのようにしてユーザーの友達をすばやく増やすことができますか?
ユーザーの人気を高め、ユーザーの定着率を高めるために、Sina WeiboはWeiboユーザーがより多くの人々に注意を払い、より多くの情報やホット
トピックを取得する必要があります。他のユーザーに注意を向けるユーザーの総数を増やすにはどうすればよいですか?
解決策
- 2つのセットの交差、和集合、差を求めます
- 2つのセットの交差、和集合、差を見つけ、それらを指定されたセットに格納します
- 指定したデータを元のコレクションからターゲットコレクションに移動します
ビジネスシナリオ3
グループ会社には、合計12,000人の従業員、内部OAシステムで700を超える役割、3000を超える業務、23,000を超える種類のデータがあり、各
従業員には1つ以上の役割があります。
同社は新しいWebサイトを宣伝し、WebサイトのPV(訪問)、UV(独立した訪問者)、およびIP(独立したIP)をカウントします。
解決策
- セットコレクションのデータ重複除外機能を使用して、さまざまなアクセスデータを記録する
- 文字列データを作成し、incrを使用して1日の訪問数(PV)をカウントする
- 異なるCookie(UV)の数を記録するようにモデルを設定する
- 異なるIP(IP)の数を記録するセットモデルを確立する
ビジネスシナリオ4
ブラックリスト
情報情報Webサイトは大量のトラフィックを追求しますが、情報の価値が高いため、犯罪者が簡単に使用できることが多くあります。クローラーテクノロジーにより、
情報をすばやく取得できます。個々の特別な業界のWebサイトからの情報は、クローラーによって分析された後、商業秘密に変換できます。販売のため。たとえば、サードパーティの列車の
チケット、航空券、ホテルのチケット購入ソフトウェア、eコマースのレビューコメント、レビュー。
同時に、クローラーによってもたらされる偽のトラフィックは、オペレーターに幻想を与え、間違った決定をし、各
Webサイトが考慮しなければならない基本的な問題として、Webサイトがクローラーによって繰り返しクロールされることを効果的に防ぎます。技術レベルに基づいてクローラーユーザーを区別した後、そのようなユーザーを効果的にシールドする必要があります。これは
、ブラックリストの典型的なアプリケーションです。
PS:クローラーが破壊的な作業を行う必要があるわけではありません。小規模なWebサイトの中には、トラフィックを運ぶためにクローラーが必要なものもあります。
ホワイトリスト
アプリケーションアクセスをより安全にするには、ブラックリストだけではセキュリティの問題を解決できません。現時点では、アクセス可能なユーザーグループを設定し、
より厳しいアクセス検証のためにホワイトリストに依存する必要があります。
解決策
- ビジネス戦略に基づいて問題のあるユーザーの発見と識別のルールを設定する
- ルールを満たすユーザーブラックリストを定期的に更新し、セットのコレクションに追加します
- ユーザーの行動情報に到達した後、それをブラックリストと比較して行動を確認します
- IPアドレスのブラックリストフィルタリング:オープンな訪問者のアクセス権に適用される情報源
- ブラックリストフィルタリングデバイス情報:デバイスへのアクセスを制限するために使用される情報源
- ユーザーをブラックリストでフィルタリング:アクセス権に基づいて情報ソースに適用
セットアプリケーション
-
Redisは、人気の曲のリストのおすすめ、人気のニュースのおすすめ、人気の旅行ルート、アプリケーションAPPのおすすめ、Big Vのおすすめなど、ランダムなおすすめ情報の取得に使用されます。
-
Redisのは、関連付けられた深さ検索、サーチ、検索関連する第二の時間に関連する情報の同じタイプに適用される
(1回)、共通の関心の表示を
(1回)共通の友人を表示する
(1回)バディのバディリスト情報、ユーザBを取得するために、ユーザAから出発して
、ユーザAから出発して、
ユーザーAから友達ユーザーBの買い物リストリスト(2度)を取得、友達ユーザーB(2度)のゲームリチャージリストを取得 -
Redisは同じタイプのデータの高速重複排除に適用されます
-
redisは、ブラックリストとホワイトリストの設定に基づくサービスコントロールに適用されます
注意が必要な事項
- セットタイプではデータの重複が許可されていません。追加されたデータがすでにセットに存在する場合、1つのコピーのみが保持されます
- セットはハッシュの格納構造と同じですが、値をハッシュに格納するためのスペースを有効にできません
Sorted_set
Redis zsetは、setと同様に、文字列型要素のコレクションでもあり、メンバーの重複を許可していません。
違いは、各要素がdoubleタイプのスコアに関連付けられていることです。Redisはスコアを使用して、セットのメンバーを小から大に並べ替えます。zsetのメンバーは一意ですが、スコアを繰り返すことができます。
- 新しいストレージ要件:データの並べ替えはデータの効果的な表示に役立ち、独自の特性に従って並べ替える方法を提供する必要があります
- 必要なストレージ構造:ソート可能なデータを保存できる新しいストレージモデル
- sorted_setタイプ:セットのストレージ構造に基づいてソート可能なフィールドを追加します
基本的なコマンド
コマンド | 機能 |
---|---|
zaddキースコア1メンバー1 [スコア2メンバー2 ...] | データを追加する |
zrangeキースタートストップ[WITHSCORES] | 指定したランキング間隔のすべてのデータを取得するには、昇順で並べ替えます |
zrevrangeキースタートストップ[WITHSCORES] | 降順で並べ替えて、指定したランキング間隔のすべてのデータを取得します |
zremキーメンバー[メンバー...] | 指定したデータを削除 |
zrangebyscore key min max [WITHSCORES] [LIMIT] | 指定したスコア間隔でデータを取得するには、昇順で並べ替えます |
zrevrangebyscore key max min [WITHSCORES] | 降順で並べ替え... |
zremrangebyrankキースタートストップ | 順序付けられたセットから指定されたランク範囲のすべてのデータを削除します |
zremrangebyscore key min max | 順序付けられたセットから指定されたスコア間隔のすべてのデータを削除します |
zcardキー | コレクションデータの合計量を取得する |
zcount key min max | コレクションの指定されたスコア間隔のデータの総量を取得します |
zinterstore宛先numkeysキー[キー...] | 2つの順序付きセットの共通部分を新しい順序付きセットにマージします |
zunionstore宛先numkeysキー[キー...] | 2つの順序付きセットの和集合を新しい順序付きセットにマージします |
> zadd zs 10 fir 8 sec 4 thi
(integer) 3
> zrange zs 0 2
1) "thi"
2) "sec"
3) "fir"
> zrevrange zs 0 -1 withscores
1) "fir"
2) "10"
3) "sec"
4) "8"
5) "thi"
6) "7"
//> zrem zs thi
//(integer) 1
> zrangebyscore zs 7 10 withscores
1) "sec"
2) "8"
3) "fir"
4) "10"
拡張コマンド
コマンド | 機能 |
---|---|
zrankキーメンバー | データに対応するインデックス(ランク)を昇順で取得します |
zrevrankキーメンバー | データに対応するインデックス(ランク)を降順で取得します |
zscoreキーメンバー | 指定されたデータのスコアを取得します |
ジンキーのキー増分メンバー | 指定された値の増加(負になることも、10進数になることもあります) |
> zrank zs thi
(integer) 0
> zrevrank zs sec
(integer) 1
> zscore zs fir
"10"
> zincrby zs 5 fir
"15"
> zincrby zs -4.5 fir
"10.5"
アプリケーションシナリオ
ビジネスシナリオ1
広東省の優秀な若者トップ10に投票し、さまざまな番組や海の選挙に投票してくださいさまざま
なリソースWebサイトTOP10(映画、歌、ドキュメント、eコマース、ゲームなど)
チャットルームの活動統計
ゲームの友達の親密さ
ビジネス分析
- ランキングに参加するすべてのリソースのランキング基準を確立する
解決策
- データに対応するインデックス(ランク)を取得します
- スコア値の取得と変更
ビジネスシナリオ2
基本サービス+付加価値サービスのウェブサイトでは、メンバーのトライアルを設定し、ユーザーがメンバーの利点を十分に体験できるようにします。たとえば、映画鑑賞VIP、ゲーム
VIPエクスペリエンス、クラウドディスクダウンロードエクスペリエンスVIP、データ表示エクスペリエンスVIP。VIPエクスペリエンスが期限切れになったとき、そのような情報が効果的に管理されている場合。正式な
VIPユーザーであっても、対応する管理方法があります。
ウェブサイトは定期的に投票と議論を開始し、限られた時間内に実施され、締め切り後に無効になります。このような期限切れの情報を効果的に管理する方法。
解決策
-
タイムライン制限に基づくタスク処理は、処理時間をスコア値として記録し、ソート機能を利用して処理順序を区別
-
次に処理される時間を記録し、対応するタスクが期限になったら処理し、redisでレコードを削除して、次に処理される時間を記録します
-
新しいタスクが追加されたら、次に処理するタスクの時間を決定して更新します
-
为提升sorted_set的性能,通常将任务根据特征存储成若干个sorted_set。例如1小时内, 1天内,周内,
月内,季内,年度等,操作时逐级提升,将即将操作的若干个任务纳入到1小时内处理的队列中 -
获取当前系统时间
time
业务场景3
任务/消息权重设定应用
当任务或者消息待处理,形成了任务队列或消息队列时,对于高优先级的任务要保障对其优先处理,如
何实现任务权重管理。
解决方案
- 对于带有权重的任务,优先处理权重高的任务,采用score记录权重即可
多条件任务权重设定
如果权重条件过多时,需要对排序score值进行处理,保障score值能够兼容2条件或者多条件,例如外贸
订单优先于国内订单,总裁订单优先于员工订单,经理订单优先于员工订单 - 因score长度受限,需要对数据进行截断处理,尤其是时间设置为小时或分钟级即可(折算后)
- 先设定订单类别,后设定订单发起角色类别,整体score长度必须是统一的,不足位补0。第一排序规则首
位不得是0 - 例如外贸101,国内102,经理004,员工008。
- 员工下的外贸单score值为101008(优先)
- 经理下的国内单score值为102004
zset的应用
- redis 应用于计数器组合排序功能对应的排名
- redis 应用于定时任务执行顺序管理或任务过期管理
- redis 应用于即时任务/消息队列执行管理
- redis 应用于限时按次结算的服务控制
注意事项
- score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
- score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时
候要慎重 - Sorted_setの基になるストレージはセット構造に基づいているため、データを繰り返すことはできません。同じデータが繰り返し追加されると、スコア値は
繰り返し上書きされ、最後に変更された結果が保持されます