摘要:但是無論如何,我都達到不了想要的執(zhí)行效率,最好的時候每秒查詢的數據都超不過條。效率一下子提高了上來,每秒查詢效率穩(wěn)穩(wěn)過次。
這兩天接了個任務,描述如下:
建立一套IP查詢系統,將IP對應到地區(qū),實現每秒千次以上的查詢。
1.MySQL+PHP的方式:將網上的數據源扒下來,一條一條放到mysql中,然后使用sql語句查詢,建立索引,
數據庫結構
SET FOREIGN_KEY_CHECKS=0;
-- Table structure for ip_address
DROP TABLE IF EXISTS ip_address;
CREATE TABLE ip_address (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
start_ip int(10) unsigned NOT NULL,
end_ip int(10) unsigned NOT NULL,
region varchar(50) NOT NULL,
address varchar(100) NOT NULL,
PRIMARY KEY (id),
KEY start (start_ip) USING BTREE,
KEY end (end_ip)
) ENGINE=MyISAM AUTO_INCREMENT=405037 DEFAULT CHARSET=utf8;
INSERT INTO ip_address VALUES ("1", "0", "16777215", "IANA保留地址", "CZ88.NET");
INSERT INTO ip_address VALUES ("2", "16777216", "16777471", "澳大利亞", "CZ88.NET");
INSERT INTO ip_address VALUES ("3", "16777472", "16778239", "福建省", "電信");
INSERT INTO ip_address VALUES ("4", "16778240", "16779263", "澳大利亞", "CZ88.NET");
INSERT INTO ip_address VALUES ("5", "16779264", "16781311", "廣東省", "電信");
.......
查詢數據的時候使用SELECT * FROM ip_address WHERE ip_startip <= ip AND ip_endip >= ip。
但是無論如何,我都達到不了想要的執(zhí)行效率,最好的時候每秒查詢的數據都超不過30條。
完成不了任務,只好去問問度娘。
2.diszuz中的實現方式:function convertip_tiny($ip, $ipdatafile) {
static $fp = NULL, $offset = array(), $index = NULL; $ipdot = explode(".", $ip); $ip = pack("N", ip2long($ip)); $ipdot[0] = (int)$ipdot[0]; $ipdot[1] = (int)$ipdot[1]; if($fp === NULL && $fp = @fopen($ipdatafile, "rb")) { $offset = @unpack("Nlen", @fread($fp, 4)); $index = @fread($fp, $offset["len"] - 4); } elseif($fp == FALSE) { return "- Invalid IP data file"; } $length = $offset["len"] - 1028; $start = @unpack("Vlen", $index[$ipdot[0] * 4] . $index[$ipdot[0] * 4 + 1] . $index[$ipdot[0] * 4 + 2] . $index[$ipdot[0] * 4 + 3]); for ($start = $start["len"] * 8 + 1024; $start < $length; $start += 8) { if ($index{$start} . $index{$start + 1} . $index{$start + 2} . $index{$start + 3} >= $ip) { $index_offset = @unpack("Vlen", $index{$start + 4} . $index{$start + 5} . $index{$start + 6} . "x0"); $index_length = @unpack("Clen", $index{$start + 7}); break; } } @fseek($fp, $offset["len"] + $index_offset["len"] - 1024); if($index_length["len"]) { return "- ".@fread($fp, $index_length["len"]); } else { return "- Unknown"; }
}
用的是二進制的文件,然后使用快速查找法:(折半查找法)。效率一下子提高了上來,每秒查詢效率穩(wěn)穩(wěn)過5000次。哈哈!
3.PHP擴展的方式:方式和PHP一樣的,不過使用了C語言,效率直接超過了50000(五萬)次。效率那就不用說了,核心代碼如下:
擴展地址:http://pecl.php.net/package/qqwry
下載后安裝方式按照phpize的方式即可
計入安裝目錄:
./phpize
./configure
make && makeinstall
然后要確保qqwry.so放到擴展目錄下,并添加php.ini:
extension=qqwry.so
OK,已經好了
static uint32_t search_index(const uint32_t ip,FILE *qqwry_file) { uint32_t index_ip; unsigned char head[8]; unsigned char index_bytes[7]; fread(head,8,1,qqwry_file); uint32_t index_start,index_end,index_mid; index_start = (uint32_t)LE_32(&head[0]); index_end = (uint32_t)LE_32(&head[4]); while (1) { if ((index_end-index_start)==7) { break; } //printf("index:%u:%u ",index_start,index_end); index_mid=index_end/7 - index_start/7; if (index_mid%2==0) { index_mid=index_mid/2; } else { index_mid=(index_mid+1)/2; } index_mid=index_start+index_mid*7; fseek(qqwry_file,index_mid,SEEK_SET); fread(index_bytes,7,1,qqwry_file); index_ip=(uint32_t)LE_32(&index_bytes[0]); if (index_ip==ip) { break; } else if (index_ipip) { fseek(qqwry_file,index_start,SEEK_SET); fread(index_bytes,7,1,qqwry_file); } return (uint32_t)LE_24(&index_bytes[4]);
}
這也是我目前為止找的效率最快的方式了,完全能夠買足公司的需求了。如果有能夠效率更高的方式,留個言哈。
所有需要的文件都可以從這里下載哈:
http://url.cn/QorZ2O
下載后把data.rar解壓到當前目錄,并執(zhí)行index.php就可以查看后面的兩種方式的執(zhí)行效率了(前提是,有裝qqwry擴展哈?。?/p>
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/20727.html
摘要:當前國內云計算服務仍處于單打獨斗,提供單向服務的階段,完整生態(tài)模式尚未搭建完成。注特別說明的是,評測期間我們隨機抽取了金山云位于北京區(qū)的機房用于驗證評測,屬傳統扁平網絡,此機房在本次報告發(fā)布時已不再售賣。 ? 報告電子版至聽云官方博客下載:http://blog.tingyun.com/web/a... 評測說明 評測目標:同一應用(網站)在不同云上的用戶訪問體驗,以及對云資源的使用洞...
摘要:信息服務產品頁信息服務產品優(yōu)勢原廠合作與原廠合作,保證數據準確性實時性。價格彈性低至元千次,可按次購買,按需使用,按實際用量計費,精確到元。用量熔斷接口有小時級別的次數限制,不用擔心因誤操作導致意外的大額費用。UCloud IP信息服務IP 庫是一個互聯網基礎數據,在做 CDN、DNS 智能解析、廣告定向投放、用戶地域分析、用戶定制化體驗等等諸多場景,IP 庫的準確與否對效果好壞有直接的影響...
摘要:是為互聯網服務的協議族,它是網絡通信協議的統稱,由和等協議組成。預告本周五更新面試常考題之會話控制和網絡協議,敬請期待。以上內容摘自程序員面試筆試寶典書籍,該書已在天貓京東當當等電商平臺銷售。 你好,是我琉憶,歡迎您來到PHP面試專欄。本周(2019.2-25至3-1)的一三五更新的文章如下: 周一:PHP面試??贾畷捒刂浦苋篜HP面試??贾W絡協議周五:PHP面試??碱}之會話控...
閱讀 2920·2021-11-19 09:40
閱讀 3604·2021-10-09 09:43
閱讀 2687·2021-09-22 15:31
閱讀 1739·2021-07-30 15:31
閱讀 791·2019-08-30 15:55
閱讀 3270·2019-08-30 15:54
閱讀 1172·2019-08-30 11:26
閱讀 1920·2019-08-29 13:00