Redis键命名约定?

redis中键的标准命名约定是什么?我见过用:分隔的值,但我不确定标准约定是什么。

对于一个用户,你会这样做:user:00

如果用户的id是00

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

我主要是希望通过研究这种方法对人们的作用以及他们为什么选择这种方法来避免将来出现任何问题。

104690 次浏览
redis中键的正常命名约定是什么?我看过 但我不确定正常的约定是什么, 或者为什么。< / p >

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

你是否能够只查询键的开始以返回所有 用户?< / p >

如果你的意思是直接查询所有以user:开头的键,有一个命令。然而,这个命令应该仅用于调试目的,因为它是O (N),因为它正在搜索存储在数据库中的所有键。

这个问题更合适的解决方案是创建专用密钥,我们将其命名为users,它将存储所有用户密钥,例如,在列表数据结构中。

我不知道Redis键命名是否真的有广泛的“最佳实践”。

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

我很想知道是否还有其他的观点。

我们使用冒号(:)作为命名空间分隔符,使用散列(#)作为键的id-part,例如:

logistics:building#23

惯例似乎是冒号(:)我是一个web开发人员,所以我个人更喜欢斜杠(/)作为分隔符。斜杠在url中已经是非常重要的分隔符,它意味着统一资源定位器,这是资源的键。为什么对冒号(:)采取不同的方法?有帮助吗?

想想这个例子:

我们有一个玩具对象的宁静的 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);
...
}

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

正如评论者所指出的,上面的原始URL-to-key方法也能够获取user/1/password。如果你使用Redis作为一个公共只读缓存,这应该不是一个问题。

对于你的用例,在我看来HSET/HGET将是一个更好的适合。还有hkey命令。

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

你可以有这样的结构:

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

或者:

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

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