正如@for_stack说,Hash
将非常适合你的情况。
你说过,每个用户在db中索引的行数都是user_id
和tag_id
。所以它是(user_id,tag_id)唯一指定一行。每一行的功能依赖于这个元组,你可以使用元组作为HASH KEY。
例如,如果你想保存行(USER_ID,TAG_ID,用户名,年龄),该值( “123456”, “FDSA”, “安区”,20)到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的的secondary indexes你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。
E.g.我们想要得到的所有行约USER_ID 123456,
ZRANGEBYLEX user_index [123456 (123457
这将返回所有其前缀是123456的散列键,然后我们使用这个字符串作为散列关键字和hget或hmget检索信息来源,我们想要的东西。
[
表示包含性,(
表示排他性。以及为什么我们使用123457
?这很明显。因此,当我们想要获取具有user_id的所有行时,我们应该指定使user_id字符串的最左端字符的ascii值加1的上限。
有关lex索引的更多信息,请参阅上文提到的文章。
你所说的“进程外的内存数据库表”呢? – Sameer
你的前端是什么?一些像Asp.net这样的托管环境具有输出缓存或中间件缓存功能,如果符合您的需求,您还可以查看Elastic Search。我存储的数据为 –