0

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

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

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

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

实际:8m 30s
用户:5m 18s
系统:0m 7s

内存使用:
在redis中,数据库占用大约18GB,redis的内存占用增长到28GB。
一个键看起来像这样“94190049249988”。
“keys.bytes-per-key”:(整数)1830。

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

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

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

我的用例推荐任何其他数据存储也将不胜感激。

4

1 回答 1

0

要以快速方便的方式实现该类型的数据库以INTEGER=>UNORDERED/SET进行通常的操作,就是要有一个二元决策图来保存所有无序集,并使用平衡二叉搜索树来保存带有指向 BDD 节点的指针的整数键表示value哈希的。

注意:为了专门表示集合(这些被编码为特征函数),发明了零抑制二元决策图,这是表示集合的优化/紧凑方式。

有上千篇关于如何实现 BDD 的文章和教程。

如果你以这种方式实现你的数据库,它将比 redis 运行得更快、更紧凑。通过这种方式,您可以实现具有数十亿个集合条目的数据库。

于 2019-05-28T07:16:28.163 回答