具有增量整数值的Redis键

uxhixvfz  于 2023-03-22  发布在  Redis
关注(0)|答案(5)|浏览(158)

我有像下面这样的key-values:

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

我的每个键都需要Map一个唯一的数字,所以我把我的键Map到自动递增的数字,然后通过redis mass insertion将其插入Redis,这很好用,然后使用GET命令对所有键值Map进行内部处理。
但是我有超过10亿个密钥,所以我想知道是否有更有效的方法(主要是更少的内存使用)使用Redis来解决这个问题?

i7uq4tfw

i7uq4tfw1#

你可以将命令管道化到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

现在设置1000万个键需要17秒。

krugob8w

krugob8w2#

自动递增键允许在将新记录插入表/redis时生成唯一的编号。
还有其他使用UUID的方法。
但我认为自动增量是更好的原因,如它需要四倍以上的空间,排序不能做的基础上,关键等

5sxhfpxr

5sxhfpxr3#

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

1.连接redis

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

2.定义一个函数incr,使用管道

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')
xj3cbfub

xj3cbfub4#

为了更节省内存,你可以使用HASH来存储这些键值对。Redis对小的HASH有特殊的编码。它可以保存你很多内存。
在这种情况下,你可以将你的密钥分割成许多小的HASH,每个HASH的条目少于hash-max-ziplist-entries。有关详细信息,请参阅doc
顺便说一下,通过INCR命令,您可以使用Redis创建自动递增的数字。

k0pti3hp

k0pti3hp5#

我想回答我自己的问题。
如果您已经对键值进行了排序,那么批量插入并读取它们的最有效方法是使用基于B树的数据库。
例如,使用MapDB,我可以非常快速地插入它,并且占用更少的内存。

相关问题