基於redis的IP位址快速查詢

2022-01-17 01:57:52 字數 1366 閱讀 6085

在一些大資料處理中,我們需要用到ip位址查詢,一般為了查詢乙個ip屬於哪個位址,我們通常需要根據乙個ip資料庫來查詢,網路上比較常用的ip庫是純真ip資料庫。ip資料庫裡面的記錄一般儲存方式為ip的開始和結束的數字段,比如 "221.179.172.1-221.179.175.254 中國移動/北京市" 我們通常把ip轉換為長整型儲存為"3719539713,3719540734,中國移動,北京市",我們查詢的時候就可以 先把ip轉換為長整型,然後去大於開始,小於結束這個條件去查詢,但是一般ip資料庫都有幾十萬條資料,我們去這樣查詢,即使建立索引或者全部放到記憶體查詢,效率還是不太高,通常1秒查詢幾百次,看上去效率已經很高了,但是試想如果我要查詢1億次,就需要幾百個小時,在做大資料量資料處理的時候,這個速度還是很慢的。

為了提高查詢速度,我們引入redis,redis是目前熱門的nosql資料庫,很多大的公司都在用,具體的用法大家可以查查資料,redis中有一種資料結構是有序集合 sortset,我的ip資料庫可以轉化為sortset儲存, 乙個sortset中儲存所有的ip記錄(所有的ip位址區間不允許重複),結構為value中儲存ip的開始(長整型),結束(長整型),省份等,分別依照逗號隔開,score中存放的是ip的結束值(長整型)

舉例為

value                          score

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位址快速切換 當前筆記本的可移動性增強,我們需要在多個環境下接入網路開始工作,在沒有路由器自動分配的情況下,就需要每次手動設定ip位址和閘道器等資訊,相當煩瑣,通過實踐利用netsh命令用快捷方式實現了ip位址的快速切換。a.基本用法 1,新建記事本,寫入如下資訊 int ip se...

快速切換IP位址

echo off rem 設定變數 set name1 本地連線 set w name1 無線網路連線 set addr1 172.16.87.141 set mask1 255.255.255.0 set gateway1 172.16.87.224 set dns11 8.8.8.8 set d...

《IP Address》快速檢視當前裝置IP

如何快速檢視自己裝置真實的ip位址,並獲得ip所在的國家或地區?這款名為 ip address 的chrome擴充套件可以幫到你 ip address的使用方法非常簡單,而且可以實時檢測網路ip的變化,並顯示ip所在的國家或地區 通過 待查詢的ip位址的方式獲取相關資訊 是乙個靜態頁面 然後用程式對...