この記事では Redis のビットマップについて説明します。お役に立てば幸いです。
Redis のビットマップは、複数のバイナリ ビットで構成される配列です。配列内の各バイナリ ビットには、対応するオフセット (0 から開始) があり、これらのオフセットを使用できます。ビットマップで指定された 1 つ以上のバイナリ ビットを操作します。 [関連する推奨事項: Redis ビデオ チュートリアル ]
実際には、ビットマップは Redis によって提供される新しいデータ型ではなく、文字列型の拡張です。したがって、文字列型のキーに対してビットマップコマンドを直接使用することができ、ビットマップコマンドで操作したキーを文字列型のコマンドでも操作することができます。
たとえば、文字列キー foo があります:
redis> set foo bar
1 バイトは 8 バイナリ ビットで構成されているため、foo キーのバイナリ形式は次のようになります:
SETBIT キー オフセット値
redis> setbit foo 6 0 (integer) 1 redis> setbit foo 7 1 (integer) 0 redis> get foo"aar"SETBIT コマンドを実行してビットマップを設定しようとするとき、ビットマップが設定されている場合は、存在しない、またはビットマップの現在のサイズを満足できない場合、Redis は設定されたビットマップを拡張し、未設定のすべてのバイナリ ビットの値を 0 に初期化します。例:
redis> setbit far 10 1far が存在しないため、Redis はバイナリ ビットを 0 から 9 まで 0 に設定します。Redis はビットマップをバイト単位で拡張するため、実際には far バイナリ ビットは 10 ではなく、合計 16 です。 、バイナリのビット 11 ~ 15 も 0 です。
この状況に基づいて、指定されたバイナリ ビット オフセットが大きすぎる場合、Redis はすべてのメモリを一度に割り当てる必要があり、Redis サーバーがブロックされる可能性があります。たとえば、ユーザーの性別を保存する場合、ID をバイナリ オフセットとして使用して、1 は男性を表し、0 は女性を表します。ID が 10000000001 から始まる場合は、保存する前にユーザー ID から 10000000000 を減算する必要があります。そうしないと、データの無駄が発生します。メモリ。
GETBIT キー オフセット
BITCOUNT キー [開始終了]
byte 範囲内のバイナリ ビットのみをカウントできるようにします (バイナリ オフセットではありません)。たとえば、ar の 2 バイトで値が 1 の 2 進数の数をカウントしたい場合:
redis> bitcount foo 1 2 (integer) 7start パラメータと end パラメータでは、負のインデックスの使用もサポートされています。以下の使用法は次と同等です。上記:
redis> bitcount foo -2 -1 (integer) 7
BITPOS キー値 [開始終了]
bytes## のみを指定できるようにします # 検索範囲内のバイナリビットで。 redis> get foo"aar"redis> bitpos foo 1
(integer) 1
redis> bitpos foo 0
(integer) 0
redis> bitpos foo 0 1 2
(integer) 8
redis> bitpos foo 1 1 2
(integer) 9
redis> bitpos foo 1 -1 -1
(integer) 17
境界の処理:
<p>operation 参数的值可以是 AND、OR、XOR、NOT 中的任意一个,这 4 个值分别对应逻辑并、逻辑或、逻辑异或和逻辑非 4 种运算,其中 AND、OR、XOR 这 3 种运算允许用户使用任意数量的位图作为输入,而 NOT 运算只允许使用一个位图作为输入。BITOP 命令在将计算结果存储到指定键中之后,会返回被存储位图的字节长度。</p>
<p>当 BITOP 命令在对两个长度不同的位图执行运算时,会将长度较短的那个位图中不存在的二进制位的值看作 0。</p><pre class="brush:js;toolbar:false;">redis> set foo1 bar
OK
redis> set foo2 aar
OK
redis> bitop or res foo1 foo2
(integer) 3
redis> get res"car"</pre><p><img src="https://img.php.cn/upload/image/520/531/184/1638411207694604.png" title="1638411207694604.png" alt="Redis のビットマップの詳細な分析 (ビットマップ)"></p>
<p>注意:BITOP 可能是一个缓慢的命令,它的时间复杂度是 O(N),在处理长字符串时应注意一下效率问题。</p>
<h3 data-id="heading-5"><strong><span style="font-size: 18px;">应用场景</span></strong></h3>
<h4 data-id="heading-6"><strong>用户行为记录器</strong></h4>
<p>用用户 ID 作为偏移量,若用户做了某种行为则通过 SETBIT 将二进制位设置为 1,通过 GETBIT 判断用户是否做了某种行为,通过 BITCOUNT 可以知道有多少用户执行了行为。</p>
<h4 data-id="heading-7"><strong>用户上线统计</strong></h4>
<p>可以使用 SETBIT 和 BITCOUNT 来实现,以用户 ID 作为 key ,假设今天是上线统计功能开放的第一天,ID 为 1 的用户上线后就通过 SETBIT 1 0 1。当要计算此用户的总共以来的上线次数时,使用 BITCOUNT 命令就可以得出的结果。</p>
<p>使用这种方式存储数据,即使 10 年后,1个用户就只占用几百字节的内存,它的处理速度依然很快。如果 bitmap 数据比较大,建议将 bitmap 拆分成多个小的 bitmap 分别进行处理。</p>
<p>更多编程相关知识,请访问:<a href="https://www.php.cn/course.html" target="_blank" textvalue="编程入门">编程入门</a>!!</p>
以上がRedis のビットマップの詳細な分析 (ビットマップ)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。