redis中的最佳键哈希值

时间:2014-03-05 12:02:03

标签: redis

我一直在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开头填充集合,这意味着内存不会被优化。

我该怎么办?

1 个答案:

答案 0 :(得分:2)

更新:您似乎误解了这篇文章。 关于“使用HSET vs SET”。它是关于在使用聚合数据类型(散列,集合,有序集等)时保存内存,而不是单个字符串。

在您的情况下,使用哈希而不是字符串是没有意义的,因为您希望每个键都映射到单个字符串。

如果您希望保证不会发生冲突(即两个用户映射到同一个密钥),需要在密钥中包含整个用户ID。

但是,您可以对哈希值进行分片,并让您的用户处于多个哈希值中。

例如,以1-3开头的用户ID将进入第一个哈希,4-6进入第二个,7-9进入第三个等等。您可以使用哈希函数来存储和检索来自某些哈希的用户。

如果你确定你的哈希:

  1. 最多包含一定数量的条目(请参阅hash-max-ziplist-entries设置)
  2. 仅包含尺寸最高为hash-max-zipmap-value设置的键和值(默认为1024
  3. 然后你可以节省内存,因为你的哈希值使用名为ziplist的数据结构以更加节省内存的方式存储。

    注意:这些相关设置位于redis.conf文件中。