在一些大數據處理中,咱們須要用到IP地址查詢,通常爲了查詢一個IP屬於哪一個地址,咱們一般須要根據一個IP數據庫來查詢,網絡上比較經常使用的IP庫是純真IP數據庫。IP數據庫裏面的記錄通常存儲方式爲IP的開始和結束的數字段,好比 "221.179.172.1-221.179.175.254 中國移動/北京市" 咱們一般把IP轉換爲長整型存儲爲"3719539713,3719540734,中國移動,北京市",咱們查詢的時候就能夠 先把IP轉換爲長整型,而後去大於開始,小於結束這個條件去查詢,可是通常IP數據庫都有幾十萬條數據,咱們去這樣查詢,即便創建索引或者所有放到內存查詢,效率仍是不過高,一般1秒查詢幾百次,看上去效率已經很高了,可是試想若是我要查詢1億次,就須要幾百個小時,在作大數據量數據處理的時候,這個速度仍是很慢的。redis
爲了提升查詢速度,咱們引入redis,redis是目前熱門的Nosql數據庫,不少大的公司都在用,具體的用法你們能夠查查資料,redis中有一種數據結構是有序集合 sortset,個人IP數據庫能夠轉化爲sortset存儲, 一個sortset中存儲全部的IP記錄(全部的IP地址區間不容許重複),結構爲value中存儲IP的開始(長整型),結束(長整型),省份等,分別依照逗號隔開,score中存放的是IP的結束值(長整型)sql
舉例爲數據庫
value scorewindows
1,5,中國移動,北京市 5微信
10,20,中國聯通,上海市 20網絡
好比咱們查詢一個IP,IP轉化爲長整型的數字爲 2,而後咱們查詢的時候就經過sortset 的zrangebyscore ranges 2 +inf LIMIT 0 1 這樣咱們就查詢出來大於2的第一條記錄,這樣咱們查詢出來記錄爲 「1,5,中國移動,北京市」 而後咱們在判斷一下 咱們要查詢的地址在不在 1,5之間,2在1,5之間,因此查出來了2對應的IP地址爲中國移動北京市,再好比咱們要查詢的IP地址數字爲 8,經過zrangebyscore ranges 8 +inf LIMIT 0 1 咱們查詢到了 10,20,中國聯通,上海市,可是8不在10,20之間,因此查詢不到此IP對應的地址。數據結構
經過這個思路,我寫了個測試程序,100000次查詢,IP記錄172738條,耗時5.2秒左右,差很少一秒鐘兩萬次,我在windows下測試的,機器配置(固態硬盤)爲工具
redis記錄:測試
程序運行結果大數據
固然我這個模擬測試,不是真實的IP地址,若是換成真實的IP,差距多大,你們自行驗證。
參考
https://groups.google.com/forum/#!topic/redis-db/lrYbkbxfQiQ
文章出處:http://www.cnblogs.com/weiguang3100/
在線工具:http://51tools.info
.NET 開發交流關注微信公衆號
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接。