ホームページ  >  記事  >  データベース  >  Redis でビットマップを使用する方法

Redis でビットマップを使用する方法

WBOY
WBOY転載
2023-05-31 21:40:421220ブラウズ

日々の開発プロセスでは、アクセスする必要がある bool 型データがよくあります。たとえば、1 年間にユーザーがチェックインした回数を記録すると、ユーザーがチェックインした回数は 1 回、ユーザーが署名しなかった回数は 0 回になります。 Key-Value をストレージに使用すると、各ユーザーが 365 回記録されることになり、ユーザーが数億人になると、必要なストレージ容量が非常に大きくなります。この問題を解決するには、redis でビットマップを使用します。

Bitmap (ビットマップ) も文字列データ型に属します。 Redis の文字列型の値は、最大 512 MB のコンテンツを保存できます。各文字列は複数のバイトで構成され、各バイトは 8 ビットで構成されます。ビットマップ構造は「ビット」を使用して格納を実現し、ビットを 0 または 1 に設定することでデータ アクセスの目的を達成するため、値の格納数が大幅に増加し、その格納上限は 2^32 です。

ビットマップは本質的には通常のバイト文字列、つまりバイト配列です。このビットマップ配列は getbit/setbit コマンドを使用して処理でき、その構造は次のとおりです。

Redis でビットマップを使用する方法

ビットマップは通常、ユーザー チェックの追跡など、特定のアプリケーションに使用されます。 -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 のビット配列は自動拡張されますが、既存のコンテンツ範囲を超えてオフセット位置を設定した場合、ビット配列は自動拡張されます。

一般的なビットマップ コマンド

1) SETBIT コマンド

は、特定のビットの値を設定またはクリアするために使用され、その戻り値は元のビットに格納されている値です。 。初期状態では、キーのすべてのビットは 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"

2) GETBIT コマンド

は、特定のビットの値を取得するために使用されます。例は次のとおりです。

127.0.0.1:6379> GETBIT user:1 0
(integer) 1

オフセット offset が文字列の長さより大きい場合、またはキーが存在しない場合は、0 が返されます。

redis> EXISTS bits
(integer) 0
redis> GETBIT bits 100000
(integer) 0

3) BITCOUNT コマンド

は、指定された位置間隔内で 1 である値の数をカウントします。構文形式は次のとおりです。

BITCOUNT key [start end]

例は次のとおりです。

127.0.0.1:6379> BITCOUNT user:1
(integer) 8

開始パラメータと終了パラメータを指定するだけで、特定のバイトのみをカウントします。開始パラメータと終了パラメータは GETRANGE コマンドのパラメータに似ています。負の数値も使用できます。たとえば、-1 は最後から 1 桁目を表し、-2 は最後から 2 番目の桁を表します。 .

4) Redis Bitop コマンド

バイナリ ビットを格納する 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 つ以上のキーを入力として受け入れることができます。

  • シナリオ

その日のアクティブ ユーザーに関する統計

毎日のアクティブ統計によりビットマップ キーが作成され、ユーザーがアクティブになると、

に基づいて対応するキーが設定されます。ユーザー ID のオフセット。ビットは 1です。

ユーザー サインイン


各ユーザーは、特定の日に基づいてビットマップ キーを作成します。この日からのその後の日数は、 offset,

If ユーザーがクリックしてサインインすると、対応するオフセット ビットが 1 に設定されます。

以上がRedis でビットマップを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。