我正在学习如何将 Redis 用于我的项目。我没有想到的一件事是冒号在键名中的确切用途。
我见过这样的键名:
users:bob
color:blue
item:bag
冒号是否将键分成类别并加快查找键的速度?如果是这样,您可以在命名键时使用多个冒号将它们分解为子类别吗?最后,它们与在 Redis 服务器中定义不同的数据库有什么关系吗?
我已经阅读了文档并就此事进行了无数次谷歌搜索,但奇怪的是我找不到任何讨论这个问题的东西。
我正在学习如何将 Redis 用于我的项目。我没有想到的一件事是冒号在键名中的确切用途。
我见过这样的键名:
users:bob
color:blue
item:bag
冒号是否将键分成类别并加快查找键的速度?如果是这样,您可以在命名键时使用多个冒号将它们分解为子类别吗?最后,它们与在 Redis 服务器中定义不同的数据库有什么关系吗?
我已经阅读了文档并就此事进行了无数次谷歌搜索,但奇怪的是我找不到任何讨论这个问题的东西。
冒号在早期的 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”,但是使用用户前缀对其进行命名空间,我们立即知道该散列应该/可能具有哪些信息。
冒号是构造键的一种方式。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 能够通过引用结构化键来查找用户的颜色。