参照:如何实现类似知乎的功能查看最近1000条记录呢? - 知乎 (zhihu.com)
要求:
- 用户在每次浏览的时候去缓存中记录这条记录的ID
- 确保记录最大条数只能达到设置的阈值,比如1000
- 记录不能重复且按照时间倒叙排序,举例:昨天浏览的记录,今天再次浏览时之前的记录删除,只保留今天浏览的记录和时间
- 持久化,浏览记录持久存在
思路:
- 技术选型:redis+mysql结合的方案(冷热数据的分离处理)
- 使用redis的zset,用户唯一ID作为key,用户访问记录ID作为value,访问时间作为分数score
- 每次浏览记录向该用户集合中插入一条记录,插入前判断是否有旧的记录,有则删除,然后添加;每次插入的记录时间戳递增,借助zset本身的有序性,很容易实现查询排序翻转
- 插入后获取总记录,如果大于阈值,则删除阈值之外更旧的记录,时间倒序
避免redis里的数据随着用户的增加约存越多,采用redis+mysql结合的方式
在当天用户浏览时(或者查找自己的浏览记录时),先在redis里查找数据,若没有则将浏览记录从数据库加载到redis缓存里,在redis做相关增删查询操作;
做一个定时任务,每日凌晨三点,做一次数据归档。将用户的浏览记录,回写到数据库里。归档完成后删除redis里的相关数据。
这样能有保障快速记录用户浏览记录的同时,也能比较有效的保障数据安全,redis里的数据过载。