あなたは確かにあなたが本当に2番目の系列をRedisの知っています

彼らは次のような対話を持っているので、それを通じ作るには少しXのインタビュー、そして今日は、インタビューの第二ラウンドを行いました。インタビュアー:私は今、シーンのニーズを持って、私たちのAPPは、チェックインするユーザーになりたいと思っているような、私はユーザー今年のチェックはイン回数をカウントしたいが、私は特別な要求を持って、あなたはどう思いますか、これを行うために使用したいのRedisそれは?インタビュアー:あなたは親指行動した場合には、このシンプルなああ、私は価値のカジュアルが行います、書式USERCODE +日付で、達成するための単純な文字列を使用しますが、キーの時間のデザインにすることができ、その後のRedisキャッシュAに出て行きますそのようなセットzhangsan20191225 1として、ライン上に記録し、それを組み立てキーのルールに従っているときのRedisは、対応する値を取得するために、私は毎月または毎年の統計ユーザーのチェックイン、その後、電源を入れたときに、その値その上にいくつかの統計を行います。インタビュアーは:ああ、あなた、これは本当に良いアイデアですが、あなたはまだ私は、このような年として、ユーザーに署名することを問題、あなたは365キーと値を構築する彼を与える必要があり、その後、同じユーザーを持つ、メモリフットプリントは、あまりにも深刻です当社のシステム億、およびマシンのメモリのユーザーは、その下に保存することができますか?それのメモリを節約することができ、他の方法ではありませんか?インタビュアー:量?まあ。次のステップは、今日のヒーローリードは、ビットマップをのRedis、ビットマップは、多くの人が聞いていないと信じている、これは新しいデータ構造Redisのサポートですか?絶対にありません。実際には、ビットマップは、導入部を介して導入記事の私達の最後の文字列で、私たちは皆知っていると信じて、文字列が実際に基本的なデータ構造に格納され、それはバイト配列であるため、その後、私たちは言葉によって動作することはできない、バイトの配列でありますセクションのモードビット(ビット)は、それを操作するには?もちろん、答えはイエスである、私たちのために、このようなコマンドを提供のRedis、対応するビットマップです。先頭へ戻るフェイスの質問に、実際には、我々は実際には、処理のためにビットマップを使用することができ、すべての時間は、ユーザーのサインもやって、1ビットだけ(ビット)、そのユーザーがサインインした場合でも365日もちょうど365ビット(ビット)を取るを占めていますあなたが大量のメモリを節約することができますので、46個の文字に、通常の文字列は、完全に押したままにすることができます。私たちは普通の取得/設定は、ビットマップの直接アクセスまたはコンテンツをコマンドを使用することができますので、通常の文字列のRedis、あること、ビットマップは特殊なデータ構造ではありませんが、上記のコマンドもビットマップの操作を使用することができます/ setbitコマンドバイトをgetbit動作するように設定されたビットの配列として、ビットアレイの拡張は自動的であるRedisの、我々は既存のコンテンツの範囲を超えてオフセット位置を設定するようにしても、Redisのは自動的にゼロ桁拡張に設定されます。次は代わりに最初に私たちは「こんにちは」の文字列の内部の各文字のバイナリASCIIコードの数を知るために必要なすべての、setコマンドを使用してのビットマップアクション文字列「こんにちは」、によって設定されます。H:01101000ハイ - >低E:01100101リットル:01101100○:01101111は、設定する前に、まず私たちは右下、私たちの共通の文字の高進数は、左の図を対応するエンコードすることは明らかでなければならない、と中央値のグループは、最もからです右上、左に低いので、左側に開始します。図文字のバイナリ数の一番上の行の例えば低ビット位置米国、下段は、ビットの下位ビット群です。したがって、記憶されたビットは、右、バイナリ値または各バイトまたは文字の右から左へ順に格納された対応する符号化文字を左から設定されています。![ファイル](https://img2018.cnblogs.com/blog/1917499/202001/1917499-20200109105626688-1420297077.jpg)次に、我々は「H」と「E」の両方の最初のビットマップのコマンド代わりに文字セット16ビットのビット列の最初の8ビットおよび8ビットのですが、時間を設定し、アレイは、私たちは位置0のため、リスト上の位置1に対応する位置を設定する必要があり、自動的にRedisのヘルプ私たちは、0、2、4時間の場所を設定する必要性、及び9,10,13,15の位置を設定するために、電子のニーズを満たす、ライン上の他のセットそう。![ファイル](https://img2018.cnblogs.com/blog/1917499/202001/1917499-20200109105626940-1382396813。このように米国上記JPG)は、実際に存在するなど、または「ビット・バイ・ビット値ストアドバリュー」、「ビット文字列値に格納された値に応じて」アプローチ「の文字列値によって記憶されたビット値」でありますビット値は、Redisのsetbitコマンドビットが順次設定使用して格納され、その値は、全体の数字列を埋めるために直接設定コマンドを使用して文字列として格納され、その後、全てのグループ全体は古い値を上書きします。ビット値によってビットのビット値によって提供される文字列の値に応じて、[ファイル](https://img2018.cnblogs.com/blog/1917499/202001/1917499-20200109105627165-928119545.jpg):!値を記憶され:! [ファイル(https://img2018.cnblogs.com/blog/1917499/202001/1917499-20200109105627404-2028624638.jpg)に対応するバイト文字が印刷できない場合、Redisのは、その16進数に戻ります請求値![ファイル](https://img2018.cnblogs.com/blog/1917499/202001/1917499-20200109105627864-356351549.jpg)は、実際には、上記の説明によって、私たちは私たちが望むの統計を完了しているが、aがありますプログラムに入ると、Redisのは、いくつかの統計がコマンド私を与えることができれば、その後、カウントするプログラムを使用した欠陥は、我々はすべての値を入れなければならないことです、我々はあなたが私たちが望む結果を得ると、よりクールなことができ、これらのコマンドを使用する必要があります、そしておめでとう、あなたは、Redisの私達の使用のための私達に2つの命令を提供して怠惰を盗むことができます。BITCOUNT:ビットマップの統計命令、指定したが表示されますの範囲内の数1。BITPOS:指定した範囲の最初の発生は0または1を見つけるために使用。だから、バックインタビューの質問の先頭に、我々はBITPOS回のユーザー最初の兆候を見つけるためにコマンドを使用して、BITCOUNTによりユーザーのサインその年の回数をカウントすることができます。我々は上記の2つの命令を使用するときにも開始[範囲を​​指定することができ、END]、または出席するための最初の日からのユーザのチェックインの特定の範囲内の回数をカウントするために使用されます。しかし、欠陥、我々は8の倍数の範囲を指定する必要があり、かつ任意に指定することはできませんので、バイトインデックスパラメータを開始および終了があります。私たちは月を数えてみたかったので、これはその月のデータが3バイトに散在することができるので、我々はデータの3つのすべてのバイトを取る必要があり、真実で、その後、メモリ内の部分文字列を取るしない場合があります統計。!私たちのsetbit上記の[ファイル](https://img2018.cnblogs.com/blog/1917499/202001/1917499-20200109105628120-1581342964.jpg)最後とgetbitは単一の値のみを操作している、我々は複数の操作をしたい場合値は、我々はパイプを使用することができますが、幸いredis3は、バッチ操作のビットフィールドコマンドの後に私たちを提供し、このコマンドは三つのサブコマンドは、指定されたビット・セグメントに読み書きできる、/ GET / incrby設定されています、しかしながら、連続処理することができるだけの64ビット、64以上のサブ複数の命令の使用を必要とし、異なるサブコマンドの使い捨てビットフィールドを複数とすることができる場合。サブタイム命令を複数用い![ファイル](https://img2018.cnblogs.com/blog/1917499/202001/1917499-20200109105628344-1178159605.jpg)次に、我々は最初の文字hを置き換えるために、設定されたサブコマンドを使用します。ここで、97ビットのASCIIコード、コマンドは、古い値を返します。![ファイル](https://img2018.cnblogs.com/blog/1917499/202001/1917499-20200109105628523-189536575。JPG)最後に、我々はincrbyサブコマンド、指定した範囲のインクリメント演算子内の場所にincrbyサブコマンドを見て、それはインクリメント演算子であるため、そのようなそして、整数を増やすよう、バイナリで表現できる範囲をそこに超える可能性がありますオーバーフロー上方、負の増加、下方にオーバーフローが存在するであろう、デフォルトポリシーは、オーバーフローが発生した場合、符号ビットは上オーバーフローに1 255から増加した後、そのような符号なしとして、直接廃棄し、され、発掘を取られるのRedisすべての符号ビットの最上位ビットが0である廃棄、0になった後後後に、そのような8ビット符号なし整数127は、1つは、それらのオーバーフローによりインクリメントされ、我々は最高の符号ビットは-128で捨てます。さらにはまた、折り畳まれたラップが飽和打ち切り誤差を行い、失敗していない、我々は手動米国オーバーフローサブ命令によっていくつかの方法を選択することができる座っ提供Redisの。ラップ折り畳まれるデフォルト:! [ファイル](https://img2018.cnblogs.com/blog/1917499/202001/1917499-20200109105630218-988166347.jpg)の例には、手動で座っ飽和切り捨て例:! [ファイル](設定しますhttps://img2018.cnblogs.com/blog/1917499/202001/1917499-20200109105632296-1630549088.jpg)与えられた例で見納めには、手動でセットアップを実行するために失敗することはない:! [ファイル](HTTPS://img2018.cnblogs .COM /ブログ/ 1917499/202001 / 1917499-20200109105634702-25059067.jpg)

おすすめ

転載: www.cnblogs.com/sheldon1988/p/12170259.html