- Cache Aside (业务系统常用)
- Read/Write Through
- Write Behind
若更新数据库失败,缓存数据可能已经被读请求读到。且缓存数据回滚的时候也可能会失败。
- 写请求A删除缓存
- 读请求B读缓存读不到
- 读请求B读数据库,并把旧值写到缓存
- 写请求A更新数据库
多并发写场景下会导致数据库和缓存不一致。
- 写请求A更新数据库
- 写请求B更新数据库
- 写请求B更新缓存
- 写请求A更新缓存
同时,多写场景下,没必要多次更新缓存。
高并发写场景下可能会有问题,但应该不常见(极端情况)
- 写请求A更新数据库
- 写请求A删除缓存
- 读请求B读缓存,但是没读到
- 读请求B读数据库,读到了写请求A更新的值
- 写请求C更新数据库
- 写请求C删除缓存
- 读请求B将读到的数据写到缓存
导致问题
- 内存不均 节点间内存分配不均衡
- 阻塞请求 单value较大读写需要长时间处理
- 阻塞网络 单value较大会占用网络带宽
解决
- 拆分
- 压缩
解决
- 多级缓存
- 备份热key 读写分离
对不存在的数据进行频繁请求
- 过滤请求 布隆过滤器
- 缓存空数据
热key失效
- 热key不设置过期时间
- 对热key做冗余,横向扩展
- 使用多级缓存,纵向扩展
- 访问数据库中的热key时,使用分布式锁
数据没有加载到缓存中或者缓存大面积失效或缓存服务器宕机
- 合理设置缓存时间 固定时间+随机时间
- 缓存预热
- 部署多台缓存服务器