缓存命中率过低;大量缓存项同时刷新;刷新同一个缓存项

时间: 2019-04-02阅读: 1218标签: 缓存

缓存的作用是在内存中临时存储来自外部系统(如数据库)的数据,以便让请求更快的得到响应。如果请求数据在缓存中不存在,或者已经超时失效,那么也要从外部系统查询,然后放入缓存中,这个过程叫刷新缓存。

这是缓存的基本使用逻辑,但是实际当中可能出现三种异常情况,它们会导致缓存起不到预期的使用效果,以至于系统性能明显下降。


缓存命中率过低

缓存命中率指的是从缓存中找到数据的请求占所有请求的比重。例如 100 个请求当中有 90 个请求的结果可以直接从缓存中获得,那么命中率就是 90%。剩下 10% 的请求就要从外部系统查询数据,填入缓存,然后再返回。

什么情况下缓存命中率高呢?请求的数据比较集中的时候,例如 80% 的请求集中在 20% 的数据上,这部分数据也被称作热点之类的。热点越热,缓存命中率越高。

因此之所以出现缓存命中率过低,自然就是因为热点不够热,请求的数据非常分散。命中率过低的后果就是很多请求的数据仍需从外部系统查询,假如是数据库的话,数据库的压力就会非常大,同时系统的响应也明显变慢。

要缓解缓存命中率过低的问题,最直接的办法当然是加大缓存。本地缓存不够,就用分布式缓存,多台机器分开存储。

特例一:分散攻击

有时候系统正常情况下是存在热点数据的,但突然有一天出现大量的分散请求,导致缓存命中率直线下降。这些异常的请求可以看作是有意的攻击行为,目的就是让系统无法响应。

而遇到攻击行为的话,加大缓存可能是徒劳的,这时候需要去识别请求,对于被归类为攻击的请求主动延长响应时间,甚至拒绝返回结果。

比如说一个论坛,突然遇到大量请求,均匀的访问五年内的帖子内容,导致数据库负载很大,此时可以将访问老帖子的请求(帖子ID通常是递增的,ID越小表示发帖时间越久)返回时间适当延长,比如延长到五分钟。不过使用这种做法时千万不要简单的暂停线程,这会导致没有多余的线程来处理正常的请求。

特例二:无效的 key

有时候系统收到大量请求,这些请求的数据非但缓存中没有,连数据库也没有,那么每个请求不但因为缓存未命中而去查询数据库,而且因为数据库没有记录而无法填充到缓存。这是更加恶劣的情况。

遇到这种情况,同样需要鉴别无效的请求。对于 key 自增的情况,可以通过值范围来鉴别;而对于使用 UUID 的情况,就需要低成本的鉴别方式,布隆过滤器是一个选择。


大量缓存项同时刷新

缓存通常都是存在失效时间的,需要避免的一种情况就是大量缓存项在同一个时间点失效,如果此时对这些数据的请求量大,那么这些请求就会同时去刷新各自的缓存,这就将压力传递到了外部系统上。避免这种情况的办法就是在预定的失效时间基础上加上一个随机值,以错开缓存项的失效时间。


大量请求刷新同一个缓存项

一个请求遇到缓存失效,于是去刷新缓存,而在这个过程中又有大量请求来访问正在刷新的缓存项,导致该缓存项完成本次刷新后,又立刻被另一个线程刷新,实质上每个请求都因为缓存未命中而去访问了外部系统。

出现这个现象的原因是设计上的不合理。当一个缓存正在刷新时,访问该缓存项的其他线程应该等待刷新完毕,这样它们就可以直接从缓存获得结果了。线程同步当然是用锁。如果是分布式系统,那就用分布式锁。


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/2679

vue开发之keep-alive

keep-alive 是 Vue 的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 transition 相似,keep-alive 是一个抽象组件:它自身不会渲染成一个 DOM 元素,也不会出现在父组件链中。

html强制清缓存

。在开发时候经常遇到一个问题,我们根据版本号去控制缓存问题,当我们发布新版本,使用心得版本号的时候,发现html里面引用的版本号却是旧的版本号 ,原来是该html文件被缓存了,很多时候我们设置禁止html文件被缓存,但依然会出现被缓存的情况。

keep-Alive搭配vue-router实现缓存页面效果

ue工程中有些页面需要有缓存。这个功能通过keep-alive组件实现,keep-alive组件可以使被包含的组件保留状态,或避免重新渲染。

解决vue,keep-alive不同路由同一个组件的缓存问题

当vue使用keep-alive缓存页面状态时,当不同路由指向同一个组件,如何分别缓存页面状态的问题。vue缓存时如果发现组件相同,则会认定为同一个。

清除浏览器缓存的方法

怎么清除浏览器缓存,比如每次进入页面后先清理上次浏览器缓存的html,css,js ? 直接在html页面的head标签中添加,当然这个需要浏览器支持, 不想缓存静态文件,

Nginx禁止html等缓存

在本地开发的时候,经常会碰到缓存引起的莫名其妙的问题,最暴力的方式就是清掉浏览器的缓存,或者使用Ctrl + F5,Shift + F5强制刷新页面。 有时候按了好几下,缓存还是清不掉,只能暂时禁用浏览器静态资源缓存了

html页面清除缓存

页面打开时,由于缓存的存在,刚刚更新的数据有时无法在页面得到刷新,当这个页面作为模式窗口被打开时问题更为明显, 如何将缓存清掉?

抽离css以及公共js

分离css:为何要把 CSS 文件分离出来,而不是直接一起打包在 JS 中。当我们考虑更好地利用缓存来加速静态资源访问时,会尝试把一些公共资源单独分离开来,利用缓存加速,以避免重复的加载

彻底理解浏览器缓存机制

浏览器的缓存机制也就是我们说的 HTTP 缓存机制,其机制是根据 HTTP 报文的缓存标示进行的。所以在分析浏览器缓存之前,我们先使用图文简单介绍一下 HTTP 报文,HTTP 报文分为两种:

浏览器缓存问题原理以及解决方案

浏览器缓存就是把一个已经请求过的Web资源(如html页面,图片,js,数据等)拷贝一份副本储存在浏览器中,为什么使用缓存:减少网络带宽消耗,降低服务器压力,减少网络延迟,加快页面打开速度

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!