缓存读写的3种模式

缓存读写的3种模式

起男 402 2024-08-12

缓存读写的3种模式

客户端(业务代码)跟存储组件、数据库交互的一套模式/机制

Cache Aside 旁路缓存

这种模式是在我们使用分布式缓存时最常用的策略,这个策略数据以数据库为准,缓存种的数据是按需加载的。它分为读策略和写策略

读策略

  1. 从缓存种读取数据
  2. 如果缓存命中,则直接返回数据
  3. 如果缓存没命中,则从数据库种查询数据
  4. 查询到数据后,将数据写入到缓存中,并返回

写策略

  1. 更新数据库中的记录
  2. 删除缓存记录

缺点:当写入特别频繁时,缓存的数据会被频繁的清理,影响缓存命中率

特点:业务端处理所有数据访问的细节,同时也利用的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 写回模式

该策略在更新数据时,只更新缓存,同时将缓存数据设置为脏的,然后立即返回,并不会更新数据库,对于数据库的更新,会通过批量异步更新(触发事件或周期更新)的方式进行

特点

  • 这种模式适合写入多的场景,只需要更新缓存,效率非常高

缺点

  • 断电后会造成数据的丢失
  • 会有数据不一致的情况