首页 文章

Redis的关键命名约定?

提问于
浏览
179

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

对于用户,你会做一些像......

user:00

如果用户的id是 00

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

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

4 回答

  • 23

    redis中键的常规命名约定是什么?我已经看到值被分隔:但我不确定正常约定是什么,或者为什么 .

    是的,结肠符号 : 是命名键时的约定 . 在this redis网站上的教程中说明:尽量坚持使用模式 . 例如"object-type:id:field"可能是一个好主意,就像在"user:1000:password"中一样 . 我喜欢在多字词字段中使用点,例如"comment:1234:reply.to" .

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

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

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

  • 5

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

    logistics:building#23
    
  • 152

    一个约定似乎是冒号(:) but 我是一个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);
        ...
    }
    

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

    Note: always ensure that user is able to access only things you intended. 正如评论员所指出的,上面的原始网址到密钥方法也能够获取 user/1/password . 如果您将Redis用作公共只读缓存,这应该不是问题 .

  • 13

    我不知道Redis关键命名是否真的存在广泛的“最佳实践” .

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

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

相关问题