2012-04-11 27 views
6

我想知道使用用户ID的好处,而不仅仅是使用唯一的用户名作为密钥。Redis中的密钥的用户名或ID

  • 用户:USERNAME => {密码:HASH,年龄:45}
  • 用户:0 => {用户名:用户名,密码:HASH,年龄:45}

注意,我希望按名称查找用户,因此需要第二组键值将用户名与ID相关联。

鉴于每个用户名都是唯一的,并且必须是字母数字,有什么特别的原因可能有利于使用ID系统。

我问这个问题的主要原因是因为我主要使用ID,因为它们减少了我数据库中的查找时间,特别是当数据库以某种方式归一化时。但是,Redis没有获得这种好处,所以我想知道可能有什么其他原因使用用户ID而不是用户名。

感谢您的帮助,

Pluckerpluck

附:由于Redis处理哈希的方式,我实际上不确定这两种方法之间的内存差异,因此有关此方面的信息可能会很好,但我可能会在稍后自行测试。

回答

13

在您定义的用例中无关紧要,但使用整数用户ID具有其他优点。

迟早,你会想在其他对象中引用用户ID。例如,“用户pluckerpluck的朋友”。为了模拟的是,你有两个选择 -

friendsof:pluckerpluck -> SET{tom, dick, harry}

VS

friendsof:1 --> SET{2, 3, 4}

前一种方法使用正哈希表来存储元素,并使用大量的内存。后一种方法使用整数数组,并且具有极高的内存效率。

这组特殊的整数集编码称为IntSet。您可以使用属性控制Redis的行为set-max-intset-entries

# Sets have a special encoding in just one case: when a set is composed 
# of just strings that happens to be integers in radix 10 in the range 
# of 64 bit signed integers. 
# The following configuration setting sets the limit in the size of the 
# set in order to use this special memory saving encoding. 
set-max-intset-entries 512 
+0

感谢您指出该场景。只是一个简单的问题:如果我要使用ID。然后,我需要一个用户名 - ID关系来允许搜索用户名。你认为一个排序集(排名是id)将是一个好办法吗?或者改为哈希? – Pluckerpluck 2012-04-11 17:12:57

+2

散列效果更好有两个原因 - a)使用的内存少于排序集,b)用户没有定义的排序,所以从概念上讲,使用排序集是没有意义的。 – 2012-04-11 17:20:38

+0

我会使用散列索引用户名。它们比内存中的zset更紧凑。使用zset只有在您需要支持名称范围查询时才有用... – 2012-04-11 17:21:17