ユーザーのオンライン状態を記録Redisのビットマップ方式
ビットマップ
ビットマップの導入のためのRedisの公式ドキュメント、次のように:
ビットマップは、実際のデータ型ではなく、ビット列型面上の一連の操作を定義しました。文字列型バイナリブロブ安全、及び最大長は512メガバイトであるので、2 ^ 32の異なるビットを設定するようになっ。
2つのグループに分け、ビット操作:1または0に設定ビットとして動作する単一のビット、又はビットの取得した値の時定数。ビットのセットの動作は、範囲指定されたビットの数は、例えば、計算に設定されています。
ビットマップの最大の利点は、時々の情報を格納するために非常に重要な省スペースな方法です。異なるユーザは、ユーザIDを増加させることによって表される、例えば、システムにおいて、メモリ512MBの単一ビット4,000,000ユーザー情報(例えば、それらがメールを受信する必要があるかどうか)を表すために使用されてもよいです。
簡単に言えば、操作は、ビットマップのビットを操作するために使用され、利点は、メモリ空間を節約することです。なぜあなたは、メモリ空間を節約することができますか?我々一万人のユーザーは、ビットマップを使用して、ログインして保存する必要がある場合、その後、1,000,000ビットのみ最小(ビット1がログを示し、ビット0が未登録示す)文字列の場合、保存することができますストレージは、例えば、userIdをする鍵であり、ログオンしている(文字列「1」ログインは、文字列は「0」でログインしていないを示していることを示している)を使用した場合と比較し、その後、あなたが100万の文字列を格納する必要があり、値として保存されていますスペースビットマップのメモリフットプリントは、ビットマップ格納利点である、はるかに小さいです。
問題につながります
どのように効果的に統計:
1 :ユーザのログインを記録する方法
2 :アクティブなユーザーをチェックする方法(連続着陸)
考え
などのバイナリデータ、記憶されたビットマップ構造、:ユーザーIDとユーザーのオンライン状態を変更に対応する位置を変更することにより、1 0 1 0 0 1 1 0は、デフォルト値は0であり、ユーザがオンラインで表します状態0は、図示のように、ユーザは、オフラインで表します。
ときに、ユーザーのユーザーID = 10月を構築し、これにより、ウェブ月のための3つのビットマップは、ユーザーID = 1であり、ユーザがオンラインでは、ユーザーID = 2は、ユーザは、オンライン状態ではuserId = 3人のユーザ、オフラインであります行に、1の値に置くには10になり
推定された空間 バイナリデータが1ビットである 1ギガバイト(GB) = 8589934592ビット(ビット) は、ユーザーIDインコヒーレントであれば、いくつかのより多い85億ビットのユーザーIDを超える85億ユーザーの状態を記録することができ、理論的に1Gメモリビット、あなたが解決するために、多数のアルゴリズム、またはのuserIdビットセグメントのために使用することができます
例
8人のユーザーがいると仮定
UID:1 2 3 4 5 6 7 8 月曜日:0 。1 1 0 0 0 0 1 火曜日:0 。1 1 1 1 0 0 1 水曜日: 11011001 木曜日:0 。1 1 0 0 0 1 1 金曜日: 11011011 土曜日:0 1 0 0 0 1 1 1 7週間:0 1 0 1 0 0 0 1
どのように我々はそれの1週間のユーザーの連続着陸を数えていますか?(ビット単位AND)
連続着陸の一週間:01000001 :IIユーザーとユーザーの連続着陸VIII
コマンドを使用します。
キー変更キーオフセット値、ビットのオフセット値の値をSetBit
最初のオフセット位置に内getbitキーオフセット取得価額キー
BITCOUNTキー、キー統計、数1
ITOPオペdestKeyキー1のKEY2は... .. OPと(中)、あるいは(または)、NOT(非)、XOR(排他的論理和)
コマンドの主な役割は、などKEY1、KEY2 ...にあるこのバイナリデータ、destkey結果を支払うために、ビット単位の論理演算を行い、デフォルトの位置setbit 0はありません
ショー
UID:1 2 3 4 5 6 7 8
月曜日:01010001
火曜日:01110101
水曜日:11011001
私の8 127.0.0.1:6379>setbitを繰り返し0 (整数)0 繰り返しが私の1月2日127.0.0.1:6379>setbit (整数)0 繰り返しが私の1月3日127.0.0.1:6379>setbit (整数)0 リピート:127.0.0.1を6379> SetBit私の8 1 (整数)0 リピート 127.0.0.1:6379>setbitの2月8日0 (整数)0 リピート 127.0.0.1:6379>setbitの2月1月2日 (整数)0 リピート 127.0.0.1:6379>setbitの2月3日1 (整数)0 リピート 127.0.0.1:6379>setbitの2月4日1 (整数)0 リピート 127.0.0.1:6379>setbitの2月6日1 (整数)0 リピート127.0.0.1:6379>setbitの2月8日1 (整数)0 のRedisは WEN 8 127.0.0.1:6379>setbit 0 (整数)0 のRedisは 127.0.0.1:6379>setbit WEN 1 (整数)0 Redisの 127.0.0.1:6379 > setbit WEN 2 1 (整数)0 のRedisは 127.0.0.1:6379>setbit WEN 4 1 (整数)0 のRedisは 127.0.0.1:6379>setbit WEN 5 1 (整数)0 のRedisは 127.0.0.1:6379>setbit WEN 8 1 (整数)0 Redisの 127.0.0.1:6379>bitop 及び RES月2月WEN#最后得出结果