この記事の Redis テスト コードは、次の環境に基づいています:
オペレーティング システム: Mac OS 64 ビット
バージョン: Redis 5.0.7 64 ビット
実行モード: スタンドアロン モード
redis ビット操作
reids ビット操作は、ビット配列操作およびビットマップとも呼ばれ、バイナリ ビット配列を操作するための 4 つのコマンド (SETBIT、GETBIT、BITCOUNT、および BITTOP) が提供されます。 。
基本的な操作例を見てみましょう
SETBIT
構文: SETBIT キーオフセット値
つまり: コマンド キー オフセット 0/1
setbit コマンドは、指定されたオフセットのバイナリ ビット設定値をファイルに書き込むために使用されます。ビット配列、オフセットは 0 からカウントされ、1 または 0 のみが書き込まれます。0 と 1 以外の値を書き込むと、書き込みは失敗します。
GETBIT
構文: GETBIT キー オフセット
つまり: コマンド キー オフセット
gitbit コマンドは、ビット配列内の指定されたオフセットでバイナリ値を取得するために使用されます:
BITCOUNT
構文: BITCOUNT キー
つまり: コマンド キー
##bitcount コマンドは、ビット配列内の値 1 を持つバイナリ ビットの数を取得するために使用されます。指定されたキー。記述する前は、オフセット 0 の値は 1、オフセット 10 の値は 1、オフセット 8 の値は 0 でした。 #BITOP構文: BITOP 操作 destkey key [key...]
つまり: コマンド操作結果のターゲット キー key1 key2.. .
bitop このコマンドは、複数のビット配列のキーに対して and (ビット単位の AND)、または (ビット単位の OR)、xor (ビット単位の排他的 OR) 演算を実行し、演算結果を destkey に設定できます。
基礎的なデータ構造分析
SDS は、Simple Dynamic String と呼ばれる Redis のデータ構造であり、バイナリ セーフです。 , ほとんどの場合、redis 内の文字列は SDS を使用して保存されます。
SDS のデータ構造:struct sdshdr { #记录buff数组中已使用字节的数量 #也是SDS所保存字符串的长度 int len; #记录buff数组中未使用字节的数量 int free; #字节数组,字符串就存储在这个数组里 char buff[]; }データ格納例: ##画像ソース「Redis の設計と実装」
## メリット#SDS の:
Hongmeng 公式戦略的協力と共同構築 - HarmonyOS テクノロジー コミュニティ
時間計算量は O(1)
誰もが、バイトが 8 つのバイナリ ビット、つまり 8 つの 0 または 1 で格納されることを知っています。 、1 バイトに 0 ~ 127 の 10 進数を格納できます。これには、すべての数字、英語の大文字と小文字、および句読点が含まれます。
1バイト=8ビット
1KB=1024バイト
1MB=1024KB
1GB=1024MB
0 0 0 0 0 0 0 0ビット操作は、対応するオフセット offset に 0 または 1 を設定することです。たとえば、3 番目のビットを 1 に設定します。つまり:
0 0 0 0 1 0 0 0 #对应redis操作即: setbit key 3 1これに基づいて、オフセットを次のように設定する場合13 位置は 1 に設定されます。
setbit key 13 1 #对应redis中的存储为: 0 0 1 0 | 0 0 0 0 | 0 0 0 0 | 1 0 0 0
時間計算量
##GETBIT コマンド時間計算量 O(1)STEBIT コマンドの時間計算量 O(1)
BITCOUNT コマンドの時間計算量 O(n)
BITOP コマンドの時間計算量は O(n)、O(n2)です。
GETBIT および SETBIT コマンドの時間計算量が O(1) である理由を見てみましょう。 SETBIT キー 10086 1 の値を実行すると、リードは次のように計算されます:
ビット配列に書き込まれるバイトを取得します: 10086÷8=1260、これは の添え字に書き込む必要があります。ビット配列 1260
のバイト 書き込むこのバイトの番号を取得します: 10086 mod 8 = 6。このバイトのインデックス 6、つまり 7 番目のビットに書き込む必要があります。 。
これら 2 つの計算方法を通して、ビット演算の GETBIT と SETBIT は定数計算であるため、時間計算量が O(1) であることが明確にわかります。
BITCOUNT コマンドは、値 1 を持つ要素がいくつあるかを計算するために、ビット配列全体のすべての要素を走査する必要があります。もちろん、redis には、ビットに対して bitcount コマンドを実行するための一連の複雑な最適化アルゴリズムが備わっています。ビッグ データを使用しますが、核となる考え方は同じであり、部分的なトラバーサル クエリの数を減らすことに他なりません。 1 回の走査として 128 ビットが明示的に使用される場合、走査する必要がある回数は、すべての桁を 128 で割ったものと等しくなります。
BITTOP コマンドは、操作に応じて実行方法が異なります。たとえば、AND 演算の場合は、ビット値が 1 であることを確認する必要があります。
ストレージ容量の計算
上記の説明に基づいて、Redis ベースのビット配列データ構造を使用してデータを保存することによって占有されるメモリ サイズを計算する方法を知ることができます。 。たとえば、100 億のデータがある場合、必要なバイト配列は次のとおりです:
1000000000÷8÷1024÷1024≈119.21MB
つまり、必要なメモリは約 119MB だけです。 10 億のデータスペースを保存できますが、これは現在利用可能な Redis の 16G および 32G クラスターバージョンではまったく問題ありません。
データの量が大きくない場合は、開始オフセットをあまり大きくしないでください。これもスペースを消費します。たとえば、数百個のデータを保存するだけで済みます。データの断片ですが、オフセットが非常に大きいため、メモリ空間が大量に無駄になります。
アプリケーション シナリオ
実際のプロジェクト開発では、redis ビットを使用して実装するのに適したビジネスが数多くあります。
ユーザー サインイン シナリオ
毎日の日付文字列がキーとして使用され、ユーザー ID がオフセットとして使用され、毎日のユーザー サインイン ステータスが使用されます。ユーザーの総サインイン数がカウントされます。
アクティブ ユーザー数に関する統計
ユーザーの毎日のアクティビティ、月ごとのアクティビティ、維持率などを把握できます。 Redis ビット配列を使用して保存するか、毎日の日付をキーとして使用します。ユーザーがアクティブなときに書き込みます。オフセットをユーザー ID のビット値 1 として入力します。
月々の生活費も同様です。
ユーザーがオンラインかどうか、およびオンラインの合計人数
同じビット配列を使用し、ユーザー ID マッピングのビット オフセットを 1 に設定してオンラインであることを示します、から 0 オフラインを示します。これにより、ユーザーのオンラインおよびオフラインのクエリと、オンラインの総人数の統計を実現できます。
アプリ内のユーザーのグローバル メッセージ プロンプトは赤い点です
現在、ほとんどのユーザーは、アプリにはサイト内メッセージ機能があり、メッセージがあると小さな赤い点が表示され、ユーザーに新しいメッセージがあることを示します。
以上がRedis ビット操作の使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。