redis - Redis 中超过 40 亿个键值对?

标签 redis

我正在尝试将 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/

相关文章:

caching - 像redis一样使用Elasticsearch作为键值缓存是否有意义

spring data redis集群管道支持

node.js - 我如何在redis中存储这种类型的嵌套对象?

javascript - Node redis 发布者消耗过多内存

python - 如何从redis获取客户端地址?

session - 如何处理基于redis的 session 过期?

redis - 是否有一种功能可以使 redis 中已排序集合的基数保持不变?

node.js - Redis发布内存泄漏?

concurrency - 两个进程可以使用 Watch 更改相同的 Redis 资源。我应该担心活锁吗?

redis - redis集群中一个master和它的slave故障时,redis会删除所有的key吗