1、缓存穿透
缓存穿透:访问的 Key 不存在。
解决方案
- 对空值缓存:若查询返回的数据为 null,将结果 null 进行缓存并设置较短的过期时间(通常不超过 5min)
- 设置白名单:使用 bitmaps 定义一个可访问名单。
- 名单 ID 作为 bitmaps 的偏移量。
- 每次访问数据时,将访问者 ID 与 bitmaps 中的 ID 进行比较。
- 若访问者 ID 不在 bitmaps 中则进行拦截。
- 布隆过滤器:哈希函数 + 位图
- 实时监控:当 Redis 的命中率骤低,需排查访问对象和访问数据,可设置黑名单限制服务。
2、缓存击穿
缓存击穿:访问的某个 Key 缓存过期,且有大量并发请求。
3、缓存雪崩
缓存雪崩:访问的多个 Key 缓存过期,且有大量并发请求。
- 击穿:一个 Key
- 雪崩:多个 Key
- 构建多级缓存架构:Nginx 缓存 + redis 缓存 + 其他缓存(ehcache等)
- 使用锁或队列:不适合高并发情况(影响效率)
- 使用锁或者队列,避免大量线程同时请求访问数据。
- 从而避免缓存失效时,大量并发请求访问数据库。
- 设置过期标志,更新缓存:设置缓存数据过期的提前量,达到后会通知另外的线程在后台更新缓存。
- 将缓存失效时间错开:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。