本文部分翻譯自《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系統的使用者來說完成上面的任務就有些...