Redis键具有增量整数值

时间:2018-01-25 16:34:23

标签: redis

我有关键值,例如以下示例

KEY VALUE
key1    1
key2    2
key3    3
.       .
.       .
keyN    N

我的每个键都需要映射一个唯一的数字,所以我将我的键映射到自动递增的数字,然后通过redis mass insertion将其插入Redis,效果非常好,然后使用GET命令对所有键进行内部处理价值映射。

但是我的密钥超过10亿,所以我想知道在这种情况下使用Redis的效率是否更高(主要是内存使用量更少)?

由于

5 个答案:

答案 0 :(得分:1)

自动增量键允许在将新记录插入表/ redis时生成唯一编号。

还有其他使用UUID的方法。

但是我认为自动增量要好得多,因为它需要四倍的空间,无法根据键等进行排序

答案 1 :(得分:1)

我在做完全一样的事情。 这是一个简单的例子。 如果您有更好的选择,欢迎讨论:)

1。连接到Redis

import redis
pool = redis.ConnectionPool(host=your_host, port=your_port)
r = redis.Redis(connection_pool=pool)

2。定义一个函数以使用管道

def my_incr(pipe):
    next_value = pipe.hlen('myhash')
    pipe.multi()
    pipe.hsetnx(
        name='myhash',
        key=newkey, value=next_value
    )

3。使函数成为事务

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,我可以非常快速地插入它,并且占用更少的内存。