概念
缓存就是数据交换的缓冲区(Cache),是存贮数据的临时地方,一般读写性能较高。
作用:
-  降低后端负载 
-  提高读写效率,降低相应时间 
成本:
-  数据一致性成本 
-  代码维护成本 
-  运维成本 
缓存更新策略
| 内存淘汰 | 超时剔除 | 主动更新 | |
|---|---|---|---|
| 说明 | 不用自己维护,利用redis的内存淘汰机制,当内存不足时自动淘汰部分数据。下次 查询时更新缓存 | 给缓存数据添加TTL时间,到期后自动删除缓存,下次查询时更新缓存 | 编写业务 逻辑,在修改数据库的同时,更新缓存 | 
| 一致性 | 差 | 一般 | 好 | 
| 维护成本 | 无 | 低 | 高 | 
应用场景:
-  低一致性需求:使用redis自带的内存淘汰策略 
-  高一致性需求:主动更新,并以超时剔除作为 兜底方案 -  读操作: -  缓存命中直接返回 
-  缓存未命中则查询数据库,并写入缓存,设定超时时间 
 
-  
-  写操作 -  先写数据库,然后再删除缓存 
-  要确保数据库于缓存操作的原子性 
 
-  
 
-  
缓存穿透
缓存穿透是指客户端请求的 数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打在数据库。
常见解决方案:
-  缓存空对象: -  优点:实现简单,维护方便 
-  缺点: -  额外的内存消耗 
-  可能造成短期的不一致  
 
-  
 
-  
-  布隆过滤 -  优点:内存占用较少,没有多余key 
-  缺点: -  实现复杂 
-  存在误判可能  
 
-  
 
-  
缓存雪崩
指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大的压力

解决方案:
-  给不同的key的ttl添加随机值 
-  利用redis集群提高服务的可用性 
-  给缓存业务添加降级限流策略 
-  给业务添加多级缓存 
缓存击穿
缓存击穿问题也叫热点key问题,就是一个被高并发访问并且缓存重建业务叫复杂的key突然失效,无数的请求访问会在瞬间给数据库带来巨大的冲击

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