教你生产环境怎么用缓存
点击蓝色“ 乔志勇笔记 ”关注我哟
加个“ 星标 ”,第一时间获取推送的文章哦
一、缓存的作用
1、提高数据的访问速度,带来系统性能的提升
2、缓存预热,数据预先读取,减小同时高并发访问时数据库的压力
二、缓存的位置
蓝色静态缓存,黄色动态缓存
三、进程外缓存运用
最常用Cache Aside Pattern :
1)定义:
更改时先写DB,然后删除缓存。
读取时先读缓存,如果没有命中,读数据库,再写缓存
2)问题: 主从数据库的数据同步延迟带来的问题
方案一: 通过工具订阅从库的binlog,从库完成同步后再做一次删除缓存,可能有短暂的不一致,但不至于引入缓存导致主从同步造成的数据不一致更糟糕
方案二:强制数据同步这段时间内读主库来加载缓存,可能给主库带来压力
做法是写DB,往缓存中临时数据(唯一键+失效时间)标记,删除缓存 ,读取时判断 是否 包含在临时数据中,分情形读取
3)要点:
1、为啥先写db,后更新缓存 不行啊,因为可能在高并发双写时带来数据不一致
2、为啥先写db,后删缓存,是因为先删缓存,后db,可能在读写并发时因为主从同步延迟造成数据不一致
3、为啥删除缓存,是因为大部分业务场景下修改缓存代价太大,并且对象、文本类型数据修改操作太复杂
4)实践:
在redis中实践最常见
四、进程内缓存运用
1、问题:多个节点的数据同步问题(CAP理论的最经典应用)
解决方案一: 一致性hash缓存,问题是违背了服务器无状态准则,一般不推荐使用
解决方案二: 利用elastic—job定时或者mq实时通知所有节点,只能用在少量节点的情形
2、场景:
1)很少变化的数据,业务上允许不一致
例如马蜂窝使用OHC 堆外缓存在推荐系统中增加本地容灾
2)需要支持非常高的并发,例如秒杀系统, 可以使用guava作为堆内缓存,来达到定时过期,定时刷新,异步刷新 的效果
五、缓存的负面作用
1、缓存雪崩
问题:
1)缓存系统宕机 2)流量激增(高并发的写缓存)3)缓存同时批量过期
对应的解决方案 :
1)缓存系统高可用
2)加锁或者排队限制高并发的写缓存
3)增加随机值避免同时失效
2、缓存穿透
定义:
所需的数据在DB中就不存在
解决方案:
1:布隆过滤器(boomfilter) ,缺点是无法确保100%的准确
2:缓存空对象,缺点是会消耗很多内存
六、代码设计注意项
1、设计查询时走缓存的数据要符合业务逻辑
2、一般情形下,代码中一定要保证查缓存时数据未查到或者出现异常,能够正常去调用第三方或者直接查询数据库,排除上述用堆外缓存做最后一道容灾的情形
3、缓存要按照业务逻辑设置时效性,持久的缓存可以设置定时任务去更新,临时性的缓存失效后查询时主动更新
4、业务逻辑不要依赖临时缓存数据的准确性,还是应该去走数据库
5、储存用户session的缓存信息redis需要固化,储存其他业务的缓存信息的redis为保证数据一致性可以选择不固化。
6、高并发情形,缓存预热非常有必要性
限时分享面试&学习福利资源
好资料第一时间分享,中华石杉老师的 分布式面试突击 视频教程,最清晰整体的 微服务全面解读 的PDF, 体系化的Java路线 资料整理的Github, 亿级电商架构 的视频实战课程,你值得拥有
获取方式: 关注公众号 乔志勇笔记 , 后台回复”学习资料” !!!
近期文章:
如果你喜欢本文
请长按二维码,关注 乔志勇笔记
转发 朋友圈 ,是对我最大的支持哟
如果你喜欢这篇文章,在看,转发吧。
相信明天更加美好 (*^__^*)