赞
踩
项目中需要做缓存,但有个场景Redis操作略复杂,具体要求是这样的:
类似的场景还有很多,例如:用户领取的任务、待领取的优惠券
由于条件2的限制,不能直接使用哈希表(哈希表内数据的过期时间相同),因此想到了以下几种方案:
原理:将过期时间作为哈希表的field,每次全量取出用户的所有信息,将已过期的剔除掉,将剩下的信息回写进哈希表,并返回给用户。缺点是一个时间点只能有一条消息。
HSET business#user-id expire message
原理:将消息内容+时间戳json编码后,PUSH进链表中,每次循环POP出链表中的消息,直到获取到一条未过期的消息。尤其适合过期时间有序,且只需要读取一次的场景。
LPUSH business#user-id json(msg-type + msg-content + expire)
原理:将所有消息+时间都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
原理:对于这种需要骚操作的处理,肯定有一个终极方案,那就是“这个需求做不了”,跟产品同学打一架,打赢了就做完需求了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。