我正在尝试将 ip 号码与相关的 ISP 信息一起存储在 redis 中。我有 Maxmind 数据,csv 文件包含每个 ISP 的开始和结束编号。
在 SQL 中查询时,我可以检查 IP(在将其转换为数字后)是否在某个范围内可用并获取相关的 ISP。
我正在考虑将所有范围转换为单独的数字,并在 Redis 中提交所有键值对以便更快地查找。这大约会在 Redis 存储中产生 40 亿个键值对。我已经为几亿个键值对做了这个,但是当我在 Redis 中移动到 40 亿对时,我正在寻找建议/建议。我必须注意的任何性能问题,或者有什么方法可以更好地做到这一点?
感谢您的所有建议。
更新:感谢下面的建议,我可以得到这个工作。以为我会在这里分享 Python 代码(又快又脏):
导入redis 导入 pymysql conn = pymysql.connect(host='localhost',user='user',passwd='password',db='foo') cur = conn.cursor() cur.execute('select startipnum,endipnum,isp from wiki.ipisp order by endipnum;') 结果 = cur.fetchall() r = redis.StrictRedis(host='localhost', port=6379, db=0) ispctr = 1 结果中的行: tempDict = {'ispname':row[2],'fromval':row[0],'toval':row[1]} 名称字段 = ispctr r.hmset(名称字段,tempDict) r.zadd('ispmaxindex',row[1],namefield) ispctr = ispctr+1 conn.close() ipstotest = ['23.23.23.23','24.96.185.10','203.59.91.235','188.66.105.50','99.98.163.93'] 对于 ipstotest 中的 ip: ipvalsList = [int(ipoct) for ipoct in ip.split('.')] ipnum = (16777216*ipvalsList[0]) + (65536*ipvalsList[1]) + (256*ipvalsList[2]) + ipvalsList[3] ipnum = long(ipnum) tempVal1 = r.zrangebyscore('ispmaxindex',ipnum,float('Inf'),0,1) tempval2 = r.hgetall(tempval1[0]) 打印 tempval2['ispname']