Redis键中冒号的目的是什么


76

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

我看到过这样的键名:

users:bob
color:blue
item:bag

冒号是否将密钥分为几类,从而使查找密钥的速度更快?如果是这样,您在命名键时可以使用多个冒号将它们划分为子类别吗?最后,它们与在Redis服务器中定义不同的数据库有关吗?

我已经阅读了文档,并在此问题上进行了许多Google搜索,但奇怪的是我找不到任何讨论此事的信息。

Answers:


95

冒号已在早期的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”,但是使用用户前缀命名它的间隔,我们会立即知道此哈希应该/应该包含哪些信息。


4
我想知道为什么在各种语言中这种事情似乎更普遍:时选择了为什么.
CivFan

3
可能与大多数语言用于对象访问的点运算符完全不同
Tobias P.

40

冒号是一种构造密钥的方法。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可以通过引用结构化键来查找用户的颜色。


1
使用/是一个很好的建议!
索拉·希拉尼

5
在尝试使用Redis的过程中,意识到当键使用冒号而不是斜杠构造时,诸如redis commander(github.com/joeferner/redis-commander)之类的UI工具显示出更好的可视化效果。因此,我对冒号的历史意义投了赞成票。
Pavan Kumar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.