我有关键值,例如以下示例
KEY VALUE
key1 1
key2 2
key3 3
. .
. .
keyN N
我的每个键都需要映射一个唯一的数字,所以我将我的键映射到自动递增的数字,然后通过redis mass insertion将其插入Redis,效果非常好,然后使用GET命令对所有键进行内部处理价值映射。
但是我的密钥超过10亿,所以我想知道在这种情况下使用Redis的效率是否更高(主要是内存使用量更少)?
由于
答案 0 :(得分:1)
自动增量键允许在将新记录插入表/ redis时生成唯一编号。
还有其他使用UUID的方法。
但是我认为自动增量要好得多,因为它需要四倍的空间,无法根据键等进行排序
答案 1 :(得分:1)
我在做完全一样的事情。 这是一个简单的例子。 如果您有更好的选择,欢迎讨论:)
import redis
pool = redis.ConnectionPool(host=your_host, port=your_port)
r = redis.Redis(connection_pool=pool)
def my_incr(pipe):
next_value = pipe.hlen('myhash')
pipe.multi()
pipe.hsetnx(
name='myhash',
key=newkey, value=next_value
)
pipe = r.pipeline()
newkey = 'key1'
r.transaction(my_incr, 'myhash')
答案 2 :(得分:0)
您可以将命令传递到Redis以避免这样的往返时间:
{ for ((i=0;i<10000000;i++)) ; do printf "set key$i $i\r\n"; done ; sleep 1; } | nc localhost 6379
设置10,000,000个密钥需要80秒。
或者,如果您想避免为printf
创建所有这些流程,请在单个awk
流程中生成数据:
awk 'BEGIN{for(i=0;i<10000000;i++){printf("set key%d %d\r\n",i,i)}}'; sleep 1; } | nc localhost 6379
现在需要17秒来设置10,000,000个密钥。
答案 3 :(得分:0)
为了提高内存效率,您可以使用HASH
来存储这些键值对。 Redis对小HASH
具有特殊编码。它可以为你节省大量的内存。
在您的情况下,您可以将密钥分成许多小HASH
个,每个HASH
的条目少于hash-max-ziplist-entries
个。有关详细信息,请参阅doc。
B.T.W,使用INCR
命令,您可以使用Redis创建自动递增的数字。
答案 4 :(得分:0)
我想回答我自己的问题。
如果对键值进行了排序,则批量插入然后读取它们的最有效方法是使用基于B树的数据库。
例如,使用MapDB,我可以非常快速地插入它,并且占用更少的内存。