Answers:
Redis中密钥的正常命名约定是什么?我已经看到了以:分隔的值,但是我不确定正常的约定是什么,或者为什么。
是的,:
在命名键时,冒号是一种约定。在Redis网站上的本教程中指出:尝试坚持使用模式。例如,“ object-type:id:field”可能是一个不错的主意,例如在“ user:1000:password”中。我喜欢在多词字段中使用点,例如在“ comment:1234:reply.to”中。
您是否可以仅查询密钥的开头以返回所有用户?
如果您的意思是像直接查询所有以开头user:
的键一样,那么可以使用keys命令。但是,此命令应仅用于调试目的,因为它是O(N),因为它正在搜索数据库中存储的所有键。
解决此问题的更合适的解决方案是创建专用密钥,让我们命名为users
,它将存储所有用户密钥,例如,以列表或设置数据结构的形式。
$redis->delete($redis->keys('user:password:*'));
我们使用冒号(:)作为名称空间分隔符,并使用散列(#)表示键的id部分,例如:
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;
}
}
用户使用key请求对象toy/666
。如何从Redis获得它?与Node.js相关的示例:
redis.get(key, function reply_callback(error, toystring) {
var toy = JSON.parse(toystring);
...
}
无需将斜杠转换为冒号,反之亦然。方便,你不觉得吗?
注意:始终确保用户只能访问您想要的内容。如user/1/password
评论员所指出的,上面的原始URL到密钥方法也能够获取。如果将Redis用作公共只读缓存,则应该不会有问题。
curl http://example.com/api/user/1/password
'd或类似的东西。(就
User#23:uploads:my/path/to/file.ext
scan
不是@EranH选项,这是迭代密钥的最佳实践。scan
用于逐步迭代元素集合。