马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
缓存击穿
什么是缓存击穿呢?
在高并发的场景下,一个热门的缓存数据在redis中突然失效(逾期或被删除时,全部的读哀求都会直接落在数据库上,导致数据库瞬间压力剧增,严肃时大概会造成数据库宕机。这种情况就是所谓的“缓存击穿”。(重点在于同一时间访问某一个热门的key数据库中有,redis中没有)
失效的大概缘故因由
- 热门数据逾期:如果缓存中的某些数据是访问非常频仍的热门数据,这些数据在缓存中逾期后,如果有大量哀求同时访问,这些哀求都会穿透到数据库。
- 缓存数据被误删除:由于利用不当或体系bug等缘故因由,缓存中的热门数据被误删除,也会导致缓存击穿。
办理方案
1.设置热门数据永不逾期:对于一些访问非常频仍的热门数据,可以设置为永不逾期,然后通过其他机制(如定时使命或背景线程)去更新这些数据。
2.设置缓存预热:在体系启动大概低峰期时,预先将一些热门数据加载到缓存中,如许在体系高峰期时,这些热门数据就已经存在于缓存中了,从而制止了缓存击穿的发生。
3.分布式锁:在分布式体系中,可以利用分布式锁来控制只有一个服务实例去数据库查询数据并更新缓存,其他服务实例则期待锁开释。这种方式须要引入分布式锁的实现(这个在我的另一篇博客有写到分布式锁 ——》
缓存雪崩
什么是缓存雪崩呢?
缓存雪崩指的是缓存中数据大批量到逾期时间,而查询数据量巨大,引起数据库压力过大乃至宕机的征象。就是当缓存中的大量数据在同一时间失效,且这些数据的访问量又非常大时,全部的哀求都会直接打到数据库上,导致数据库负载急剧增长,大概引发数据库瓦解,进而影响整个体系的正常运行。(重点在于同一时间访问大量的失效的key数据库中有,redis中没有)
失效的大概缘故因由
- 缓存数据的逾期计谋:如果大量的缓存数据被设置为在同一时间点逾期,那么在这个时间点,这些缓存数据将同时失效,导致大量的哀求直接打到数据库上。
- 缓存服务器的故障:如果缓存服务器出现故障,全部原来应该由缓存处置惩罚的哀求都会直接转发到数据库,给数据库带来巨大的压力。
办理方案
1.设置公道的逾期时间:制止大量的缓存数据在同一时间点逾期。可以通过随机设置逾期时间大概为差别范例的缓存数据设置差别的逾期计谋来实现。
2.设置缓存预热:在体系启动大概低峰期时,提前将热门数据加载到缓存中,制止在高峰期时缓存数据失效导致大量哀求直接打到数据库上。
缓存穿透
什么是缓存穿透呢?
缓存穿透是指查询一个肯定不存在的数据,由于缓存是不掷中时须要从数据库查询,而查询的效果在数据库中也不存在,因此不会写入缓存。这将导致这个不存在的数据每次哀求都要到数据库去查询,进而给数据库带来压力。(重点在于访问某个的key数据库中没有,redis中没有,以是每次只能去数据库中查询)
发生的情况
- 当用户或体系查询一个在数据库中不存在的数据时,由于缓存中没有缓存该数据(由于数据本身不存在),每次查询都会失败并直接访问数据库。
- 如果攻击者利用这个毛病举行大量伪造ID的哀求,将极大地增长数据库的负担,乃至大概导致数据库瓦解。
办理方案
1.输入参数校验:在哀求到达前,对哀求参数举行合法性验证,如对哀求的ID举行有效性查抄,过滤掉无效或恶意的哀求。
2.缓存空对象:对于查询为空的效果,也将其缓存起来(但设置较短的逾期时间),如许下次查询类似的数据时可以直接从缓存中返回空对象,制止再次访问数据库。
3.利用布隆过滤器:利用布隆过滤器对哀求举行预处置惩罚,过滤掉大概不存在的数据。布隆过滤器通过哈希函数将元素映射到位数组上,可以快速判断一个元素是否大概存在于聚集中。如果哀求被布隆过滤器拦截,则可以直接返回效果,而无需查询数据库。但是,布隆过滤器存在误判的情况,即大概将不存在的元素判断为存在。(布隆过滤器我的另一篇博客有具体先容)
|