8.2.1 短信登录
- 首先是用户提交手机号,后端将生成的验证码以及用户信息存入session中,用户登录时进行拦截并从session中拿出来信息校验,并把用户信息存入ThreadLocal中
- session共享问题:每个tomcat有自己的一份session,分布式、微服务下有多个tomcat实例,之间的session无法共享
- 解决:
- 负载均衡器通过特定算法如IP哈西,保证同一用户的请求始终路由到同一服务器。(失去负载均衡的灵活性)
- session复制,所有服务器同步session变更。(带宽消耗大)
- 集中存储,将会话数据存储在外部,如redis
- 客户端存储。(安全性挑战)
- 采用后端生成token存入redis,前端请求头携带token校验身份 方案,并通过两层拦截器解决token刷新TTL问题(背景是有些页面不要求登录即可访问),先拦截所有请求判断token有无,有则刷新并存信息与ThreadLocal,后拦截特殊路径判断是否登录(ThreadLocal中是否有用户信息),有则放行,无则拦截显示请登录
8.2.2 商户缓存 - 查询逻辑:先查询缓存再查询数据库再写入缓存(背景:老查询数据库,压力很大)
- 缓存更新策略有内存淘汰、超时剔除、主动更新
- 缓存双写一致性问题:数据源来自于数据库,数据库发生变化时也要更新缓存
- 采用先更新数据库再删除缓存的方案,但仍有问题:多线程环境下可能出现缓存正好过期去查询数据库得到旧值,更新操作完成并删除缓存(空缓存)然后旧值被写入(极小概率)
- 解决:
- 设置较短的TTL,减少缓存与数据库不一致的时间窗口
- 将策略改为 延迟双删策略
- 引入缓存提高查询性能,必然会引出一系列问题,上面的缓存双写一致性问题为其一,其二就是缓存穿透问题,若查询本就不存在的数据,每次都会打到数据库上,增加压力
- 解决:

最低0.47元/天 解锁文章
9847

被折叠的 条评论
为什么被折叠?



