1、缓存穿透
访问了数据库不存在的数据
- 缓存设置空值失效时间短一点
- 用一个公用的服务记录不存在的key。判断一次是否是非法key
- 使用布隆过滤器,(原理是使用 bit 数组,给key用多个hash算法记录是否为1)
2、缓存雪崩
缓存大量不可用,全部打到db。拖垮数据库
- 对db请求增加开关,发现请求变慢、阻塞、慢请求超过阈值时关闭开关部门直接返回失败
- 对缓存数据增加多个副本、失败后查其它副本
- 集群监控、告警,停止非核心功能,保证核心功能
3、数据不一致
数据库与缓存数据不一致,其实是分布式系统的矛盾点AP与CP的选择,下面说说通用的做法
- 缓存更新失败后,重试机制,重试失败后写入错误记录表,待缓存修复在更新缓存
- 缓存时间适当调短,重新加载数据,确保最终一致
- 监听从库binLog后删除缓存,与代码解耦。
4、数据并发竞争
大量请求访问并发访问相同数据(缓存key失效或第一次访问),最终导致DB压力剧增
- 互斥锁
- 缓存数据多个备份
- 缓存预热
5、热key
大量请求访问同一个key(十万百万),打到一台缓存节点上,这时网卡,带宽,cpu很容易突破极限
- 识别热key,可以通过离线数据分析最近高频率的key
- 然后把key分散到不同节点上
- 服务端还可以使用本地缓存,将热key缓存减少对远程缓存的冲击
6、大key
缓存中key的value很大,频繁访问占带宽很容易产生慢查,拖垮缓存集群
- 减少大key
- 拆成多个key