参照:如何实现类似知乎的功能查看最近1000条记录呢? - 知乎 (zhihu.com)

要求:

  1. 用户在每次浏览的时候去缓存中记录这条记录的ID
  2. 确保记录最大条数只能达到设置的阈值,比如1000
  3. 记录不能重复且按照时间倒叙排序,举例:昨天浏览的记录,今天再次浏览时之前的记录删除,只保留今天浏览的记录和时间
  4. 持久化,浏览记录持久存在

思路:

  1. 技术选型:redis+mysql结合的方案(冷热数据的分离处理)
  2. 使用redis的zset,用户唯一ID作为key,用户访问记录ID作为value,访问时间作为分数score
  3. 每次浏览记录向该用户集合中插入一条记录,插入前判断是否有旧的记录,有则删除,然后添加;每次插入的记录时间戳递增,借助zset本身的有序性,很容易实现查询排序翻转
  4. 插入后获取总记录,如果大于阈值,则删除阈值之外更旧的记录,时间倒序

避免redis里的数据随着用户的增加约存越多,采用redis+mysql结合的方式

在当天用户浏览时(或者查找自己的浏览记录时),先在redis里查找数据,若没有则将浏览记录从数据库加载到redis缓存里,在redis做相关增删查询操作;

做一个定时任务,每日凌晨三点,做一次数据归档。将用户的浏览记录,回写到数据库里。归档完成后删除redis里的相关数据。

这样能有保障快速记录用户浏览记录的同时,也能比较有效的保障数据安全,redis里的数据过载。