Redis缓存问题

306 阅读3分钟

缓存

1. 什么是缓存

缓存就是数据交换的缓冲区(称作Cache),是存贮数据的临时地方,一般读写性能较高

2. 缓存的作用与成本

作用:

  • 降低后端负载
  • 提高读写性能,降低响应时间

成本:

  • 数据一致性成本
  • 代码维护成本
  • 运维成本

3. 缓存更新策略

内存淘汰超时剔除主动更新
说明不用自己维护,利用Redis的内存淘汰机制,当内存不足时自动淘汰部分数据,下次查询时更新缓存给缓存数据添加TTL时间,当期后自动删除缓存,下次查询时更新缓存编写业务逻辑,在修改数据库的同时,更新缓存
一致性一般
维护成本

业务场景:

  1. 低一致性需求:使用内存淘汰机制。使用于更新次数较少的数据。

  2. 高一致性需求:主动更新,并以超时剔除作为兜底方案。使用于需要频繁更新的数据。

    • 读操作:
      • 缓存命中直接返回
      • 缓存未命中查询数据库,并写入缓存,设定超时时间
    • 写操作:
      • 先写数据库,然后再删除缓存
      • 要确保数据库与缓存操作的原子性

4. 缓存穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。如果不断发送这样的请求,会给数据库带来巨大压力。

常见解决方案:

  • 缓存空对象

    • 优点:实现简单,维护方便
    • 缺点:
      • 额外消耗内存
      • 可能造成短期不一致
  • 布隆过滤

    • 优点:内存占用较少,没有多余的key
    • 缺点:
      • 实现复杂
      • 存在误判可能

其他解决方案:

  • 增强id的复杂度,避免被猜测id的规律
  • 做好数据的基础格式校验
  • 加强用户权限的校验
  • 做好热点参数的限流

5. 缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

解决方案:

  • 给不同的key的TTL添加随机值
  • 利用Redis集群提高服务的可用性
  • 给缓存业务添加将极限流策略
  • 给业务添加多级缓存

6. 缓存击穿

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效,无数的请求访问会在瞬间给数据库带来巨大冲击。

常见解决方案:

  • 互斥锁
  • 逻辑过期
解决方案优点缺点
互斥锁没有额外的内存消耗
保证一致性
实现简单
线程需等待,性能受影响
可能有死锁的风险
逻辑过期线程无需等待,性能较好不保证一致性
有额外内存消耗
实现复杂