当前位置:   article > 正文

Redis如何实现Value过期时间不同的哈希Map_redis的hash中key中的每一个value的都设置不同过期时间方案

redis的hash中key中的每一个value的都设置不同过期时间方案

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

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

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

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

方案一:哈希表+时间戳

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

HSET business#user-id expire message
  • 1

方案二:链表+时间戳

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

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

方案三:JSON字符串

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

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

方案四:哈希表+字符串

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

bridge = business#user-id#expire
HSET business#user-id msg-type bridge
SET bridge msg-content EX expire
  • 1
  • 2
  • 3

方案五:有序集合

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

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

终极方案

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/695140
推荐阅读
相关标签
  

闽ICP备14008679号