缓存穿透、缓存击穿、缓存雪崩及其解决方案

一、缓存穿透

描述

       缓存穿透是指数据在缓存和数据库中都没有的现象。若不断发起请求,如id为 “-1” 的数据或id为特别大不存在的数据,这时的用户很可能是攻击者,攻击会导致数据库压力过大。

解决方案

(1)接口层增加校验,id<=0的直接拦截;

(2)从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对缓存为key-null,有效时间可以设置稍短,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击。

二、缓存击穿

描述

        缓存击穿是指数据在缓存中没有但存在于数据库中的现象(一般是缓存到期)。此时若有大量并发请求过来,由于缓存中没有数据,只能转而去数据库获取,造成数据库服务器压力瞬间剧增。

解决方案

(1)设置热点数据永不过期;

(2)引入互斥锁(如图1所示):

图1 缓存击穿

三、缓存雪崩

描述

        缓存雪崩是指缓存中大量数据到达过期时间,使得瞬间访问数据库的请求剧增,导致数据库服务器压力过大甚至宕机的现象。和缓存击穿不同的是,缓存雪崩是因为大量数据同时过期,而缓存击穿是因为某一时刻大量请求去获取同一数据。

解决方案

(1)给缓存过期时间加上随机因子,避免数据大面积失效 或 统一规划有效期,使得失效时间均匀分布;

(2)如果缓存数据库分布式部署,考虑将热点数据均匀分布在不同缓存数据库中;

(3)配置二级缓存;

(4)设置热点数据永不失效;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。