缓存读写的3种模式
客户端(业务代码)跟存储组件、数据库交互的一套模式/机制
Cache Aside 旁路缓存
这种模式是在我们使用分布式缓存时最常用的策略,这个策略数据以数据库为准,缓存种的数据是按需加载的。它分为读策略和写策略
读策略
- 从缓存种读取数据
- 如果缓存命中,则直接返回数据
- 如果缓存没命中,则从数据库种查询数据
- 查询到数据后,将数据写入到缓存中,并返回
写策略
- 更新数据库中的记录
- 删除缓存记录
缺点:当写入特别频繁时,缓存的数据会被频繁的清理,影响缓存命中率
特点:业务端处理所有数据访问的细节,同时也利用的lazy计算的思想,更新db后,直接删除cache并通过db更新,确保数据以db为基准,可以大幅降低cache和db的不一致概率
Read/Write Through 读写穿透
在这种模式下,业务应用只关注一个存储服务即可。业务方的读写cache和db的操作,都由存储服务代理(缓存)
核心在于用户只负责和缓存打交道,由缓存与数据库进行通信,写入或者读取数据
流程
-
存储服务收到读请求时,如果命中cache直接返回,否则从db加载,回写到cache后返回响应
-
存储服务收到写请求时,先查询要写入的数据在缓存中是否存在,如果已经存在,则更新缓存中的数据,并且由缓存组件同步更新到数据库中;如果缓存不存在,我们把这种情况叫做“write miss写失效”
写失效处理方案:
- write allocate按写分配:写入缓存对应的位置,由缓存组件同步到数据库中
- no write allocate不按写分配:不写入缓存,直接更新到数据库中。一般采用这种方式,因为这样会减少一次缓存写入
特点
- 存储服务封装了所有的数据处理细节(由缓存节点而非用户和数据库打交道),业务应用端代码只用关注业务逻辑本身,系统的隔离性更佳。另外,进行写操作时,效率更高
MemCached和Redis都没有提供写入数据库的功能
Write Back 写回模式
该策略在更新数据时,只更新缓存,同时将缓存数据设置为脏的,然后立即返回,并不会更新数据库,对于数据库的更新,会通过批量异步更新(触发事件或周期更新)的方式进行
特点
- 这种模式适合写入多的场景,只需要更新缓存,效率非常高
缺点
- 断电后会造成数据的丢失
- 会有数据不一致的情况