Redis如何实现Value过期时间不同的哈希Map

项目中需要做缓存,但有个场景Redis操作略复杂,具体要求是这样的:

  1. 每个用户下面挂多条信息;
  2. 每条信息有自己的过期时间;
  3. 需要一次获取用户的所有信息;
  4. 已过期的信息不能被获取到;

类似的场景还有很多,例如:用户领取的任务、待领取的优惠券

由于条件2的限制,不能直接使用哈希表(哈希表内数据的过期时间相同),因此想到了以下几种方案:

方案一:哈希表+时间戳

原理:将过期时间作为哈希表的field,每次全量取出用户的所有信息,将已过期的剔除掉,将剩下的信息回写进哈希表,并返回给用户。缺点是一个时间点只能有一条消息。

HSET business#user-id expire message

方案二:链表+时间戳

原理:将消息内容+时间戳json编码后,PUSH进链表中,每次循环POP出链表中的消息,直到获取到一条未过期的消息。尤其适合过期时间有序,且只需要读取一次的场景。

LPUSH business#user-id json(msg-type + msg-content + expire)

方案三:JSON字符串

原理:将所有消息+时间都json编码后存进字符串中,每次读取数据时,如果发现有消息过期了,踢掉过期的消息后再将剩余的消息写回缓存中

SET business#user-id json(message + expire)

方案四:哈希表+字符串

原理:如果用户到消息内容之间还有一层消息类型,则可以将将用户+类型+时间戳拼接为一个桥接字段,再以桥接字段为key,将消息内容写入一个string中。获取数据时,根据HGET找到桥接字段,再找到消息内容。

bridge = business#user-id#expire
HSET business#user-id msg-type bridge
SET bridge msg-content EX expire

方案五:有序集合

原理:将过期时间作为score,消息内容作为数据,写入有序集合中。获取时,可以根据当前时间戳直接ZRANGE。这是几个方案中最简洁的方案。

ZADD business#user-id expire msg-content
ZRANGE business#user-id current_time max_int

终极方案

原理:对于这种需要骚操作的处理,肯定有一个终极方案,那就是“这个需求做不了”,跟产品同学打一架,打赢了就做完需求了。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值