【问题标题】:Efficient way to store "unordered set" of integers as value in redis?将整数的“无序集”存储为redis中的值的有效方法?
【发布时间】:2019-10-13 15:33:33
【问题描述】:

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

我为此使用“SADD”命令。我使用的客户端是hiredis,以及流水线。 所以,命令看起来像这样:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: c redis set hiredis


    【解决方案1】:

    要以快速方便的方式实现INTEGER=>UNORDERED/SET 类型的数据库以进行常规操作,请使用binary decision diagram 来保存所有无序集,并使用balanced binary search tree 来保存带有指向指针的整数键表示哈希的value 的BDD 的节点。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-25
      • 2014-01-29
      • 2017-01-28
      • 2022-09-25
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      相关资源
      最近更新 更多