Redis 常见问题

76 阅读1分钟

缓存击穿

高并发时,当一个key非常热点(类似于爆款),在不停的扛着大并发,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库并设置到缓存中,导致性能下降。

  • 永不过期
  • 二级本地缓存
    • 对于动态热点key,可以尝试本地缓存命中过多次数后,将其再写入 redis,防止 redis 的过期
  • 提前生成
  • 分片,同一个缓存存为多个不同的 key

缓存雪崩

缓存集中过期,或者缓存服务器宕机,导致大量请求访问数据库,造成数据库瞬间压力过大,宕机。

  • 随机失效时间

缓存穿透

数据库不存在缓存中也不存在,导致每次请求都会去查询数据库,这时的用户很可能是攻击者,如发起为id为“-1”的数据或id为特别大(不存在的数据),导致数据库压力过大或宕机。

  • 参数校验
  • 缓存空对象
  • 布隆过滤器

大 Key 问题

单个键的值过大,比如一个 List 有上百万元素,或者一个 String 占用几十 MB。 操作大 Key 会非常耗时,容易阻塞 Redis 单线程或者占用大量的带宽

  • 将一个大 Key 拆分为多个小 Key
  • Sting 类型存储 json 是否可以将其拆分为 hash
  • 是否可以客户端进行压缩后再存储
  • 使用更合适的数据结构,用户统计使用Bitmap 或 HyperLogLog

热 Key 问题

参考缓存击穿