文章目录

  • 前言
  • 一、Cache Aside Pattern (旁路缓存模式)
  • 二、Read/Write Through Pattern(读写穿透模式)
  • 三、Write Behind Pattern(异步缓存写入)
  • 总结

前言

平时在我们使用数据库的时候一般都会再额外使用缓存,使用缓存在高并发的时候会给我们数据库分担压力,如果压力全打在数据库上会导致我们项目崩溃掉。 但我们在使用缓存的时候 他都有几种联合读写策略呢?
下面为大家介绍几种常用的读写策略和原理


提示:以下是本篇文章正文内容,下面案例可供参考

一、Cache Aside Pattern (旁路缓存模式)

Cache Aside Pattern 是我们平时使用比较多的一个cache 读/写模式,比较适合读请求比较多的场景。
Cache Aside Pattern 中服务端需要同时维护 DB 和 cache,并且以 DB 的结果为准。

写:

  1. 先更新DB(数据库)
  2. 直接删除cache(缓存)

读:

  • 读cache有结果则返回

  • cache没有结果去查询DB(数据库)返回

  • 将结果重新放到cache里

    仅仅了解上面内容还是不够的。我们来了解下原理。

     1、如果我们先删除cache,后update DB 会出现什么现象? 这种操作可能造成DB(数据库)和cache(缓存)数据不一致。比如请求A先update 名为test的数据,请求B随后来读test数据请求A delete cache后还没来得及执行update DB ->请求B去cache拿数据没拿到,去数据库拿完后又刷入到cache里->请求A修改DB这样会导致数据不一致。2、那我们先update DB,后删除cache还会有问题吗?理论上说还是可能会出现数据不一致的问题,但是概率极低,因为我们写入缓存的速度比数据库写入速度快的很多。比如请求A来读数据test,请求B update 数据test,并且数据test不在cache中可能会产生不一致问题。请求A 读取DB -> 请求B update DB ->请求A将数据写入到 cache (高并发情况下 会出现此问题 请求A的结果不是最新的)
    

看到这里我们来分析一下Cache Aside Pattern 缺陷和解决办法:

 问题1: 首次请求数据一定不在cache解决办法:可以将热点数据提前刷入到cache。如 开服务器之前/开启活动之前将热点数据刷入到cache问题2:写数据比较频繁的话会导致cache中的数据频繁被删除,这样会导致缓存命中率。解决办法:1、DB和cache数据 一致性比较强的场景:update DB 时候同样更新cache,不过为了保证一致性 我们需要加分布式锁 来保证数据一致性。2、DB和cache数据 允许短暂不一致场景:update DB 时候同样更新cache,但是我们要给cache数据增加一个较短的过期时间,可以保证即使数据不一样但短时间内数据会被删除,影响比较小。

二、Read/Write Through Pattern(读写穿透模式)

Read/Write Through Pattern 中服务端把 cache 视为主要数据存储,从中读取数据并将数据写入其中。cache 服务负责将此数据读取和写入 DB,从而减轻了应用程序的职责。
这种缓存读写策略应该也发现了在平时在开发过程中非常少见。抛去性能方面的影响,大概率是因为我们经常使用的 Redis 并没有提供 cache 将数据写入DB的功能。

写:

  • 先查cache,如果不存在,则直接更新DB

  • cache存在的话,则先更新cache,然后cache服务自己更新DB (同步更新cache和DB)

读:

  • 从cache中读 读到直接返回。

  • 如cache读不到数据,则去DB读取后,刷入到cache

     Read/Write Through Pattern 实际在 Cache Aside Pattern 之上进行了封装。在 Cache Aside Pattern 下,发生读请求的时候,如果 cache 中不存在,是由client(客户端)自己负责把数据写入 cache,而 Read Through Pattern 则是 cache 服务自己来写入缓存的,对client是透明的。与Cache Aside Pattern 一样,Read Through Pattern 也有首次请求 cache 数据不存在的问题,对于热点数据可以提前放入缓存中。
    

三、Write Behind Pattern(异步缓存写入)

写:

  • 先查cache,如果不存在,则直接更新DB
  • cache存在的话,则先更新cache,然后异步批量更新DB

读:

  • 从cache中读 读到直接返回。

  • 如cache读不到数据,则去DB读取后,刷入到cache

     Write Behind Pattern 和 Read/Write Through Pattern 很相似,两者都是由 cache 服务来负责 cache 和 DB 的读写。但,两者又有很大的不同如: Read/Write Through Pattern是同步 update cache 和 DB。然而Write Behind Pattern 则只是更新cache 不直接同步DB,而是使用异步批量批量方式来更新DB。Write Behind Pattern 这种方式对数据一致性 存在很大的问题,如cache数据还没到一不更新DB的时候 cache服务崩溃掉了,此时数据就会出现不一致情况。这种策略在平时开发中比较少见,但不代表没有应用场景,如:消息队列中消息异步写入磁盘、MySQL 中 InnoDB buffer 机制都用到了这种策略。Write Behind Pattern 下 DB 的写性能非常高,适合一些数据经常发生变化又对数据一致性要求没那么高的场景,比如浏览量、点赞量等。
    

总结

以上就是要讲的内容,本文仅仅简单介绍了常用缓存读写策略,一般我们常用的就是Cache Aside Pattern (旁路缓存模式),那么我们在使用Redis时候 先删除缓存还是先删除DB就有所了解了。

常用缓存读写策略(cache读写策略)相关推荐

  1. 缓存读写策略 Cache Aside Pattern,开发必备

    我们在前面讲到了当我们业务面临大量写并发的时候,将数据库开发成分布式存储系统,然后又介绍了NoSql数据库与关系型数据库互相配合,以用来更好的服务与我们的业务发展.但随着并发的持续增加,存储数据量的增 ...

  2. 常用缓存淘汰策略FIFO、LFU、LRU

    常用缓存淘汰策略FIFO.LFU.LRU conowen 常用缓存策略 常用的缓存淘汰策略有以下 先进先出算法(FIFO) Least Frequently Used(LFU) 淘汰一定时期内被访问次 ...

  3. 三种缓存策略:Cache Aside 策略、Read/Write Through 策略、Write Back 策略

    作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. 今天跟大家聊聊,常见的缓存更新策略. Cache Aside(旁路缓存)策略: Rea ...

  4. 【转载】缓存策略-Cache aside旁路缓存

    文章目录 Cache aside Cache aside 踩坑 Read through Write through Write behind Cache asideCache aside 也就是旁路 ...

  5. AUTOSAR Fee Fls 换页策略与读写的分析与设计

    在正式说起FEE/FLS 换页策略和读写流程之前,我们先介绍了FLS 的一些基本概念 在MCU 中有一块非易失性存储器我们称之为Data Flash , 在AUTOSAR FEE/FLS 规范中,通过 ...

  6. Cache写策略 — write-through与 write-back

    Write-through 数据总是直接写入磁盘.意思是写操作根本不使用缓存.关闭写缓存,可释放缓存用于读操作.(缓存被读写操作共用) Write-back (or write-behind or W ...

  7. 计组之存储系统:8、Cache写策略(全写法、写回法、写分配法、非写分配法、多级Cache)

    8.Cache写策略 思维导图 存在的问题 Cache写策略 写回法 全写法 写分配法 非写分配法 多级Cache 思维导图 存在的问题 Cache写策略 写回法 先修改Cache中的数据,然后通过脏 ...

  8. FPGA常用总线IIC 与SPI选择策略

    1.1 FPGA常用总线IIC 与SPI选择策略 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA常用总线IIC 与SPI选择策略: 5)结束语. 1.1.2 本 ...

  9. sqlserver2008清除日志方法_MySQL常用工具、日志及读写分离

    MySQL常用工具.日志及读写分离 1.MySQL中常用工具 1.1 mysql 1.1.1连接选项 1.1.2 执行选项 1.2 mysqladmin 1.3 mysqlbinlog 1.4 mys ...

最新文章

  1. 逻辑回归模型(Logistic Regression, LR)基础
  2. gsoap写一个c++ webservice
  3. Hdu 3062. Party
  4. 大学使用python 编辑器_[雪峰磁针石博客]2018 最佳python编辑器和IDE
  5. Swift5.x使用纯代码创建NavigationTab控制器设置启动图Wb第1部分
  6. 机器真的已经战胜人类医生了吗?医学AI标题党文章中的三大陷阱
  7. 计算机安全可靠替代工程,基于安全可靠软硬件的党政军OA系统的整系统优化方法与研究-计算机技术专业论文.docx...
  8. 防腐投加器需要加盐吗_风冷却器的正确防腐措施应该怎么做?
  9. bzoj 1116: [POI2008]CLO(并查集)
  10. 什么是大数据?65页PPT+50分钟视频讲解,小白也能看懂
  11. 论文翻译:2021_语音增强模型压缩_Performance optimizations on deep noise suppression models...
  12. Python爬虫入门教程:豆瓣Top电影爬取
  13. 王家林Spark视频
  14. java图书管理系统这个怎么改呢
  15. C/C++程序员的编程修养
  16. 什么是运维?运维工程师主要是做什么?
  17. 网站后台主流架构设计参考(图文)
  18. gPTP时钟同步(时间同步)协议简介
  19. ECharts 仪表盘(gauge) 改环形跑道 使用方法分享
  20. 微型计算机主机怎样插摄像头,摄像头是插在主机前还是后怎么办? 爱问知识人...

热门文章

  1. 对比学习sass和stylus的常用功能
  2. 小程序实现文字两端对齐
  3. 如何编写功能测试报告?详细测试方案模板参考
  4. 树莓派4B使用VNC连接之大无语事件
  5. matlab 中@的用法
  6. 朗读者李晓云清华大学计算机,世界杰出女科学家奖得主张弥曼现身《朗读者》...
  7. 夫琅禾费单缝衍射matlab分析,夫琅禾费单缝衍射光强分布MATLAB分析毕业设计论文...
  8. 半监督目标检测(三)
  9. cglib之Enhancer
  10. SpringBoot+Schedule 定时任务的配置开关