# 04 | 使用缓存的姿势

# 1 旁路缓存策略

# 1.1 策略:

  • 读:读数据不存在时,从库中查询,然后再更新缓存

  • 写:写数据后,清理缓存

# 1.2 问题:

# 1.2.1 缓存不致的问题

由于缓存写入通常远快于数据库的写入,实际中很难出现数据不一致的情况

# 1.2.2 缓存命中率问题

写入频繁时,缓存会被频繁清理

  • 更新时使用分布式锁,同时更新缓存(影响写入性能)
  • 更新时更新缓存,缓存的过期时间设置短(影响小)

# 2 读穿 / 写穿的策略

# 策略

  • 用户只与缓存打交道,由缓存与数据库通信
  • 读穿实现:Guava Loading Cache

# 写失效

  • 写入缓存,由缓存组件同步数据库
  • 不写入缓存,直接更新数据库中(减少一次缓存写入,提升性能)

# 写回

# 策略

写入缓存,标记缓存为脏,之后读取时再写入后端存储(再次使用)这样之后写清求都不需要更新库

  • 实现:Page Cache,日志异步刷盘,消息队列异步写磁盘

# 区别

  • 写标记脏后,之后再写不需要更新库,直接更新脏数据

# 缓存如何做到高可用

# 缓存穿透怎么办

# 含义

缓存中查询不到数据,而不得不从后端查询

# 产生原因

  1. 正常现象:(80/20原则),缓存容量有上限
  2. 异常情况:
    • 查询不存在值:
      • 添加空值:注意空值占的空间
      • 布隆过滤器:算法碰撞,不支持删除,错误几率
    • 热点缓存失效(控制并发):
      • 后台异步更新,未更新前不穿透,直接返回
      • 分布式锁更新
上次更新: : 7 months ago