Analisis contoh bitmap dalam redis
1. Apakah itu BitMap?
Menggunakan sedikit untuk mewakili nilai atau status elemen, dan elemen itu sendiri adalah kuncinya. Peta bit boleh menjimatkan ruang storan, kerana kita tahu bahawa 8 bit boleh membentuk satu Bait. 2^32 kuasa 4 bilion data hanya memerlukan 500M memori, iaitu 8 kali lebih sedikit memori
2 Pengenalan kepada arahan 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数量
Perangkap 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 #terus memberi anda lebih daripada 600 M memori
/** * 布隆过滤器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; } }
Atas ialah kandungan terperinci Analisis contoh bitmap dalam redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Mod Redis cluster menyebarkan contoh Redis ke pelbagai pelayan melalui sharding, meningkatkan skalabilitas dan ketersediaan. Langkah -langkah pembinaan adalah seperti berikut: Buat contoh Redis ganjil dengan pelabuhan yang berbeza; Buat 3 contoh sentinel, memantau contoh redis dan failover; Konfigurasi fail konfigurasi sentinel, tambahkan pemantauan maklumat contoh dan tetapan failover; Konfigurasi fail konfigurasi contoh Redis, aktifkan mod kluster dan tentukan laluan fail maklumat kluster; Buat fail nodes.conf, yang mengandungi maklumat setiap contoh Redis; Mulakan kluster, laksanakan perintah Buat untuk membuat kluster dan tentukan bilangan replika; Log masuk ke kluster untuk melaksanakan perintah maklumat kluster untuk mengesahkan status kluster; buat

Redis menggunakan jadual hash untuk menyimpan data dan menyokong struktur data seperti rentetan, senarai, jadual hash, koleksi dan koleksi yang diperintahkan. Redis berterusan data melalui snapshots (RDB) dan menambah mekanisme tulis sahaja (AOF). Redis menggunakan replikasi master-hamba untuk meningkatkan ketersediaan data. Redis menggunakan gelung acara tunggal untuk mengendalikan sambungan dan arahan untuk memastikan atom dan konsistensi data. Redis menetapkan masa tamat tempoh untuk kunci dan menggunakan mekanisme memadam malas untuk memadamkan kunci tamat tempoh.

Untuk melihat semua kunci di Redis, terdapat tiga cara: Gunakan perintah kunci untuk mengembalikan semua kunci yang sepadan dengan corak yang ditentukan; Gunakan perintah imbasan untuk melangkah ke atas kunci dan kembalikan satu set kunci; Gunakan arahan maklumat untuk mendapatkan jumlah kunci.

Langkah-langkah untuk menyelesaikan masalah yang tidak dapat dijumpai oleh Redis-Server: periksa pemasangan untuk memastikan Redis dipasang dengan betul; Tetapkan pembolehubah persekitaran redis_host dan redis_port; Mulakan Redis Server Redis-server; Semak sama ada pelayan sedang menjalankan ping redis-cli.

Redis memerintahkan set (ZSET) digunakan untuk menyimpan elemen yang diperintahkan dan disusun mengikut skor yang berkaitan. Langkah -langkah untuk menggunakan ZSET termasuk: 1. Buat zset; 2. Tambah ahli; 3. Dapatkan skor ahli; 4. Dapatkan kedudukan; 5. Dapatkan ahli dalam julat ranking; 6. Padam ahli; 7. Dapatkan bilangan elemen; 8. Dapatkan bilangan ahli dalam julat skor.

Untuk melihat nombor versi REDIS, anda boleh menggunakan tiga kaedah berikut: (1) Masukkan arahan INFO, (2) Mulakan pelayan dengan pilihan --version, dan (3) Lihat fail konfigurasi.

Redis menggunakan lima strategi untuk memastikan keunikan kekunci: 1. Pemisahan ruang nama; 2. Struktur data hash; 3. Tetapkan struktur data; 4. Karakter Khas Kekunci String; 5. Pengesahan skrip Lua. Pilihan strategi khusus bergantung kepada organisasi data, prestasi, dan keperluan skalabilitas.

Kaunter Redis menyediakan struktur data untuk menyimpan dan mengendalikan kaunter. Langkah -langkah khusus termasuk: Buat kaunter: Gunakan perintah Incr untuk menambah 1 ke kekunci yang ada. Dapatkan nilai kaunter: Gunakan arahan GET untuk mendapatkan nilai semasa. Kaunter kenaikan: Gunakan perintah Inter, diikuti dengan jumlah yang akan ditingkatkan. Kaunter pengurangan: Gunakan perintah Dec Dec atau Decrby untuk menurun sebanyak 1 atau tentukan jumlahnya. Tetapkan semula kaunter: Gunakan arahan set untuk menetapkan nilainya kepada 0. Di samping itu, kaunter boleh digunakan untuk mengehadkan kadar, pengesanan sesi, dan membuat sistem pengundian.
