我正在尝试将 ip 号码与关联的 ISP 信息一起存储在 redis 中。我有 Maxmind 数据,csv 文件包含每个 ISP 的开始和结束编号。
在 SQL 中查询时,我可以检查某个 IP(在将其转换为数字后)是否在某个范围内可用并获取关联的 ISP。
我正在考虑将所有范围转换为单个数字并在 Redis 中提交所有键值对以便更快地查找。 这大约会在 Redis 存储中产生 40 亿个键值对。 我已经为几亿个键值对完成了此操作,但在移动到 Redis 中的 40 亿对时,我正在寻找建议/建议。 我必须注意的任何性能问题或有什么方法可以做得更好?
感谢您的所有建议。
更新:多亏了下面的建议,我才能使它正常工作。 以为我会在这里分享 Python 代码(快速而肮脏):
import redis import 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;') result = cur.fetchall() r = redis.StrictRedis(host='localhost', port=6379, db=0) ispctr = 1 for row in result: tempDict = {'ispname':row[2],'fromval':row[0],'toval':row[1]} namefield = ispctr r.hmset(namefield,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'] for ip in ipstotest: 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]) print tempval2['ispname']
最佳答案
我认为这是错误的做法。
将 IP 映射保持为整数范围(从 IP - 到 IP,converted to decimal)并使用传统数据库或使用比较强的 NoSQL 快速查询您的主题 IP。
关于redis - Redis 中超过 40 亿个键值对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10478794/