Redis缓存命中示意图
缓存穿透
缓存穿透指的是在业务中,某些数据会频繁被访问,例如秒杀活动中的商品信息等,这些数据被称为热点数据。如果缓存中的某个热点数据过期了,并且在此期间大量的请求访问了该热点数据,那么缓存无法命中,请求就会直接访问数据库。由于数据库处理高并发请求的能力有限,这种情况容易导致数据库崩溃,从而出现缓存击穿的问题。为了解决这个问题,我们需要进行相应的优化措施。
解决方法1:
为了解决缓存击穿的问题,可以采用互斥锁方案。该方案保证同一时间只有一个业务线程可以更新缓存,其他线程若未获取到锁,则可以选择等待锁释放后重新读取缓存,或者返回空值或默认值。这样可以有效避免大量请求同时访问数据库,提高系统的性能和稳定性。
解决方法2:
为了解决缓存击穿的问题,可以采用不给热点数据设置过期时间的方案,并由后台线程异步更新缓存。当热点数据准备要过期时,可以提前通知后台线程更新缓存并重新设置过期时间,以确保缓存的及时更新。这种方案可以避免热点数据过期后引起大量请求直接访问数据库的情况,从而提高系统的性能和稳定性。
缓存穿透
缓存穿透指的是用户访问某个热点资源时,没有命中redis缓存,于是到数据库获取数据,数据库也查询不到数据(例如查询id为0或负数等不存在的数据),所以这个请求的数据不会被放到缓存中,后续用户一直请求这个数据,请求一直连接数据库查询,造成数据库压力过大。
解决方法1:
无论在数据库有没有查到数据,都在redis缓存一份,比如当热点数据查询不到时,将空值也放入redis。
解决方法2:
使用布隆过滤器,过滤参数不符合规则的请求。
缓存雪崩
当缓存中一批热点数据过期时,此时大量用户访问热点数据,因为缓存已经过期,所以请求将直接通过数据库查询,造成数据库压力过大。
解决方法1:
保证热点数据不会过期,每次访问热点数据时刷新或累加热点数据的有效时间。
解决方法2:
手动将即将缓存起来的热点数据缓存进redis。