我有像下面这样的key-values:
KEY VALUE
key1 1
key2 2
key3 3
. .
. .
keyN N
我的每个键都需要Map一个唯一的数字,所以我把我的键Map到自动递增的数字,然后通过redis mass insertion将其插入Redis,这很好用,然后使用GET命令对所有键值Map进行内部处理。
但是我有超过10亿个密钥,所以我想知道是否有更有效的方法(主要是更少的内存使用)使用Redis来解决这个问题?
我有像下面这样的key-values:
KEY VALUE
key1 1
key2 2
key3 3
. .
. .
keyN N
我的每个键都需要Map一个唯一的数字,所以我把我的键Map到自动递增的数字,然后通过redis mass insertion将其插入Redis,这很好用,然后使用GET命令对所有键值Map进行内部处理。
但是我有超过10亿个密钥,所以我想知道是否有更有效的方法(主要是更少的内存使用)使用Redis来解决这个问题?
5条答案
按热度按时间i7uq4tfw1#
你可以将命令管道化到Redis中,以避免像这样的往返时间:
设置10,000,000个密钥需要80秒。
或者,如果您不想为
printf
创建所有这些进程,请在单个awk
进程中生成数据:现在设置1000万个键需要17秒。
krugob8w2#
自动递增键允许在将新记录插入表/redis时生成唯一的编号。
还有其他使用UUID的方法。
但我认为自动增量是更好的原因,如它需要四倍以上的空间,排序不能做的基础上,关键等
5sxhfpxr3#
我在做完全一样的事情。这里有一个简单的例子。如果你有更好的,欢迎讨论:)
1.连接redis
2.定义一个函数incr,使用管道
3.使函数成为事务
xj3cbfub4#
为了更节省内存,你可以使用
HASH
来存储这些键值对。Redis对小的HASH
有特殊的编码。它可以保存你很多内存。在这种情况下,你可以将你的密钥分割成许多小的
HASH
,每个HASH
的条目少于hash-max-ziplist-entries
。有关详细信息,请参阅doc。顺便说一下,通过
INCR
命令,您可以使用Redis创建自动递增的数字。k0pti3hp5#
我想回答我自己的问题。
如果您已经对键值进行了排序,那么批量插入并读取它们的最有效方法是使用基于B树的数据库。
例如,使用MapDB,我可以非常快速地插入它,并且占用更少的内存。