【发布时间】:2011-10-21 09:10:08
【问题描述】:
redis 中键的正常命名约定是什么?我见过用: 分隔的值,但我不确定通常的约定是什么,或者为什么。
对于用户,你会做类似...
user:00
如果用户的 id 是 00
您是否能够只查询键的开头以返回所有用户?
我主要只是希望通过研究适合人们的方式以及他们选择这些方式的原因来避免将来出现任何问题。
【问题讨论】:
redis 中键的正常命名约定是什么?我见过用: 分隔的值,但我不确定通常的约定是什么,或者为什么。
对于用户,你会做类似...
user:00
如果用户的 id 是 00
您是否能够只查询键的开头以返回所有用户?
我主要只是希望通过研究适合人们的方式以及他们选择这些方式的原因来避免将来出现任何问题。
【问题讨论】:
redis 中键的正常命名约定是什么?我见过 值由 : 分隔,但我不确定正常的约定是什么, 或者为什么。
是的,冒号 : 是命名键时的约定。在 redis 网站上的 this 教程中声明:尝试坚持使用模式。例如“object-type:id:field”可以是
一个好主意,比如“user:1000:password”。我喜欢用点来表示
多词字段,如“comment:1234:reply.to”。
你是否可以只查询键的开头来返回所有 用户?
如果您的意思是直接查询以user: 开头的所有键,则有一个keys 命令。但是,此命令应仅用于调试目的,因为它是 O(N),因为它正在搜索存储在数据库中的所有键。
【讨论】:
scan 不是选项@EranH。,迭代键是最佳实践。 scan 用于增量迭代元素集合。
$redis->delete($redis->keys('user:password:*'));
我们使用冒号 (:) 作为命名空间分隔符,使用哈希 (#) 作为键的 id 部分,例如:
logistics:building#23
【讨论】:
约定似乎是冒号 (:) 但我是一名网络开发人员,所以我个人更喜欢斜杠 (/) 作为分隔符。斜杠在 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);
...
}
无需将斜杠转换为冒号,反之亦然。方便,你不觉得吗?
警告:始终确保用户只能访问您想要访问的内容。 正如评论员所指出的,上述原始 URL-to-key 方法也能够获取 user/1/password。如果您将 Redis 用作公共只读缓存,这应该不是问题。
【讨论】:
curl http://example.com/api/user/1/password'd,或类似的。 (只是说。)
User#23:uploads:my/path/to/file.ext
tel:+1-816-555-1212。 URI RFC 建议使用斜线作为层次结构,但不强制执行。因此,我认为将 redis 键与 URL 进行比较比 URI 更容易。
我不知道是否真的存在广泛的 Redis 密钥命名“最佳实践”。
我尝试过使用 ASCII NUL 字符作为分隔符(因为 Redis 和 Python 都是 8 位干净的)。如果您正在查看原始密钥,它看起来有点难看,但我们的想法是将其隐藏在抽象层后面。冒号和管道符号是显而易见的替代品,只要保证名称空间的组件不使用它们,或者您愿意根据需要对每个组件进行编码。但是,如果您要对它们进行编码,那么您会想要开发抽象层并避免查看原始密钥......这让我回到了在推理中只使用 \0 的问题。
我很想看看是否有任何其他意见对此表达了意见。
【讨论】: