# 04 | 使用缓存的姿势
# 1 旁路缓存策略
# 1.1 策略:
读:读数据不存在时,从库中查询,然后再更新缓存
写:写数据后,清理缓存
# 1.2 问题:
# 1.2.1 缓存不致的问题
由于缓存写入通常远快于数据库的写入,实际中很难出现数据不一致的情况
# 1.2.2 缓存命中率问题
写入频繁时,缓存会被频繁清理
- 更新时使用分布式锁,同时更新缓存(影响写入性能)
- 更新时更新缓存,缓存的过期时间设置短(影响小)
# 2 读穿 / 写穿的策略
# 策略
- 用户只与缓存打交道,由缓存与数据库通信
- 读穿实现:Guava Loading Cache
# 写失效
- 写入缓存,由缓存组件同步数据库
- 不写入缓存,直接更新数据库中(减少一次缓存写入,提升性能)
# 写回
# 策略
写入缓存,标记缓存为脏,之后读取时再写入后端存储(再次使用)这样之后写清求都不需要更新库
- 实现:Page Cache,日志异步刷盘,消息队列异步写磁盘
# 区别
- 写标记脏后,之后再写不需要更新库,直接更新脏数据
# 缓存如何做到高可用
# 缓存穿透怎么办
# 含义
缓存中查询不到数据,而不得不从后端查询
# 产生原因
- 正常现象:(80/20原则),缓存容量有上限
- 异常情况:
- 查询不存在值:
- 添加空值:注意空值占的空间
- 布隆过滤器:算法碰撞,不支持删除,错误几率
- 热点缓存失效(控制并发):
- 后台异步更新,未更新前不穿透,直接返回
- 分布式锁更新
- 查询不存在值:
← 05 监控指标 1 什么时候需要拆分 →