1 缓存失效
1.1 缓存穿透
指查询一个根本不存在的数据,由于缓存中没有该数据的缓存,导致每次请求都要到数据库查询,进而失去缓存的意义。
解决方案
- 缓存空结果:对于查询结果为空的数据,也进行缓存,设置一个较短的过期时间。
- 布隆过滤器:在缓存层之前使用布隆过滤器,快速判断请求的数据是否存在于数据库中,过滤掉不存在的数据请求。
1.2 缓存击穿
指某个热点数据在缓存失效的瞬间,有大量请求同时打到数据库,导致数据库压力骤增。
解决方案
- 互斥锁:在缓存失效时,通过加锁的方式,确保只有一个线程去加载数据并更新缓存,其他线程等待。
- 热点数据永不过期:对于热点数据,设置为永不过期,并定期更新缓存。
1.3 缓存雪崩
指在同一时间大量缓存失效,导致大量请求直接打到数据库,可能导致数据库崩溃。
解决方案
- 缓存过期时间随机化:在设置缓存时,为每个缓存键设置一个随机的过期时间,避免同一时间大量缓存同时失效。
- 双缓存策略:使用两个缓存区域,一个主缓存,一个备份缓存,当主缓存失效时,使用备份缓存。
2 过期删除策略
- **定时删除:**在设置键的过期时间时,创建一个定时器,当过期时间到达时,立即删除该键。
- **惰性删除:**当访问一个键时,检查该键是否过期,如果过期则删除该键。
- **定期删除:**Redis 定期扫描一部分键,删除其中的过期键。扫描频率和扫描数量可以通过配置进行调整。