优化redis排序的设置内存使用情况

时间:2014-04-09 14:31:00

标签: sorting database-design memory-management redis sortedset

我目前在Redis中获得了22k个排序集。每个密钥的格式如下:

monitor:<type>:feed:<MongoId>

这些有序集合共有11895225个项目。这些集合具有作为分数的unix时间戳和作为成员的MongoId。

<timestamp> - <MongoId>

设置速度非常快,但数据库大小为1,8g。我是否可以做任何优化来减少内存使用(请记住我需要按时间排序我的数据)?

2 个答案:

答案 0 :(得分:1)

你可以做一些优化,但不要期望太多。每个成员在数据本身(member-key + score / float)之上的开销大约为64字节。

所以最小内存大小(没有数据)已经是0.77GB左右。

Didier Spazia看到这个好答案:Redis 10x more memory usage than data

要进行优化,可以使用客户端散列和/或客户端压缩。


关于您的数据设计:

  

这些集合以unix时间戳作为键,MongoId作为值。

不太清楚你的意思。 key是整个有序集的正确术语。您的会员分数是多少,您的会员字符串是什么?你依靠分数排序吗?而且,字符串的字典排序?如果两者:你可以做的不多,除了缩短字符串中的字符串/标记。您可以将其与使用MsgPack格式序列化数据相结合。如果在字符串中包含数字,这在序列化为MsgPack时使用的字节数要少得多,这很有用。如果使用数组(而不是序列化的dict),则可以再次保护一些空间。使用整数/浮点数时,请确保您的字节顺序与所需的排序匹配,但是当您在成员字符串中使用MsgPack并且您需要排序集的字典排序特征时。

希望这有帮助,TW

答案 1 :(得分:0)

除了来自Tw和代理Didier的优秀信息之外,另一个涉及不更改代码的选项将是使用32位版本的Redis。当然,如果你预计即使在32b制度下数据增长超过2GB,这也不一定是一个很好的选择。但是,对于直接的内存大小减少&#34;较小&#34;数据集它可以是一个简单的解决方案。

在最糟糕的情况下,您可以尝试使用数据副本并对其进行测试以查看您的边界所在的位置以及您减少了多少内存但是一个不错的经验法则约为一半。

相关问题