缓存雪崩等问题介绍

缓存的作用

    缓存是放置在物理数据层前面的一道屏障,具有快速存取的特点;数据存放在物理设备上,磁盘是物理设备,读取效率低,速度慢,导致响应用户耗时长;频繁的磁盘操作还会导致IO高等问题;

    为了快速的响应用户,可以将用户经常访问,但更改频率低的数据进行缓存,以达到快速响应用户,降低磁盘io的目的;

但是任何缓存不是万能的,缓存也就有缓存的缺点,缓存的数据,其一致性差,对于那些修改频繁,但访问比较少的数据,缓存的代价也比较大;同时还可能会遇到“缓存击穿”、“缓存穿透”和“缓存雪崩”等现象。

缓存击穿是指在缓存中,某些热点数据有大量的访问在进行,而在此时,热点数据正好失效,这样的话,会导致大量的请求直接访问到磁盘数据上;瞬间大量的请求磁盘数据,可能会给磁盘带来非常大的压力。

由于缓存击穿是由于某些热点数据在某一时刻大量的失效导致的,所以针对于这一形成原因进行处理即可;

1、通常我们可以在后台进行数据刷新,这样做的话,通常需要在内存中记录数据的超时时间,这种方式,由于跟新数据和访问数据的线程不是同一个,需要注意数据的安全(memcache、redis的lru策略);

2、也可以在使用内存数据时,对数据得失效时间进行检测(惰性检测),当数据快要到达失效时间点的时候,进行数据刷新,这种方式也存在一定的弊端,如果某一个数据在规定的失效更新时间没没有被访问,而是在失效后背访问,则会响应旧数据给用户,同时长时间没有被访问,则有可能长期驻留在内存中。

3、还可以采取分级缓存方式,同一个数据,在缓存中存在两份副本,两份数据的失效时间不同,当优先级高的数据在失效时间到达后后从缓存中删除,然后去更新数据,此时如果有用户访问,在优先级高的缓存中没有找到,则可以去取优先级低的缓存中的数据去响应用户。


缓存穿透是指用户访问的数据在缓存中没有,请求直接访问到磁盘上的数据,儿在磁盘的数据中也没有该数据,大量的这类数据请求,同样会给磁盘造成压力。

1、为了防止缓存穿透,可以采用缓存空值的方式,当数据库和缓存中都没有该数据,可以在用户首次访问后,创建一个空数据保存在内存中,这样可以防止大量用户请求到达磁盘,同时为了防止后续该请求在磁盘中有数据,而我们的缓存中没有感知到的场景,我们可以为缓存了空值的数据,在固定时间间隔后去访问一次磁盘数据;

2、同时还可以设计使用布隆过滤器方式,检测磁盘中是否有数据的值;


缓存雪崩是指在某一时间点,缓存异常不能用或者缓存中的绝大部分数据超时,导致用户的请求几乎都在操作磁盘数据。

1、为了避免出现缓存雪崩现象,我们在进行数据缓存设计的时候,可以考虑缓存支持集群化部署;

2、同时在一个缓存服务上不要存放到期时间过于集中的数据;

3、针对于那种用户经常访问的数据,最好能够做到持久的保存在缓存中,可以采用配置项或者脚本定时访问的方式来触发数据停留在缓存中;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容