81

我正在学习如何将 Redis 用于我的项目。我没有想到的一件事是冒号在键名中的确切用途。

我见过这样的键名:

users:bob
color:blue
item:bag

冒号是否将键分成类别并加快查找键的速度?如果是这样,您可以在命名键时使用多个冒号将它们分解为子类别吗?最后,它们与在 Redis 服务器中定义不同的数据库有什么关系吗?

我已经阅读了文档并就此事进行了无数次谷歌搜索,但奇怪的是我找不到任何讨论这个问题的东西。

4

2 回答 2

101

冒号在早期的 redis 版本中作为存储命名空间数据的概念。在早期版本中,redis 仅支持字符串,如果您想存储电子邮件和 'bob' 的年龄,则必须将其全部存储为字符串,因此使用了冒号:

SET user:bob:email bob@example.com
SET user:bob:age 31

它们在 redis 中没有特殊的处理或性能特征,唯一的目的是对数据进行命名空间以再次找到它。如今,您可以使用哈希来存储大多数冒号键:

 HSET user:bob email bob@example.com
 HSET user:bob age 31

您不必将散列命名为“user:bob”,我们可以将其命名为“bob”,但是使用用户前缀对其进行命名空间,我们立即知道该散列应该/可能具有哪些信息。

于 2010-08-24T11:06:59.663 回答
45

冒号是构造键的一种方式。redis 不会以任何方式解释它们。您也可以使用您喜欢的任何其他分隔符,或者根本不使用。我个人更喜欢/,这使我的密钥看起来像文件系统路径。它们对性能没有影响,但你不应该让它们过长,因为 redis 必须将所有键保存在内存中。

一个好的键结构对于利用 sort 命令的强大功能很重要,这是 redis 对 SQL 连接的回答。

GET user:bob:color   -> 'blue'
GET user:alice:color -> 'red'

SMEMBERS user:peter:friends -> alice, bob

SORT user:peter:friends BY NOSORT GET user:*:color   -> 'blue', 'red'

您可以看到键结构使 SORT 能够通过引用结构化键来查找用户的颜色。

于 2010-08-25T22:13:50.843 回答