bloom filter是我目前看到的最經典的算法之一,用很是低的錯誤率換取很是高的時間、空間的效率,在各類海量數據場景或者須要快速判斷的場景中都獲得了大量的使用,可是,在國內的互聯網,至少公開的研究中,還不多有人把這個當成一個課題來研究,也沒有一個系統級別的開源的實現。php
mc_bloom_filter 是用memcached的協議來封裝的bloom filter的操做,犧牲了一些bloom filter的特性,來成全全部的語言能使用這一高效的工具,這是這個項目開發的目標。html
鑑於google code 一直被牆,我決定用這篇博客來代替google code。java
https://code.google.com/p/mc-bloom-filter/python
多線程版本:mc_bloom_filter-multi-threads-v0.3betagit
單線程版本:mc_bloom_filter-v0.2beta1github
開發設計文檔:mc_bloom_filter設計文檔web
效率測試文檔:mc_bloom_filter各版本測試結果算法
Bloom filter 是由 Howard Bloom 在 1970 年提出的二進制向量數據結構,它具備很好的空間和時間效率,被用來檢測一個元素是否是集合中的一個成員,被普遍使用於各類海量數據排重的場景中。Mc bloom filter是一個全新的排重服務器,它採用memcached的網絡層封裝了bloom filter的操做,使各類語言php、java、perl、python、go、c等等,都能使用memcached的協議進行bloom filter的操做。服務器
bloom_filter的百度百科 Google黑板報 bloom filter算法詳細介紹
1.徹底採用memcached的網絡層協議,建立、刪除、添加、查看狀態等。
2.mc bloom filter 是一個全內存的排重服務器,全部數據均放在內存中。
3.能夠在一個實例中建立多個bloom filter,在內存容許的狀況,能夠建立幾十G大小的bloom filter,支持最高上 百億 的數據排重。
4.採用google員工寫的的高性能hash算法murmurhash,保證bloom filter的hash的高速
5.單線程版單機讀寫速度能達到十萬次/s(同網段兩臺服務器多線程壓力測試 服務器配置:8核 Intel(R) Xeon(R) CPU E5620 @ 2.40GHz 12G內存)
6.多線程版單機讀寫能力均能達到30萬次/s(同網段兩臺服務器多線程壓力測試 服務器配置:8核 Intel(R) Xeon(R) CPU E5620 @ 2.40GHz 12G內存)
7.32位、64位服務器兼容。
bloom filter 使用memcached網絡層,依賴於libevent,先登陸http://libevent.org/ 下載最新穩定版本。
1
2
3
4
5
|
wget https:
//github
.com
/downloads/libevent/libevent/libevent-2
.0.20-stable.
tar
.gz
tar
zxvf libevent-2.0.20-stable.
tar
.gz
cd
libevent-2.0.20-stable
.
/configure
make
&&
make
install
|
在bloom filter 的google code 上,下載mc bloom filter的最新穩定版本
1
2
3
4
5
6
|
1.wget bloom filter的最新穩定版本
2.修改Makefile文件,主要是修改libevent到你的目錄
3.在目錄中執行
make
,生成mc_bloom_filter【線上版】 mc_bloom_filter_【調試版】 兩個可執行文件,調試版會打不少日誌
4.
nohup
.
/mc_bloom_filter
-p12345 -d -uroot -m4000 –p
/tmp/mc_bloom_filter
.pid –l127.0.0.1
日誌文件就是當前目錄的
nohup
.out文件
|
參數 | 是否必須 | 值的含義 |
p(小p) | 是 | 監聽端口,默認12345 |
P(大P) | 是 | pid文件的地址 |
u(小u) | 是 | 用哪一個用戶運行 |
m(小m) | 是 | 最大內存,單位m |
d(小d) | 是 | 是否用daemon後臺運行 |
l(小l) | 是 | 監聽的ip |
t | 否 | 表示線程個數,只多線程版本有此參數,單線程無此參數,t默認爲4 |
v | 否 | 是否將調試的輸出打印出來,若是添加這個參數,會在終端或者nohup.out中打印調試信息 |
add | add key 0 0 value_lengthexpected_max_amount_of_elements|false_positive_rate好比add test 0 0 131000000|0.001 表示建立一個預計存100萬,誤判率千分之一的bloom filter | 成功返回STORED 失敗返回NOT_STORED |
set | set key 0 0 subkey_lengthsubkey | 成功返回STORED 失敗返回NOT_STORED |
get | get key|subkey | 存在返回1,不存在啥都不返回 |
stats | stats 查看服務器的整體情況 | 信息列表 |
stats blooms | 列舉全部過濾器的名稱和佔用內存字節大小 | 信息列表 |
stats bloom key | 能夠查看名字爲key的bloom filter的詳細信息 | 信息列表 |
try | try expected_max_amount_of_elements|false_positive_rate好比 try 100000000|0.0001 表示計算1億個目標存儲數,在誤判率萬分之一的狀況下,須要的內存大小用來預估過濾器所需的內存大小和hash函數個數 | 信息列表 |
setmem | setmem size(Mbytes) 用來設定當前進程可以使用的內存容量,單位是m,好比要設置內存1G,setmem 1024 成功返回STORED | 成功返回STORED,失敗返回NOT_STORED |
PHP 的使用demo
1
2
3
4
5
6
|
<?php
$mc
=
new
Memcache();
$mc
-> add(
"my_bloom"
,
"10000000|0.0001"
);
$mc
-> set(
"my_bloom"
,
"2222222"
);
var_dump(
$mc
->get(
"my_bloom|2222222"
);
?>
|