Redis應用 查詢IP所屬城市以及國家

2021-07-14 04:09:51 字數 2153 閱讀 2864

本文部分翻譯自《redis in action》(josiah l carlson)。

利用ip定位使用者以提供地方化的服務是目前web的常用做法。使用redis,我們可以很方便的實現該功能。

我們可以建立兩張表,分別對應以上兩個csv檔案。

第一張表,我們可以將其放入zset中並以城市id為member,以ip為score。當然,這裡我們會對ip做一定的轉換(即通過a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d轉換為乙個整數)以達到該目的,具體的**實現如下:

def ip_to_score(ip_address):

score = 0

for v in ip_address.split('.'):

score = score * 256 + int(v, 10)

return score

接下來,我們就可以將資料庫匯入了,因為乙個城市會對應多個ip,因此我們可以利用zset的特性,記錄城市id對應的第乙個ip位址,通過ip範圍來定位城市(具體之後來看)。以下是資料匯入的**:
def import_ips_to_redis(conn, filename):

csv_file = csv.reader(open(filename, 'rb'))

for count, row in enumerate(csv_file):

start_ip = row[0] if row else ''

if 'i' in start_ip.lower():

continue

if '.' in start_ip:

start_ip = ip_to_score(start_ip)

elif start_ip.isdigit():

start_ip = int(start_ip, 10)

else:

continue

city_id = row[2] + '_' + str(count)

conn.zadd('ip2cityid:', city_id, start_ip)

另外一張表當然就是城市id與詳情的對映關係,可以用hash來實現:

def import_cities_to_redis(conn, filename):

for row in csv.reader(open(filename, 'rb')):

if len(row) < 4 or not row[0].isdigit():

continue

row = [i.decode('latin-1') for i in row]

city_id = row[0]

country = row[1]

region = row[2]

city = row[3]

conn.hset('cityid2city:', city_id,

json.dumps([city, region, country]))

之前,我們利用zset建立了一張城市id與起始ip位址的對應表。要查詢乙個ip,我們首先需要使用與之前一樣的辦法,即將ip轉換為10進製整數。之後找到比該ip值相等或較小的最大起始ip。

之前已經提到,之所以用到zset,就是方便這裡的查詢。即我們可以利用zrevrangebyscore,通過傳遞start=0,num=1,從而實現預想的查詢方法。正確獲取城市id後,我們再利用id到城市id與資訊對映表(hash)中查詢到對應的城市資訊。

具體的實現**如下:

def find_city_by_ip(conn, ip_address):

if isinstance(ip_address, str):

ip_address = ip_to_score(ip_address)

city_id = conn.zrevrangebyscore(

'ip2cityid:', ip_address, 0, start=0, num=1)

if not city_id:

return none

city_id = city_id[0].partition('_')[0]

return json.loads(conn.hget('cityid2city:', city_id))

查詢IP所屬地

做了查詢ip所屬地的程式,將過程記錄如下 1,建立資料庫 得到的是乙個.dat檔案,通過iplook工具轉換成了.txt格式的,然後匯入了access中,最後匯入到ms sqlserver中.ip資料庫有三個字段,startip decimal 18,0 endip decimal 18,0 add...

如何使用SQL查詢IP位址所屬IP段

最近有個朋友說他要做的人員註冊量的統計,有兩張表,一張是使用者登錄檔,一張是ip段對應城市表。需要根據使用者註冊時的ip查詢到對應的城市,從而知道該城市有多少人註冊。其實沒什麼,關鍵是ip位址和ip段的匹配問題。一開始,我使用的是between,結果顯然是不行的。最後我想到用函式直接將192.168...

IP位址所屬運營商查詢

對於 經營者或網路技術人員來說,經常會碰到要確定乙個特定的ip位址是屬於那家isp的這樣的問題。對於使用unix類系統的使用者來說,這個問題很好解決,只要執行whois ip就可以得到有關的資訊。因為windows系統沒有whois命令,所以對於使用windows系統的使用者來說完成上面的任務就有些...