ユーザーのオンライン状態を記録Redisのビットマップ方式

ユーザーのオンライン状態を記録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#最后得出结果

おすすめ

転載: www.cnblogs.com/-wenli/p/10958214.html