Redis缓存带来很大的便利,但是使用不当也会带来额外的问题,例如缓存雪崩、缓存击穿、缓存穿透、缓存数据一致性等问题。
缓存雪崩
什么是缓存雪崩?
缓存雪崩是指大量的应用请求没有命中Redis 缓存(大规模的缓存失效),应用将大量请求发送到数据库层,导致数据库层的压力激增。
缓存雪崩形成原因?
1.缓存中大量数据同时过期,导致大量请求无法得到处理。
解决方法:如果有大量数据同时过期,那么在设置过期时间时,过期时间增加随机数(例如1-5分钟)。
2.数据没有预热到缓存(例如整点开始的秒杀活动、爆款商品推文等)。
解决办法:大量请求到达前加载数据到缓存中,并且缓存过期时间分散些,避免集中过期。
缓存击穿
什么是缓存击穿?
缓存击穿是指针对某个访问非常频繁的热点数据的请求没有命中缓存,大量请求后端数据库查询数据,导致了数据库压力激增,会影响数据库处理其他请求。
缓存击穿的情况,经常发生在热点数据过期失效时。
缓存击穿是数据库有数据,只不过是缓存中不存在,和缓存穿透不一样,缓存穿透是缓存和数据库都没有数据。
如何应对缓存击穿?
1.对于访问特别频繁的热点数据,我们设置很长的过期时间,这里不建议不设置过期时间,后面可能忘记或者删除数据失败时,数据长期存在缓存中。
2.可以考虑降低打在数据库上的请求数量。例如使用互斥锁。如果缓存失效的情况,只有拿到锁才可以查询数据库,降低了在同一时刻打在数据库上的请求,防止数据库打死。当然这样会导致系统的性能变差。
缓存穿透
什么是缓存穿透?
缓存穿透是指要访问的数据既不在 Redis 缓存中,也不在数据库中,导致请求在访问缓存时,发生缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据。
如何应对缓存穿透?
可以缓存一个空值或者默认值,如果是敏感信息(例如用户、订单信息)增加日志告警,可以感知是否是恶意攻击。
本文介绍了Redis缓存带来的便利及其潜在问题,包括缓存雪崩、缓存击穿和缓存穿透。缓存雪崩是大量缓存同时过期导致数据库压力增大,解决方案是分散过期时间。缓存击穿是热点数据未命中缓存,直接请求数据库,可设置较长过期时间或使用互斥锁。缓存穿透是缓存和数据库都无数据,建议缓存空值或默认值,并对敏感信息设置日志告警。
1184

被折叠的 条评论
为什么被折叠?



