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

对于一个用户,您是否可以这样做:user:00

如果用户的id是00

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

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


在redis中键的正常命名约定是什么?我看过 但我不确定正常的约定是什么, 或者为什么。

是的,冒号:是命名键时的约定。在redis网站上的本教程中声明:尝试坚持一个模式。例如"object-type:id:field"可以是 一个不错的想法,就像在“用户:1000:密码”。我喜欢用点 多词字段,比如“comment:1234:reply.to”。

您是否能够仅查询键的开头就返回全部 用户?

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

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


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

I've experimented with using ASCII NUL characters as my separators (since Redis and Python are both 8-bit clean). It looks a little ugly if you're looking at raw keys, but the idea is to hide it behind an abstraction layer. Colon and pipe symbols are obvious alternatives so long as the components of your name space are either guaranteed not to use them or you're willing to encode each component as necessary. However, if you'd be encoding them then you'd want develop the abstraction layer and avoiding viewing raw keys anyway ... which brought me right back to just using \0 in my reasoning.

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


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

logistics:building#23

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

想想这个例子:

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

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

警告:始终确保用户只能访问您想要访问的内容。如上所述,原始的URL-to-key方法也能够获取用户/1/密码。如果你使用Redis作为一个公共只读缓存,这应该不是一个问题。


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

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

你可以有这样的结构:

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

or:

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

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