我一直在此处通过Redis网站上阅读有关使用HSET
vs SET
的文章来创建更优化的内存使用情况:http://redis.io/topics/memory-optimization
我遇到的问题是我的钥匙比这更长。它们的形式是: u:<USER_ID that is 9-16 characters>
示例:
u:123456789
u:123456789abcdefg
在哪里拆分与HSET
一起使用的钥匙的最佳位置?
我在这里读到,理想情况下,您的每个"子集"中的项目将不超过1000个项目。因此,在那种情况下,我将按最后3个字符分开,每组中最大的999个项目。
不幸的是,用户ID不是那么可预测的,我不能保证良好的差异。例如,如果我在HSET u:123456 789
分开,我不能保证将有所有其他用户ID始于123456填充该集合,这意味着内存不会是优化的。
我该怎么办?
更新:看来您正在误解文章。它是不是关于"使用HSET VS SET"。使用 gentregate 数据类型(哈希,集合,排序集等),而不是单个字符串时,它是关于保存内存的。
。在您的情况下,使用哈希而不是字符串是没有意义的,因为您希望每个键都映射到一个字符串。
you 需要,如果您希望保证不会发生碰撞(即,两个用户映射到同一密钥)。
)。但是,您可以将哈希片碎,并将您的用户放在多个哈希中。
例如,以1-3开头的用户ID将进入第一个哈希,第4-6个进入第二个哈希,第三次以7-9进入第三个等。您可以使用哈希功能来存储和从某些哈希中检索用户。
如果确保您的哈希:
- 包含一定的条目限制(请参阅
hash-max-ziplist-entries
设置)和, - 仅包含具有尺寸为
hash-max-zipmap-value
设置的键和值(默认情况下为1024
)
然后,您可以使用称为 Ziplist的数据结构来保存内存,因为您的哈希是以更高的内存效率存储的。。。
注意:这些相关设置在redis.conf
文件中。