场景:
1: 用户浏览的商品,记录该商品信息到redis。
2: 写一个定时调度程序。将该用户最近浏览商品记录时间与当前时间比较,达到入库间隔将这一批redis商品数据记录到mysql的足迹表中。已存在的商品更新其浏览时间。并删除已同步的redis数据
3:用户在读取足迹记录时要保证实时性。该如何设计读取方式?
1. 并行查 redis、db 中的足迹 ID 数据 - 保持时效性
2. 将以上的结果聚合,再查一次数据库详情。
书《从程序员到架构师》,作者:王伟杰
看看书中是否有适合你的场景 和 解决方案。
大哥我谢谢你。看完我要跟领导说拜拜了
@郭景伟Larva:
其实,你还没介绍 整个项目的背景:单体项目、微服务项目?小、大项目?用户量?
不同的类型,有不同的方案。
要是你在 淘宝、天猫 干这个项目,方案也应该不同吧。
读取足迹记录时要保证实时性:你的需求、想要实现的是 这个?
@快乐的凡人721: 这是一个微服务项目,用户量还没有具体数量。问题出现在读取时如果读redis只能读到最近的数据,再往下翻就必须读mysql了。属于两个数据源了,
@郭景伟Larva:
redis存储了多少数据?最好是固定值,比如,20条,,这样,1、2页都是在 redis查询了。
第三页,就从 mysql查询。
要是redis不满20条,启动时从mysql加载20条。
行?
用户规模大的话,redis不是要炸了?考不考虑分发浏览记录到mq里,再转入es实时查询。
问题就出现在只要redis数据跑出去,再查询的时候无法保证实时性与数据一致性。因为redis有一部分,es有一部分
@郭景伟Larva: 不走redis,直接分发到mq里转es存储呢?页面上查看足迹做个过渡动画牺牲一点用户体验不知是否可行
@kingdumpling: 我是建议直接写es的。然后以时间和id作为复合主键。这样一来按照日期读取数据。但是负责人说想把压力给到redis。不直接写库
@郭景伟Larva: 负责人加钱上配置吧,哈哈
实际上可以分成实时数据和历史数据两部分:
1、用户浏览的商品,记录该商品信息到redis,同时向阿里云的tablestore写一份(类似es,支持查询和分页,分页pagesize最大值应该是1w,效率很高)。
2、定时从redis读取数据写入到mysql,落库。这里使用redis纯粹就是为了延迟入库,降低数据库写入的压力
3、近期(如一天内的数据)数据或者模糊查询从tablestore查询,超过一天的可以查mysql数据库。
这样既解决了mysql数据库读写压力又解决了实时展示用户浏览轨迹的问题。
这种数据不走redis, 直接弄个mongodb数据库存储就行吧, 单纯的存入,读取