我一直在redis的网站上阅读这篇文章,关于使用HSET
vs SET
来创建更优化的内存使用情况:
http://redis.io/topics/memory-optimization
我遇到的问题是我的钥匙比这长得多。它们的形式如下:
u:<USER_ID that is 9-16 characters>
示例:
u:123456789
u:123456789abcdefg
分割要与HSET
使用的密钥的最佳位置在哪里?
我读过here,理想情况下,每个“子集”中的项目不会超过1000个。所以在这种情况下,我会用最后3个字符分割,从而在每组中理论上最多可以有999个项目。
不幸的是,用户ID不是那么可预测的,我无法保证良好的传播。例如,如果我在HSET u:123456 789
分割,我不能保证会有所有其他用户ID以123456开头填充集合,这意味着内存不会被优化。
我该怎么办?
答案 0 :(得分:2)
更新:您似乎误解了这篇文章。 不关于“使用HSET vs SET”。它是关于在使用聚合数据类型(散列,集合,有序集等)时保存内存,而不是单个字符串。
在您的情况下,使用哈希而不是字符串是没有意义的,因为您希望每个键都映射到单个字符串。
如果您希望保证不会发生冲突(即两个用户映射到同一个密钥),您需要在密钥中包含整个用户ID。但是,您可以对哈希值进行分片,并让您的用户处于多个哈希值中。
例如,以1-3开头的用户ID将进入第一个哈希,4-6进入第二个,7-9进入第三个等等。您可以使用哈希函数来存储和检索来自某些哈希的用户。
如果你确定你的哈希:
hash-max-ziplist-entries
设置)和,hash-max-zipmap-value
设置的键和值(默认为1024
)然后你可以节省内存,因为你的哈希值使用名为ziplist的数据结构以更加节省内存的方式存储。
注意:这些相关设置位于redis.conf
文件中。