日々の開発プロセスでは、アクセスする必要がある bool 型データがよくあります。たとえば、1 年間にユーザーがチェックインした回数を記録すると、ユーザーがチェックインした回数は 1 回、ユーザーが署名しなかった回数は 0 回になります。 Key-Value をストレージに使用すると、各ユーザーが 365 回記録されることになり、ユーザーが数億人になると、必要なストレージ容量が非常に大きくなります。この問題を解決するには、redis でビットマップを使用します。
Bitmap (ビットマップ) も文字列データ型に属します。 Redis の文字列型の値は、最大 512 MB のコンテンツを保存できます。各文字列は複数のバイトで構成され、各バイトは 8 ビットで構成されます。ビットマップ構造は「ビット」を使用して格納を実現し、ビットを 0 または 1 に設定することでデータ アクセスの目的を達成するため、値の格納数が大幅に増加し、その格納上限は 2^32 です。
ビットマップは本質的には通常のバイト文字列、つまりバイト配列です。このビットマップ配列は getbit/setbit コマンドを使用して処理でき、その構造は次のとおりです。
ビットマップは通常、ユーザー チェックの追跡など、特定のアプリケーションに使用されます。 -ins またはログインの頻度。上の図は、ユーザーが 10 日間に Web サイトにアクセスしたチェックイン数を示しており、サインインを 1 、チェックインしていないことを 0 として表しており、ユーザーのアクティビティ レベルを簡単にカウントできます。ビットマップを使用して各レコードを記録すると、占有するビットは 1 ビットのみとなるため、文字列を直接使用する場合に比べてメモリ スペースの使用量が大幅に削減されます。
Redis 関係者も実験を実施しました。彼らは 1 億 2,800 万人のユーザーを持つシステムをシミュレートし、Redis ビットマップを使用して「毎日の平均ユーザー数」を数えました。最終的に費やした時間は約 50 ミリ秒で、ほんのわずかしかかかりませんでした。 16MBのメモリ。
文字列型ストレージを使用する場合、Web サイトでユーザーのチェックイン記録を 1 年間記録する必要がある場合、365 個のキーと値のペアが必要になります。ビットマップ ストレージが使用されている場合、ユーザーがサインインすると 1 が保存され、それ以外の場合は 0 が保存されます。最終的には、00010101... のような格納結果が生成されます。この中で、毎日のレコードは 1 ビットのみを占有し、1 年は 365 ビット、つまり約 46 バイトになります。ユーザーがサインインした日数のみをカウントしたい場合は、1 の数をカウントします。
ビットマップ操作の利点は、文字列と比較して効率が高いだけでなく、スペースも非常に節約できることです。
Redis のビット配列は自動拡張されますが、既存のコンテンツ範囲を超えてオフセット位置を設定した場合、ビット配列は自動拡張されます。
は、特定のビットの値を設定またはクリアするために使用され、その戻り値は元のビットに格納されている値です。 。初期状態では、キーのすべてのビットは 0 です。例は次のとおりです。
SETBIT key offset value
ここで、offset は 0 から始まるオフセットを表します。例は次のとおりです。
127.0.0.1:6379> SET user:1 a OK #设置偏移量offset为0 127.0.0.1:6379> SETBIT user:1 0 1 (integer) 0 #当对应位的字符是不可打印字符,redis会以16进制形式显示 127.0.0.1:6379> GET user:1 "\xe1"
は、特定のビットの値を取得するために使用されます。例は次のとおりです。
127.0.0.1:6379> GETBIT user:1 0 (integer) 1
オフセット offset が文字列の長さより大きい場合、またはキーが存在しない場合は、0 が返されます。
redis> EXISTS bits (integer) 0 redis> GETBIT bits 100000 (integer) 0
は、指定された位置間隔内で 1 である値の数をカウントします。構文形式は次のとおりです。
BITCOUNT key [start end]
例は次のとおりです。
127.0.0.1:6379> BITCOUNT user:1 (integer) 8
開始パラメータと終了パラメータを指定するだけで、特定のバイトのみをカウントします。開始パラメータと終了パラメータは GETRANGE コマンドのパラメータに似ています。負の数値も使用できます。たとえば、-1 は最後から 1 桁目を表し、-2 は最後から 2 番目の桁を表します。 .
バイナリ ビットを格納する 1 つ以上の文字列キーに対してビット操作を実行し、結果を destkey に保存します
操作は任意です4 つのタイプのいずれか: AND、OR、NOT、結果は destkey に保存されます。
BITOP OR destkey key [key …] 、1 つ以上のキーに対して論理 OR を実行し、結果を - destkey に保存します。
BITOP XOR destkey key [key …]、1 つ以上のキーに対して論理 XOR を実行し、結果を destkey に保存します。
BITOP は destkey キーではありません。指定されたキーに対して論理否定を実行し、結果を destkey に保存します。
NOT 操作を除き、他の操作は 1 つ以上のキーを入力として受け入れることができます。
その日のアクティブ ユーザーに関する統計
各ユーザーは、特定の日に基づいてビットマップ キーを作成します。この日からのその後の日数は、 offset,
以上がRedis でビットマップを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。