三种经典的缓存模式
- Cache-Aside Pattern(旁路缓存模式)
- Read-Through/Write-through(读写穿透:和1类似)
- Write-behind (异步批量从缓存写数据库)
旁路缓存模式
读流程
- 读的时候,先读缓存,缓存命中的话,直接返回数据
- 缓存没有命中的话,就去读数据库,从数据库取出数据,放入缓存后,同时返回响应。
写流程
- 更新的时候,先更新数据库,然后再删除缓存。
更新缓存?删除缓存?
- 如果你写入的缓存值,是经过复杂计算才得到的话。更新缓存频率高的话,就浪费性能啦。
双写时,先操作数据库
防止有请求从数据读入脏数据到缓存,造成数据不一致
如何保证一致性
延时双删
- 先删除缓存
- 再更新数据库
- 休眠一会(比如1秒),再次删除缓存。
这个休眠时间 = 读业务逻辑数据的耗时 + 几百毫秒。为了确保读请求结束,写请求可以删除读请求可能带来的缓存脏数据。
删除失败重试机制
- 写请求更新数据库
- 缓存因为某些原因,删除失败
- 把删除失败的key放到消息队列
- 消费消息队列的消息,获取要删除的key
- 重试删除缓存操作