Redis的关键命名约定?

时间:2011-08-06 07:34:32

标签: redis naming-conventions

redis中密钥的正常命名约定是什么?我看到由:分隔的值,但我不确定正常约定是什么,或者为什么。

对于用户,您会做类似......

的事情

user:00

如果用户的ID为00

您是否只能查询密钥的开头以返回所有用户?

我主要是希望通过研究为人们工作的方式以及为什么选择这些问题来避免任何未来的问题。

5 个答案:

答案 0 :(得分:170)

  

redis中密钥的正常命名约定是什么?我见过   值分隔:但我不确定常规约定是什么,   或者为什么。

是的,冒号[{1}}是命名键时的惯例。在redis网站上的this教程中说明:尝试坚持使用模式。例如“object-type:id:field”即可 一个好主意,比如“user:1000:password”。我喜欢用点 多字词字段,例如“comment:1234:reply.to”。

  

您是否只能查询键的开头以返回所有键   用户?

如果您的意思是直接查询以:开头的所有密钥,那么就会有keys命令。但是,此命令应仅用于调试目的,因为它是O(N),因为它正在搜索数据库中的所有键。

针对此问题的更合适的解决方案是创建专用密钥,我们的名称为user:,它将存储所有用户密钥,例如,listset数据结构。

答案 1 :(得分:25)

我们使用冒号(:)作为命名空间分隔符,使用哈希(#)作为键的id部分,例如:

logistics:building#23

答案 2 :(得分:15)

一个约定似乎是冒号(:) 但是我是一个Web开发人员所以我个人更喜欢使用斜杠(/)作为分隔符。 Slash已经是URL中非常重要的分隔符,它意味着Uniform Resource Locators这样的资源密钥。为什么采用冒号(:)的不同方法?它有帮助吗?

考虑这个例子:

我们有一个适用于玩具对象的RESTful API。有一个:

http://example.com/api/toy/234 

我们存放的地方?我们使用Redis和斜杠,所以键是显而易见的:

toy/234

这是玩具的独特钥匙。密钥现在也可以在客户端使用:

{
    key: "toy/234",
    color: "red",
    url: function () {
        return API_BASE_URL + this.key;
    }
}

用户请求具有键toy/666的对象。如何从Redis获得它? Node.js相关示例:

redis.get(key, function reply_callback(error, toystring) {
    var toy = JSON.parse(toystring);
    ...
}

无需将斜杠转换为冒号,反之亦然。方便,你不觉得吗?

注意:始终确保用户只能访问您想要的内容。上面的原始网址到密钥方法也可以获取user/1/password,正如评论员所指出的那样。如果您将Redis用作公共只读缓存,这应该不是问题。

答案 3 :(得分:5)

我不知道Redis关键命名确实存在广泛的“最佳实践”。

我已尝试使用ASCII NUL字符作为我的分隔符(因为Redis和Python都是8位干净的)。如果你正在查看原始键,它看起来有点难看,但想法是将它隐藏在抽象层之后。冒号和管道符号是明显的替代方案,只要您的名称空间的组件要么保证不使用它们,要么您愿意根据需要对每个组件进行编码。但是,如果您要对它们进行编码,那么您需要开发抽象层并避免查看原始密钥......这使我回到了在我的推理中使用\ 0。

我会很有兴趣看看是否有任何其他意见。

答案 4 :(得分:0)

对于您的用例,在我看来HSET / HGET会更合适。还有HKEYS命令。

所有这些命令与GET / SET / KEYS具有相同的复杂性,那么为什么不使用它们呢?

那么您可以具有以下结构:

  • 用户> 00>值
  • 用户> 01>值

或:

  • 用户:用户名> 00>值
  • users:username> 01>值

只需提取用户的ID并将其用作哈希键即可。我个人更喜欢这种方法,因为它感觉更好,而且您可以轻松查询现有的用户ID。