教你生产环境怎么用缓存

本文介绍了缓存的作用、位置,重点讲解了进程外缓存中的Cache Aside Pattern,包括其定义、问题及实践。同时讨论了缓存的负面效果,如缓存雪崩和穿透,提出相应的解决方案。最后提到了代码设计中需要注意的事项,强调了数据一致性和缓存管理的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

限时分享面试&学习福利资源

好资料第一时间分享,中华石杉老师的分布式面试突击视频教程,最清晰整体的微服务全面解读的PDF,体系化的Java路线资料整理的Github,亿级电商架构的视频实战课程,你值得拥有

获取方式: 关注公众号乔志勇笔记, 后台回复"学习资料" !!!

一、缓存的作用

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、高并发情形,缓存预热非常有必要性

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值