我需要存储约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等其他数据类型?有帮助吗?
我可以尝试其他优化方法吗?
在我的用例中推荐使用任何其他数据存储。
答案 0 :(得分:0)
要以一种快速方便的方式实现常规操作的类型INTEGER=>UNORDERED/SET
的数据库,就是要有一个binary decision diagram来保留所有无序集,并使用一个balanced binary search tree来保留具有指向BDD节点的指针的整数键,该节点代表哈希的value
。
注意:为了专门表示集合(这些集合编码为characteristic functions),发明了zero suppressed binary decision diagrams,这是一种表示集合的优化/紧凑方法。
关于实现BDD的文章和教程有数千篇。
如果以这种方式实现数据库,它将比redis更快,更紧凑。这样,您可以实现具有数十亿个设置条目的数据库。