根据 Redis 文档 主题标签可用于强制将键分配到同一散列槽。我有一个用例,我们将 {UUID}Integer 存储为 Redis 中的字节数组,我希望仅使用 UUID 部分来分配哈希槽。 我们面临的问题是,如果 UUID 包含字符
7b
或 7d
,它会与分别由 ASCII 字节值 123 (0x7b) 和 125 (0x7d) 表示的 {
和 }
发生冲突,从而影响这些密钥的分配。
例如 - 当与主题标签一起存储在 Redis 中时,
7d3e4567-e89b-12d3-a456-426614174000
会打印为 {}>Eg\xe8\x9b\x12\xd3\xa4VBf\x14\x17@\x00}
。
有没有办法转义 UUID 中的字符以使哈希槽计算正常工作,或者还有其他解决方法吗?
无法告诉 Redis
7b
或 7d
字节不是大括号。
解决这个问题的唯一方法是对 UUID 进行不同的编码。
我假设您关心编码速度和内存消耗。目前,每个 UUID 使用 16 个字节,这是最佳选择。
您可以使用Base64编码来避免这个问题。每个 UUID 需要 22 个字节。
另一种选择是使用自定义编码:每 7 位都转换为一个字符
00
..81
,除了 7b
和 7d
之外。编码相对简单 - 您必须一次提取 7 位,并将 7b
替换为 80
,将 7d
替换为 81
。每个 UUID 需要 18 个字节。
更复杂的编码可以将这个数字减少到 17 个字节,但很可能需要更多的计算。