性能优化之缓存篇

缓存的主要手段有:浏览器缓存、CDN、反向代理、本地缓存、分布式缓存、数据库缓存。

解读《大型网站技术架构》一文中,其实已经说到过。

我们一般说做性能优化时是指后三个:本地缓存、分布式缓存、数据库缓存。

前面三个缓存策略属于网站前端的范畴。

从硬件介质上来看,缓存分为内存和硬盘两种。

但从技术上,又可以分成内存、硬盘文件、数据库。

我们通常意义上说的缓存一般都是基于内存的。

因为只有内存,才足够快。

数据库缓存一般也是基于内存的,但这个活一般是DBA在配置数据库的时候就设置好了。

对于大部分开发人员来说,我们一般所说的缓存优化都是基于本地缓存(ocal cache)和远程缓存(remote cache)。

而现在远程缓存这个词一般也被分布式缓存这个常用方案所代指。

4. 什么时候使用缓存?

4.1 缓存的使用判断

什么时候使用缓存的判断其实比较简单,抓住两点就行了:

1、是不是热点数据?

所谓热点,一般是遵循二八定律,即百分之八十的访问集中在百分之二十的数据上。

2、是不是读比写多?

这个比例一般为2:1。

4.2 什么时候不应该使用缓存?

反过来就是了。

1、没有热点数据不要使用缓存,也没什么意义。

因为内存资源是比较宝贵的。

2、频繁修改的数据不要使用缓存。

因为可能写入后还来不及读取就已失效或被淘汰,并且容易产生脏读。

4.3 合理使用缓存

最后,最重要的是确认是否需要使用缓存?

确定了后,再选择合适的缓存工具及使用缓存的方式。

5. 缓存时常见的一些问题

使用缓存优点很多,但也存在一些很常见的问题。双刃之剑,就看怎么用了。

列举一些我们工作中常见的一些缓存问题,并给出至少一种解决方案。

5.1 缓存更新带来的数据不一致与脏读

缓存更新的常见策略有:

1、先更新数据库再更新缓存;

2、先更新数据库再删除缓存;

3、先删除缓存再更新数据库;

4、定时清理缓存;

5、有请求访问数据时,判断缓存是否过期,过期从数据库中刷新缓存。

在这几种方案中,如果修改缓存与数据库不在同一个事物中,就带来了数据不一致和脏读的问题。

对应方案1:先删除缓存再更新数据库,并且在同一个事物中。

对应方案2:缓存自动失效后,另外的异步线程进行缓存更新。

对应方案3:缓存更新在并发、分布式要考虑锁,redis天生就是单线程,比较有优势。

5.2 怎么做缓存预热

缓存预热是指在用户可访问服务之前,将热点数据加载到缓存的操作,这样可以有效避免上线后瞬时大流量造成系统不可用。

缓存预热的一般性策略:

1、开发个缓存刷新功能,手工刷新;

2、项目启动的时候自动进行加载(一般为字典表等数据量不大的数据);

3、设置个定时器,自动刷新缓存;

4、提前统计热点数据,事先批量加载到如redis这样缓存工具中。

5.3 缓存重建

缓存失效后,重建热点缓存,如果耗时较长,在重建过程中,性能、负载不好。

对应方案:

1、正常情况下,交错缓存失效时间,减轻缓存压力;

2、崩溃失效的情况下,可以使用带持久化功能的缓存来恢复,比如Redis;

3、如果是MongoDB则不太一样,它是采用mmap来将数据文件映射到内存中,所以当MongoDB重启时,这些映射的内存并不会清掉,不需要进行缓存重建与预热。

5.4 缓存雪崩与可用性

缓存雪崩:缓存在同一时间失效时,访问直达数据库层,可能导致DB挂掉、系统崩溃。

对应方案1:交错缓存失效时间或随机缓存失效时间。

对应方案2:主从热备(Redis Sentinel)。

对应方案3:集群/水平切分(Redis Cluster、一致性哈希)。

5.5 缓存穿透

缓存穿透:持续高并发访问某个不存在的Key。

对应方案1:空值缓存。

对应方案2:布隆过滤器(bloom filter) + bitmap。穷举可能访问的数据放入bitmap中,使用hash访问。

5.6 缓存击穿

缓存击穿:热点Key失效,高并发请求,直击数据库。

缓存击穿与缓存穿透很相似,不同点是是缓存击穿前访问的是真实的热点数据,只是在某一刹那失效了,造成了击穿的效果。

这样看,它其实也是缓存雪崩的一个特例。与雪崩的区别即在于击穿是对于特定的热点数据,而雪崩是全部数据。

对应方案:多级缓存及交错失效时间 + LRU 淘汰算法。

对于热点数据进行二级或多级缓存,并对于不同级别的缓存设定不同的失效时间,缓解雪崩。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
tyle=“zoom: 33%;” />

最后

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-UaMXxMav-1712922655234)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值