チェックインシナリオでのRedisビットマップとそのアプリケーションの概要

この記事は、「新人クリエーションセレモニー」イベントに参加し、一緒にゴールドクリエーションの道を歩み始めました。

基本的:

「Redisの設計と実装」でのビットマップ実装の説明は次のとおりです。文字列オブジェクトで使用されるSDSデータ構造はバイナリセーフであるため、Redisは文字列オブジェクトを使用してビット配列を表します。プログラムはSDS構造を直接使用してビット配列を格納できます。 SDS構造の操作関数を使用して、配列として処理します。

したがって、ビットマップは基本的に、redisの文字列型SDS(単純な動的文字列)です。

bigmapボトムlayer.png

コンピューターのストレージは、バイナリ0および1で保存されたすべてのデータであり、ビットマップはデータのビットを直接読み取り、割り当て、その他の操作を行います。

Redisビットマップ関連の命令

setbitコマンド

指令: SETBIT key offset value
复杂度: O(1)
含义:设置或者清空key的value(字符串)在offset处的bit值(只能只0或者1)。offset位负数或者浮点数,执行报错。(set the original bit value stored at offset)
getbit命令
复制代码

getbitCommand

指令: getbit key offset
复杂度: O(1)
含义:获取key的value(字符串)在offset处的bit值(只能只0或者1)。(get the bit value stored at offset.)
复制代码

bitcountコマンド

指令: bitcount key
复杂度: O(N)
含义:获取key的value(字符串)所有比特位设置位1的总个数(The number of bits set to 1)。
复制代码

ビットフィールドコマンド

指令: bitfield key [option1] [option2] ....
复杂度: O(1) * 每个指定的子命令
含义: 操作多字节位域,它会执行一系列操作,并返回一个响应数组,在参数列表中每个响应数组匹配相应的操作。
官方文档: http://www.redis.cn/commands/bitfield.html
复制代码

bitposコマンド

指令: bitpos key 0|1
复杂度: O(N)
含义: 命令返回字符串里面第一个被设置为1或者0的bit位。(后面还可以接start end两个参数,但是偏移量的单位是字节,不是比特位,几乎没用)
复制代码

bitopコマンド

指令:BITOP [AND|OR|NOT|XOR ]destkey key1 key2
复杂度: O(N)
含义: 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
官方文档: http://www.redis.cn/commands/bitop.html
复制代码

オフセットの増加に伴い、最初のスペース割り当てに必要なスペース占有率と時間スペース占有率が増加します。redis4.0バージョンでは、メモリ使用量[キー]を使用してキーのスペース占有率を確認できます。

占有スペース.png

公式ドキュメントデータのオフセットは2^32-1(割り当てられた512MB)は約300msの
オフセットが必要です2 ^ 30-1(割り当てられた128MB)は約80msの
オフセットが必要です2 ^ 28-1(割り当てられた32MB)は約30msのオフセットが必要
です2 ^ 26 -1(8MBが割り当てられています)は8msかかります

おおよそのスペース占有計算式は次のとおりです。($ offset / 8/1024/1024)MB

アプリケーションシナリオ

チェックインは、典型的なビットマップの使用シナリオです。
コマンドアプリケーション
の概要getbitビューチェックインステータス
setbitマークチェックインビットカウント
累積チェックイン時間
ビットフィールドバッチクエリチェックインマーク

以下は、サインインアプリケーションシナリオのデモンストレーションです。サインイン後のユーザー報酬収集のロジックがある場合は、もちろん、サインアップなどのユーザーの動作も含まれる可能性があり、2ビットを使用して実装できます。ロジック。

累積チェックインアプリケーションシナリオ

累積check-in.gif

累積サインイン02.gif

継続的なチェックインアプリケーションのシナリオ

継続的なcheck-in.gif

継続的なチェックイン02.gif

日付チェックインシーン

日付サインイン.gif

日付サインイン02.gif

アプリケーションの詳細

getbitでn番目のビット値を表示----「N番目のビット」は、「初日のチェックインステータス」
コマンドのスクリーンショットの例を示します。

01.png
意味:キーの値をTest4SignMzyとしてチェックします。最初のビットは0です。

使用する必要があります:

キーはチェックインアクティビティの特定の期間として使用でき、「N番目のビット」は「初日のチェックインステータス」を識別します。

setbitは、n番目のビットを0または1としてマークします----ユーザーは「n日目にチェックイン」し、「n番目のビット」を1としてマークします。コマンド例のスクリーンショット:

02.png

意味:

将key为 Test4SignMzy 的value值,第一位比特位赋值为1,然后查看到比特位以改变为1。
复制代码

使用する必要があります:

このキーは、チェックインアクティビティの特定の期間として使用できます。ユーザーが「n日目にチェックイン」すると、redisキーに対応する値の「n番目のビット」が1としてマークされます。

bitcountは、すべてのビットの1の数をカウントします----ユーザーは「累積的にN回チェックイン」し、この値を使用してコマンド例のスクリーンショットを照会します。

03.png
意味:

key为 Test4SignMzy 的value值,所占用的所有比特位中,比特位值为1的总数是4个。
复制代码

必要なアプリケーション:キーはチェックインアクティビティの特定の期間として使用でき、ユーザーは値の合計ビット数を1に使用して、ユーザーが「N回のチェックインを累積したかどうか」を知ることができます。 "。

bitfieldコマンドは、1回の呼び出しで複数のビット範囲を同時に操作できます。手順のスクリーンショットの例:

04.png意味:

第一个执行“bitfield Test4SignMzy get u1 1 get u1 2 get u1 3 get u1 4 get u1 8 get u1 9 get u1 10 get u1 99”,意思就是查看Test4SignMzy对应的value的第1、2、3、4、8、9、10、99比特位的值,得到的值当作无符号1位整数返回。加入原本不存在第99位,返回0代替。 

第二个执行“bitfield Test4SignMzy get u1 #1 get u1 #2 get u1 #3 get u1 #4 get u1 #8 get u1 #9 get u1 #10 get u1 #99”,意思和第一个执行含义一样,只不过“get u1 N”中第三个参数“N”表示从这个key的value值的第0位开始,往后偏移N位比特位;而“get u1 #N”中第三个参数“#N”表示从这个key的value值的第0位开始,往后偏移“N乘1(第二个参数表示的长度)”位比特位。 
复制代码

使用する必要があります:

ユーザーのチェックイン状況を数日間、またはサイクル内のすべての日数で確認できます。この状態から、ユーザーが連続してチェックインした日数と最大連続チェックイン数を取得できます。サイクルの日数。

おすすめ

転載: juejin.im/post/7079605753094340616