正如@for_stack 所说,Hash
将非常适合您的情况。
您说每个用户在 db 中有许多由user_id
and索引的行tag_id
。所以它是 (user_id, tag_id) 唯一指定一行。每一行的功能取决于这个元组,你可以使用元组作为 HASH KEY。
例如,如果要将值为 ("123456", "FDSA", "gsz", 20) 的行 (user_id, tag_id, username, age) 保存到 redis 中,您可以这样做:
HMSET 123456:FDSA username "gsz" age 30
当你想用 user_id 和 tag_id 查询用户名时,你可以这样做:
HGET 123456:FDSA username
所以每个哈希键都是和的组合user_id
,tag_id
如果你想让键更易于阅读,你可以添加一个前缀字符串,比如“USERINFO”。例如:USERINFO:123456:FDSA
。
但是如果您只想使用 user_id 查询并获取具有此 user_id 的所有行,则上述方法是不够的。
您可以在 redis 中为您的 HASH构建二级索引。
如前所述,我们使用user_id:tag_id
HASH 键。因为它可以唯一点到一行。如果我们想查询关于一个 user_id 的所有行。
我们可以使用sorted set
构建二级索引来索引哪些哈希存储有关此 user_id 的信息。
我们可以在 SortedSet 中添加:
ZADD user_index 0 123456:FDSA
如上,我们将 设置为member
,将string of HASH key
设置score
为 0。规则是我们应该将此 zset 中的所有分数设置为 0,然后我们可以使用字典顺序进行范围查询。参考zrangebylex。
例如,我们想要获取关于 user_id 123456 的所有行,
ZRANGEBYLEX user_index [123456 (123457
它将返回所有前缀为 123456 的 HASH 键,然后我们使用这个字符串作为 HASH 键和 hget 或 hmget 来检索我们想要的信息。
[
意味着包容,(
意味着排斥。为什么我们使用123457
?这很明显。所以当我们想要获取所有带有 user_id 的行时,我们应该指定上限,使 user_id 字符串的最左边 char 的 ascii 值加 1。
有关 lex 索引的更多信息,您可以参考我上面提到的文章。