1. BitMap とは
ビットを使用して要素の値またはステータスを表し、要素自体がキーとなります。 8 ビットで 1 バイトを形成できることがわかっているため、ビットマップはストレージ スペースを大幅に節約できます。 2 の 32 乗 40 億のデータに必要なメモリは 500M だけで、これは 8 分の 1 のメモリです
2. setbit コマンドの概要
setbit key offset value #设置bitmapkey为20220328 uid为100的用户已签到1 setbit 20220320 100 1 setbit 20220320 200 1 setbit 20220321 100 1 setbit 20220321 300 1 getbit 20220320 100 #返回1,说明这个用户已签到了 bitcount 20220320 #获取bitmap数量
ビットマップの落とし穴
127.0.0.1:6400> setbit bittest 100 1 #设置不存在的offset返回0 (integer) 0 127.0.0.1:6400> setbit bittest 100 1 #设置已存在的offset返回1 (integer) 1
setbit maxKey 4000000000 1 #600M 以上のメモリを直接入手
/** * 布隆过滤器bloom Filter * 1.百万分之一的概率哈希冲突,所以有存在的不一定存在,但是不存在的百分百不存在 * 2.不能删除,删除的时候不能简单的直接置为0,可能会影响其他元素的判断,其实问题不大一般生产数据也不会删除的,都是软删除 * 3.新增数据时候写入bloom Filter * 4.2^32次方40亿数据内存占用才600M,超级省内存,查找速度非常快,160M内存可以在千万级数据做到1%的误判 * 5.bitmap根据offset去申请内存的,所以要省内存的情况要限制offset值 */ public function bloomAction(){ $t1 = time(); for($i=0;$i<99;$i++){ $bl = new BloomFilter(); //$str = "1https://arnaud.le-blanc.net/php-rdkafka-doc/phpdoc/book.rdkafka.html?id=".time(); $str = "https://dasda.le-blanc.net/php-rdkafka-doc/phpdoc/book.rdkafka.html?id=".mt_rand(1,99999999); p($str); $res1 = $bl->JSHash($str);//两次哈希3s,md5哈希重复的概率是百万分之一 p($res1); } //p($res); $t2 = time(); echo $t2-$t1; } /** * 布隆过滤器初始化 bloom Filter 执行 php index.php "index/demo/loadDb2bloom" */ public function isExistBloomAction(){ $redis = redisCursor(); $email = input("email","","trim"); $tel = input("tel",""); $result = false; $msg = ""; if(filter_var($email,FILTER_VALIDATE_EMAIL)){ $key1 = "bloom_user_email"; $offset = BloomFilter::JSHash($email); $result = $redis->getbit($key1,$offset); $msg = $email; }elseif($tel){ $key2 = "bloom_user_telephone"; $offset = BloomFilter::JSHash($tel); $result = $redis->getbit($key2,$offset); $msg = $tel; } $result?apiSuccess($msg.",已存在"):apiError($msg.",不存在"); } /** * 布隆过滤器初始化 bloom Filter 执行 php index.php "index/demo/loadDb2bloom" */ public function loadDb2bloomAction(){ $time1 = time(); $redis = redisCursor(); $key1 = "bloom_user_email"; $key2 = "bloom_user_telephone"; //setbit() offset 必须是数字,value必须是1或0 //$redis->setbit($key,30,1); $table = "user"; $pkid = "id"; $field1 = "email"; $field2 = "telephone"; $maxid = Db::name($table)->max($pkid); $size = 5000; $page = ceil($maxid/$size); for($i=0;$i<$page;$i++){ $start = $i*$size; $where = " $pkid between ".$start." and ".($start+$size); $res = Db::name($table)->where($where)->field("$field1,$field2")->select(); if($res){//同步到bitmap foreach($res as $k=>$v){ //布隆过滤器 1.存在的不一定存在, 2.不存在的100%不存在(原因,哈希冲突可能用100W分之一的可能重复) //所以注册的时候判断不存在的,百分百可以注册,存在的可以查询一下数据库是否真的不存在 $value1 = BloomFilter::JSHash($v["$field1"]); $value2 = BloomFilter::JSHash($v["$field2"]); $redis->setbit($key1,$value1,1);//email去重 $redis->setbit($key2,$value2,1);//mobile去重 } } $time2 = time(); echo $where." 消耗时间 ".($time2-$time1).PHP_EOL; } $time3 = time(); echo " 总消耗时间 ".($time3-$time1).PHP_EOL; }
<?php class BloomFilter { /** * 下面的哈希函数随便用一个都行,都是把字符串转换成数字 */ /** * hash方法类 * 由Justin Sobel编写的按位散列函数 * update:Denny * 返回之前做了内存限制在160M,超过10亿的哈希后的数值,把它限制在10亿内,此时1000W的数据可做到1%误判,内存不差这600多M的话就别限制了 * 因为redis的bitmap申请内存是看offset申请内存的,setbit mykey 400000000 1,这样直接申请了600M内存 */ public static function JSHash($string, $limitMemory=true,$len = null) { $hash = 1315423911; $len || $len = strlen($string); for($i = 0; $i < $len; $i++) { $hash ^= (($hash << 5) + ord($string[$i]) + ($hash >> 2)); } $hashNum = ($hash % 0xFFFFFFFF) & 0xFFFFFFFF; //为了节省内存,超过10亿就对半拆,10亿,这时候大约是130M内存占用,千万级数据可以做到1%误判率,内存足够可以不用判断,直接生成就行了 //如果数据过4000W的话不用限制了,因为生成的数据最大也是2^32次方40多亿,此时内存占用大概在600M封顶了 if($limitMemory){ if($hashNum>4000000000){ $hashNum = intval($hashNum/5); }elseif($hashNum>3000000000){ $hashNum = intval($hashNum/4); }elseif($hashNum>2000000000){ $hashNum = intval($hashNum/3); } } return $hashNum; } }
以上がRedis でのビットマップ例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Redisの主な機能には、速度、柔軟性、豊富なデータ構造のサポートが含まれます。 1)速度:Redisはメモリ内データベースであり、読み取り操作はほとんど瞬間的で、キャッシュとセッション管理に適しています。 2)柔軟性:複雑なデータ処理に適した文字列、リスト、コレクションなど、複数のデータ構造をサポートします。 3)データ構造のサポート:さまざまなビジネスニーズに適した文字列、リスト、コレクション、ハッシュテーブルなどを提供します。

Redisのコア関数は、高性能のメモリ内データストレージおよび処理システムです。 1)高速データアクセス:Redisはデータをメモリに保存し、マイクロ秒レベルの読み取り速度と書き込み速度を提供します。 2)豊富なデータ構造:文字列、リスト、コレクションなどをサポートし、さまざまなアプリケーションシナリオに適応します。 3)永続性:RDBとAOFを介してディスクにデータを持続します。 4)サブスクリプションを公開:メッセージキューまたはリアルタイム通信システムで使用できます。

Redisは、次のようなさまざまなデータ構造をサポートしています。1。文字列、単一価値データの保存に適しています。 2。キューやスタックに適したリスト。 3.非重複データの保存に使用されるセット。 4。ランキングリストと優先キューに適した注文セット。 5。オブジェクトまたは構造化されたデータの保存に適したハッシュテーブル。

Redisカウンターは、Redisキー価値ペアストレージを使用して、カウンターキーの作成、カウントの増加、カウントの減少、カウントのリセット、およびカウントの取得など、カウント操作を実装するメカニズムです。 Redisカウンターの利点には、高速速度、高い並行性、耐久性、シンプルさと使いやすさが含まれます。ユーザーアクセスカウント、リアルタイムメトリック追跡、ゲームのスコアとランキング、注文処理などのシナリオで使用できます。

Redisコマンドラインツール(Redis-Cli)を使用して、次の手順を使用してRedisを管理および操作します。サーバーに接続し、アドレスとポートを指定します。コマンド名とパラメーターを使用して、コマンドをサーバーに送信します。ヘルプコマンドを使用して、特定のコマンドのヘルプ情報を表示します。 QUITコマンドを使用して、コマンドラインツールを終了します。

Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

Redisのキューを読むには、キュー名を取得し、LPOPコマンドを使用して要素を読み、空のキューを処理する必要があります。特定の手順は次のとおりです。キュー名を取得します:「キュー:キュー」などの「キュー:」のプレフィックスで名前を付けます。 LPOPコマンドを使用します。キューのヘッドから要素を排出し、LPOP Queue:My-Queueなどの値を返します。空のキューの処理:キューが空の場合、LPOPはnilを返し、要素を読む前にキューが存在するかどうかを確認できます。

RedisクラスターでのZsetの使用:Zsetは、要素をスコアに関連付ける順序付けられたコレクションです。シャード戦略:a。ハッシュシャーディング:ZSTキーに従ってハッシュ値を分配します。 b。範囲シャード:要素スコアに従って範囲に分割し、各範囲を異なるノードに割り当てます。操作の読み取りと書き込み:a。読み取り操作:ZSetキーが現在のノードのシャードに属している場合、ローカルで処理されます。それ以外の場合は、対応するシャードにルーティングされます。 b。書き込み操作:Zsetキーを保持しているシャードに常にルーティングされます。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)
