缓存击穿
高并发时,当一个key非常热点(类似于爆款),在不停的扛着大并发,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库并设置到缓存中,导致性能下降。
- 永不过期
- 二级本地缓存
- 对于动态热点key,可以尝试本地缓存命中过多次数后,将其再写入 redis,防止 redis 的过期
- 提前生成
- 分片,同一个缓存存为多个不同的 key
缓存雪崩
缓存集中过期,或者缓存服务器宕机,导致大量请求访问数据库,造成数据库瞬间压力过大,宕机。
- 随机失效时间
缓存穿透
数据库不存在缓存中也不存在,导致每次请求都会去查询数据库,这时的用户很可能是攻击者,如发起为id为“-1”的数据或id为特别大(不存在的数据),导致数据库压力过大或宕机。
- 参数校验
- 缓存空对象
- 布隆过滤器
大 Key 问题
单个键的值过大,比如一个 List 有上百万元素,或者一个 String 占用几十 MB。 操作大 Key 会非常耗时,容易阻塞 Redis 单线程或者占用大量的带宽
- 将一个大 Key 拆分为多个小 Key
- Sting 类型存储 json 是否可以将其拆分为 hash
- 是否可以客户端进行压缩后再存储
- 使用更合适的数据结构,用户统计使用Bitmap 或 HyperLogLog
热 Key 问题
参考缓存击穿