缓存原理与设计之缓存的读写模式

  上篇缓存原理与设计之缓存基本思想及分类 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中提到了缓存的应用场景,这些场景的应用也是缓存的优势所在:

    1)减轻服务器压力

      客户端缓存、网络端缓存减轻应用服务器压力;服务端缓存减轻数据库服务器的压力。

    2)提升性能,Linux性能优化概述 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中介绍了考核系统性能的一些指标,比如:响应事件、延迟时间、吞吐量、并发用户数和资源利用率等。

      使用缓存可以缩短系统的响应时间、减少网络传输时间和应用延迟时间、提供系统的吞吐量、增加系统的并发用户数、提供资源利用率。

    3)提高用户体验,用户在使用产品过程中建立起来的一种纯主观的感受。缓存的使用可以提升系统的响应能力,大大提升了用户体验。

  与此同时增加缓存也意味着其他额外的开销也就是代价:

    1)额外的硬件支出

    2)高并发缓存失效

    3)缓存与数据库不同步

    4)缓存并发竞争

  问题存在了就要解决,而且解决问题的代价必然是可接收的,否则就不使用缓存了。如何解决呢?介绍解决可能使用的“工具”——缓存的读写模式。

  缓存的读写模式分三种:

  1、Cache Aside Pattern(常用)

    Cache Aside Pattern(旁路缓存),是最经典的缓存+数据库读写模式:读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。

          

    更新的时候,先更新数据库,然后再删除缓存。

          

    参考MyBatis功能点一:二级缓存cache - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中实现。

    为什么是删除缓存,而不是更新缓存呢?

    1)缓存的值是一个结构:hashlist,更新数据需要遍历,先遍历(耗时)后修改。

    2)懒加载,使用的时候才更新缓存。使用的时候才从DB中加载,也可以采用异步的方式填充缓存,比如开启一个线程定时将DB的数据刷到缓存中

  2、Read/Write Through Pattern

    应用程序只操作缓存,缓存操作数据库。

    1)Read-Through(穿透读模式/直读模式):应用程序读缓存,缓存没有,由缓存回源到数据库,并写入缓存。(guavacache

    2)Write-Through(穿透写模式/直写模式):应用程序写缓存,缓存写数据库。该种模式需要提供数据库的handler,开发较为复杂。

  3、Write Behind Caching Pattern

    应用程序只更新缓存。缓存通过异步的方式将数据批量或合并后更新到DB中。不能时时同步,甚至会丢数据。

 

  

posted on 2022-02-23 13:47  池塘里洗澡的鸭子  阅读(149)  评论(0编辑  收藏  举报