Skip to content

Latest commit

 

History

History
87 lines (56 loc) · 1.86 KB

File metadata and controls

87 lines (56 loc) · 1.86 KB

缓存

缓存使用策略

  1. Cache Aside (业务系统常用)
  2. Read/Write Through
  3. Write Behind

Cache Aside 下处理

先更新缓存再更新数据库

若更新数据库失败,缓存数据可能已经被读请求读到。且缓存数据回滚的时候也可能会失败。

先删除缓存再更新数据库

  1. 写请求A删除缓存
  2. 读请求B读缓存读不到
  3. 读请求B读数据库,并把旧值写到缓存
  4. 写请求A更新数据库

先更新数据库再更新缓存

多并发写场景下会导致数据库和缓存不一致。

  1. 写请求A更新数据库
  2. 写请求B更新数据库
  3. 写请求B更新缓存
  4. 写请求A更新缓存

同时,多写场景下,没必要多次更新缓存。

先更新数据库再删除缓存

高并发写场景下可能会有问题,但应该不常见(极端情况)

  1. 写请求A更新数据库
  2. 写请求A删除缓存
  3. 读请求B读缓存,但是没读到
  4. 读请求B读数据库,读到了写请求A更新的值
  5. 写请求C更新数据库
  6. 写请求C删除缓存
  7. 读请求B将读到的数据写到缓存

大key

导致问题

  1. 内存不均 节点间内存分配不均衡
  2. 阻塞请求 单value较大读写需要长时间处理
  3. 阻塞网络 单value较大会占用网络带宽

解决

  1. 拆分
  2. 压缩

热key

解决

  1. 多级缓存
  2. 备份热key 读写分离

缓存穿透

对不存在的数据进行频繁请求

  1. 过滤请求 布隆过滤器
  2. 缓存空数据

缓存击穿

热key失效

  1. 热key不设置过期时间
  2. 对热key做冗余,横向扩展
  3. 使用多级缓存,纵向扩展
  4. 访问数据库中的热key时,使用分布式锁

缓存雪崩

数据没有加载到缓存中或者缓存大面积失效或缓存服务器宕机

  1. 合理设置缓存时间 固定时间+随机时间
  2. 缓存预热
  3. 部署多台缓存服务器