在redis中将整数的“无序集合”存储为值的有效方法吗?

时间:2019-05-28 06:54:56

标签: c redis set hiredis

我需要存储约1.5亿个键值对,其中键是整数,值是一组整数(无序)。 我将redis用作个人桌面上的单个实例,具有32 GB的RAM和具有8核的CPU。

我为此使用“ SADD”命令。我使用的客户端是hiredis,以及流水线。 因此,命令如下所示:

redisAppendCommand(context,"SADD %d %d %d",integer_key, integer_value1, integer_value2 );

执行时间: 使用Linux中的“时间”命令,得到以下结果:

real:8m 30s
用户:5m 18s
sys:0m 7s

内存使用情况:
在redis中,数据库大约需要18GB,redis的内存占用量会增加到28GB。
密钥看起来像这样的“ 94190049249988”。
“ keys.bytes-per-key” :(整数)1830。

以下是我尝试过的优化,以提高速度并减少内存占用:-

1)流水线化以提高速度。
2)存储整数集以减少内存占用。这使用了整型编码。

是否存在一种内存和速度高效的方法来存储这1.5亿个键值?
我是否应该以其他方式使用HSET等其他数据类型?有帮助吗?
我可以尝试其他优化方法吗?

在我的用例中推荐使用任何其他数据存储。

1 个答案:

答案 0 :(得分:0)

要以一种快速方便的方式实现常规操作的类型INTEGER=>UNORDERED/SET的数据库,就是要有一个binary decision diagram来保留所有无序集,并使用一个balanced binary search tree来保留具有指向BDD节点的指针的整数键,该节点代表哈希的value

注意:为了专门表示集合(这些集合编码为characteristic functions),发明了zero suppressed binary decision diagrams,这是一种表示集合的优化/紧凑方法。

关于实现BDD的文章和教程有数千篇。

如果以这种方式实现数据库,它将比redis更快,更紧凑。这样,您可以实现具有数十亿个设置条目的数据库。