需求
用户浏览资料后,保存用户3个月的浏览记录
方案一
数据库:
mongodb分表存储
分表规则:
分表规则根据用户id
存储结构:
浏览一次资料记录一条
主键ID | 用户ID | 资料ID | 浏览时间 | 资料是否有效 |
---|
查询方式:
根据用户ID,走分表规则找到对应表,查询所有资料ID
定时器:(Day|Month)
所有分表扫描浏览时间在3个月外的记录进行删除
分析:
简单,以记录维度存储在大量用户频繁浏览时,数据库压力巨大
方案二
数据库:
redis存储(Day)、mongodb单表存储(Three Months)
redis存储结构:
1)维护用户浏览资料
- key:用户ID
- value:List<资料>
2)维护当天的浏览用户
- key: 自定义
- value:list<用户ID>
mongo存储结构:
主键ID | 用户ID | List<资料> | 浏览时间(天) |
---|
资料ID | 浏览日期 | 是否删除 |
---|
查询方式:
取redis数据拼接mongo中数据,set去重,返回
定时器:(Day|Month)
所有分表扫描浏览时间在3个月外的记录进行删除
分析:
相对于方案一以用户维度存储,在查询时的压力减小,使用list存储不需要二次排序
单表存储1kw,保留3月90天,平均一天30w左右用户,也可以顶得住,瓶颈在于资料的数量,不过用户3月浏览也是有上限的,我采用了方案二
或许方案一+方案二的redis才是最佳搭配吧