Redis键中冒号的作用是什么?

94

我正在学习如何在我的项目中使用Redis。有一件事情让我困惑,那就是在key的名称中,冒号到底是用来做什么的。

我看到过以下这些key的名称:

users:bob
color:blue
item:bag

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

我已经阅读了文档,并进行了大量的谷歌搜索,但奇怪的是,我找不到任何讨论此事的内容。

2个回答

112

冒号在早期版本的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",但是通过使用用户前缀对其进行命名空间分类,我们可以立即知道该哈希应该/可以具有哪些信息。


6
为什么在这种情况下,各种语言中似乎更常用的.没有被选择,而是选择了:呢? - CivFan
5
也许为了确切地与大多数语言中用于对象访问的点运算符有所区别。 - Tobias P.

49

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

好的键结构对于利用sort命令至关重要,该命令是Redis对SQL join的回答。

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能够通过引用结构化的键来查找用户颜色。


1
使用 / 是一个很好的建议! - Saurabh Hirani
9
在尝试使用Redis时,我意识到像redis commander(https://github.com/joeferner/redis-commander)这样的UI工具在使用冒号而不是斜杠作为结构化键时显示更好的可视化效果。因此,我支持使用冒号,因为它有历史意义。 - Pavan Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接