前言一般来说,现在的互联网应用网站或者App,它的整体流程可以用我们这个图里展示的来表示,用户请求开始,从这个界面是最里面的浏览器和APP,到网络转发,再到应用服务,最后到存储,这纯属可能是数据库文件系统,然后再返回到界面呈现内容 。
文章插图
随着互联网的普及,内容信息越来越复杂,用户数和访问量越来越大,我们的应用需要支撑更多的并发量,同时,我们的应用服务器和数据库服务器所做的计算也越来越多,但是,往往我们的应用服务器的资源是有限的,而且技术变革是缓慢的,所以每秒能接收请求次数也是有限的,或者说文件的读写也是有限的 。
如何能有效利用有限的资源来提供尽可能大的吞吐量呢?一个有效的办法就是引入缓存,打破图中的标准的流程,每个环节中请求可以从缓存中直接获取目标数据并返回,从而减少他们的计算量,来有效提升响应速度,让有限的资源服务更多的用户,像我们这个图里展示的缓存的使用,它其实可以出现在1到4的各个环节中 。
缓存一致性问题当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象 。
这就比较依赖缓存的过期和更新策略 。一般会在数据发生更改的时,主动更新缓存中的数据或者移除对应的缓存 。
文章插图
缓存并发问题缓存过期后将尝试从后端数据库获取数据,这是一个看似合理的流程 。但是,在高并发场景下,有可能多个请求并发的去从数据库获取数据,对后端数据库造成极大的冲击,甚至导致 “雪崩”现象 。
此外,当某个缓存key在被更新时,同时也可能被大量请求在获取,这也会导致一致性的问题 。那如何避免类似问题呢?
我们会想到类似“锁”的机制,在缓存更新或者过期的情况下,先尝试获取到锁,当更新或者从数据库获取完成后再释放锁,其他的请求只需要牺牲一定的等待时间,即可直接从缓存中继续获取数据 。
文章插图
缓存穿透问题缓存穿透在有些地方也称为“击穿” 。很多朋友对缓存穿透的理解是:由于缓存故障或者缓存过期导致大量请求穿透到后端数据库服务器,从而对数据库造成巨大冲击 。
这其实是一种误解 。真正的缓存穿透应该是这样的:
在高并发场景下,如果某一个key被高并发访问,没有被命中,出于对容错性考虑,会尝试去从后端数据库中获取,从而导致了大量请求达到数据库,而当该key对应的数据本身就是空的情况下,这就导致数据库中并发的去执行了很多不必要的查询操作,从而导致巨大冲击和压力 。
可以通过下面的几种常用方式来避免缓存传统问题:
1、缓存空对象
对查询结果为空的对象也进行缓存,如果是集合,可以缓存一个空的集合(非null),如果是缓存单个对象,可以通过字段标识来区分 。这样避免请求穿透到后端数据库 。
同时,也需要保证缓存数据的时效性 。这种方式实现起来成本较低,比较适合命中不高,但可能被频繁更新的数据 。
2、单独过滤处理
对所有可能对应数据为空的key进行统一的存放,并在请求前做拦截,这样避免请求穿透到后端数据库 。这种方式实现起来相对复杂,比较适合命中不高,但是更新不频繁的数据 。
文章插图
【6个常见的高并发缓存问题,你知道几个?】
缓存颠簸问题缓存的颠簸问题,有些地方可能被成为“缓存抖动”,可以看做是一种比“雪崩”更轻微的故障,但是也会在一段时间内对系统造成冲击和性能影响 。一般是由于缓存节点故障导致 。业内推荐的做法是通过一致性Hash算法来解决 。
缓存的雪崩现象缓存雪崩就是指由于缓存的原因,导致大量请求到达后端数据库,从而导致数据库崩溃,整个系统崩溃,发生灾难 。
导致这种现象的原因有很多种,上面提到的“缓存并发”,“缓存穿透”,“缓存颠簸”等问题,其实都可能会导致缓存雪崩现象发生 。这些问题也可能会被恶意攻击者所利用 。
推荐阅读
- linux后台执行命令:&和nohup的用法
- nginx常见典型故障
- 光纤是怎么到你家的?一文了解清楚
- 白头叶猴的传说 白头叶猴有多少只
- 梦见火山喷发的岩浆 梦见火山岩浆是什么征兆
- 音视频跳线的使用方法
- 流浪地球相似的电影 比战狼还牛的国产电影
- 抖音,头条这类自媒体的推荐机制是什么?大数据如何给你贴标签?
- HTTP2.0中的Server Push
- php过滤只保留中文,英文以及数字的方法