原文

在互联网项目开发中,缓存的应用是非常普遍了,缓存可以帮助页面提高加载速度,减少服务器或数据源的负载。

1、为什么需要缓存?

一般在项目中,最消耗性能的地方就是后端服务的数据库了。而数据库的读写频率常常都是不均匀分布的,大多情况是读多写少,并且读操作(select)还会有一些复杂的判断条件,比如 like、group、join 等等,这些语法是非常消耗性能的,所有会出现很多的慢查询,因此数据库很容易在读操作的环节遇到瓶颈。

那么通过在数据库前面,前置一个缓存服务,就可以有效的吸收不均匀的请求,抵挡流量波峰。

另外,如果应用与数据源不在同一个服务器的情况下,中间还会有很多的网络消耗,也会对应用的响应速度有很大影响,如果当前应用对数据实时性的要求不那么强的话,在应用侧加上缓存就能很快速的提升效率。

2、那使用缓存会遇到哪些问题呢?

虽然缓存可以提高整体性能,但是它也可能会带来别的问题。例如使用缓存之后,就相当于把数据存放了2份,一份是在数据库中,另一份存放在缓存中。当有新的数据要写入或者旧数据需要更新的时候,如果我们只更新了其中一份数据源,那两边的数据就不一致了,所以这里就存在一个缓存数据与数据库数据如何进行有效且快速的同步问题,才可以保证数据的最终一致性。

另外,加上缓存服务其实也引入了系统架构的复杂度,因为还需要额外的关注缓存自身带来的下列问题:

  1. 缓存的过期时间问题:
    设计缓存的过期时间需要非常的有技巧,且必须与业务实际情况相结合。因为如果设计的过期时间太短了,那会导致缓存效果不佳,且还会造成频繁的从数据库中往缓存里写数据。如果缓存设计的过期时间太长了,又会导致内存的浪费。

  2. 缓存的命中率问题:
    这也是设计缓存中需要存放哪些数据的很重要一点,如果设计的不好,可能会导致缓存命中率过低,失去缓存效果。一般对于热点数据而言,要保证命中率达到70%以上效果最佳。

  3. 缓存的穿透/雪崩问题:
    是指如果缓存服务一旦宕机或全部丢失,那么有可能一瞬间所有的流量都直接打到了后端数据库上,可能会造成连锁反应,瞬间的请求高峰极有可能导致数据库无法承载。

3、缓存的更新策略具体有哪些?

典型的缓存模式,一般有如下几种:

  • Cache Aside

  • Read/Write Through

  • Write Behind

每种模式都有不同的特点,适应与不同的项目场景,下面来依次看看:

  1. Cache Aside 模式

这是大家经常用到的一种策略模式。这种模式主要流程如下:

  • 应用在查询数据的时候,先从缓存Cache中读取数据,如果缓存中没有,则再从数据库中读取数据,得到数据库的数据之后,将这个数据也放到缓存Cache中。

  • 如果应用要更新某个数据,也是先去更新数据库中的数据,更新完成之后,则通过指令让缓存Cache中的数据失效。

这里为什么不让更新操作在写完数据库之后,紧接着去把缓存Cache中的数据也修改了呢?

主要是因为这样做的话,就有2个写操作的事件了,担心在并发的情况下会导致脏数据,举个例子:
假如同时有2个请求,请求A和请求B,并发的执行。请求A是要去读数据,请求B是要去更新数据。初始状态缓存中是没有数据的,当请求A读到数据之后,准备往回写的时候,此刻,请求B正好要更新数据,更新完了数据库之后,又去把缓存更新了,那请求A再往缓存中写的就是旧数据了,属于脏数据。

那么 Cache Aside 模式就没有脏数据问题了吗?不是的,在极端情况下也可能会产生脏数据,比如:

假如同时有2个请求,请求A和请求B,并发的执行。请求A是要去读数据,请求B是要去写数据。假如初始状态缓存中没有这个数据,那请求A发现缓存中没有数据,就会去数据库中读数据,读到了数据准备写回缓存中,就在这个时候,请求B是要去写数据的,请求B在写完数据库的数据之后,又去设置了缓存失效。这个时候,请求A由于在数据库中读到了之前的旧数据,开始往缓存中写数据了,此时写进入的就也是旧数据。那么最终就会导致,缓存中的数据与数据库的数据不一致,造成了脏数据。

不过这种概率比上面一种概率要小很多。所以整体而言  Cache Aside 模式 还是一种比较简单实用的方式。

Read/Write Through 模式

这个模式其实就是将 缓存服务 作为主要的存储,应用的所有读写请求都是直接与缓存服务打交道,而不管最后端的数据库了,数据库的数据由缓存服务来维护和更新。不过缓存中数据变更的时候是同步去更新数据库的,在应用的眼中只有缓存服务。

流程就相当简单了:

  • 应用要读数据和更新数据都直接访问缓存服务

  • 缓存服务同步的将数据更新到数据库

这个模式出现脏数据的概率就比较低,但是就强依赖缓存了,对缓存服务的稳定性有较大要求,另外,增加新缓存节点时还会有初始状态空数据问题。

  1. Write Behind 模式

这个模式就是 Read/Write Through 模式 的一个变种。区别就是 Read/Write Through 模式的缓存写数据库的时候是同步的,而 Write Behind 模式 的缓存操作数据库是异步的。

流程如下:

  • 应用要读数据和更新数据都直接访问缓存服务

  • 缓存服务异步的将数据更新到数据库(通过异步任务)

这个模式的特点就是速度很快,效率会非常高,但是数据的一致性比较差,还可能会有数据的丢失情况,实现逻辑也较为复杂。

以上就是目前三种主流的缓存更新策略,另外还有Refrsh-Ahead模式等由于使用的不是很常见就不详细介绍了。

缓存服务的更新策略有哪些?相关推荐

  1. 【Redis】缓存更新策略

    1. 缓存更新策略综述 内存淘汰 不用自己维护,利用 Redis 自己的内存淘汰机制 (内存不足时,触发策略,默认开启,可自己配置),其可在一定程度上保持数据一致性 超时剔除 给数据添加 TTL,到期 ...

  2. 云原生微服务架构实战精讲第八节 访问控制与更新策略

    第24讲:服务调用失败的处理策略与实践 在微服务架构的应用中,微服务之间一般有两种类型的交互方式,一种是使用消息中间件的异步消息模式,也就是第 14 课时中提到的事件驱动设计,微服务之间进行交互的是消 ...

  3. Redis的缓存更新策略

    文章目录 1.redis的缓存更新的三种策略 1.1 内存淘汰 1.2 超时剔除 1.3 主动更新 2. 缓存更新策略的最佳实践方案: 缓存的更新是redis为了节约内存而设计出来的东西,主要是因为内 ...

  4. 掌握分布式环境缓存更新策略,提高缓存与数据库双写一致性!

    概述 随着时代的发展,服务系统架构也已经由最初的单体架构转变为分布式.微服务架构模式. 从数据体量上来看,各系统存储的数据量越来越大,数据的查询性能越来越低. 此时,就需要我们不断的进行优化,最常用的 ...

  5. 缓存更新策略概览(Caching Strategies Overview)

    缓存是一种用于更快数据检索的数据存储技术.从某种意义上说,它比从其主存储(如数据库)获取数据更快.为了实现这一点,我们通常缓存频繁请求或计算的数据.现在,让我们仔细看看可能需要考虑的不同缓存策略.请记 ...

  6. 【Redis学习03】redis缓存及其更新策略

    文章目录 1. 什么是缓存 2. 添加redis缓存 2.1 缓存商铺信息 3. 缓存更新策略 3.1 缓存更新策略方法 3.2 主动更新策略 3.3 缓存更新策略总结 4. 对商铺查询的缓存添加超时 ...

  7. Redis:缓存一致性问题(缓存更新策略)

    Redis缓存的一致性 1. 缓存 1.1 缓存的作用: 1.2 缓存的成本: 2. 缓存模型 3. 缓存一致性问题 3.1 引入 3.2 解决 (1) 主动更新:先更新数据库,再手动删除缓存 (2) ...

  8. 【已解决】win10禁止更新-服务、组策略两步解决

    1. 服务 2. 组策略

  9. 系统架构设计:进程缓存和缓存服务,如何抉择?

    作者:翁智华 来源:https://www.cnblogs.com/wzh2010/p/13874206.html 概述 我们所说的缓存分为进程内部缓存(系统内部缓存)和 缓存服务(如redis/me ...

最新文章

  1. AngularJs--过滤器(filter)
  2. 34.TokenInterceptor防止表单重复提交
  3. 南开大学计算机机房,南京大学高性能计算中心揭秘(多图)
  4. css点击a标签显示下划线_好程序员HTML5培训教程-html和css基础知识
  5. 学习实例.文章管理.数据库操作类.DBUtil.java
  6. 如何让gridview中的checkbox根据数据库情况默认选中?
  7. 音视频技术开发周刊 | 215
  8. 最优化学习笔记(十六)——拟牛顿法(2)
  9. jfinal 任务调度与jsoup 爬虫
  10. 多选框勾选 和 后台数据处理
  11. C-Lodop使用及常见错误排查
  12. excel中vba操作文件
  13. 袁国宝:从“人口红利”到“人才红利”,我们的机会在哪?
  14. Tomcat日志切割工具 logrotate
  15. 【Jmeter操作步骤】
  16. 大数据平台架构设计案例
  17. 小白的Python 学习笔记(八)推导式详解
  18. 2022-2027年中国端羟基聚丁二烯行业发展监测及投资战略研究报告
  19. office移动端_微软的新版 Office 好用吗?真能取代手机里至少五个 APP?
  20. c++ 取整之ceil、floor、round、fix用法

热门文章

  1. js做的flash形式的幻灯图片
  2. 春晚晒出京东“奔富村”成绩单 京东年货节期间累计帮助300万农户户均增收近1700元...
  3. 字节跳动将推出汽车云业务,计划2025年追赶腾讯
  4. 华为P50系列即将登场:曝线下门店已开始准备样机、物料
  5. 特斯拉维权车主发声:方式会变,维权不会变,绝不妥协!
  6. 蔚来发布首款自动驾驶车型ET7 补贴前起售价44.8万元
  7. 妙啊,小米11保护壳先小米11一步上市了...
  8. iPhone 11全球供应紧张:何时补货未知
  9. 微软拿下美国国防部100亿美元云合同,亚马逊不干了...
  10. 这次是真香了!iPhone 11一个月卖出1200万部 苹果加大产量