缓存用于缓解后端db的压力,策略指的是更新缓存以及db的方式。

主要可以分为两个大类:

调用方主动更新缓存以及db:

这种是最最常见也是最最容易想到的方式。即调用端需要同时维护db和缓存的调用,调用端逻辑比较复杂。

读取:先读缓存,缓存未命中读取db然后回写缓存;

写入:同时写入,有很多种。分类标准:db和缓存的先后;缓存失效还是更新。

其实,对写入而言,不论使用什么方式,都会有一些问题存在,因为无法保证db和缓存的更新是原子性的

但是通常,使用先更新db再让缓存失效可以最大程度得降低问题出现的概率。

为什么?

首先看第二个维度,是失效还是更新?

如果用更新会有什么问题?

两个并发的更新操作会出现写入覆盖的问题,其实与mysql的事务比较相似。

如果不用锁加同步,这个问题无法避免。

如下:

update1:      db                          cache

update2:              db   cache

类似上面这种并发更新,不论是先缓存还是先db,总会有db与缓存数据不一致的情况。

所以应该使用失效而非更新,只不过失效会增加一次miss而已,并无大碍。

那么是先让缓存失效还是先更新db?

应该先更新db,因为假如先失效缓存,如下序列:

update:  delete cache                                                       update db

select:                                  select db,  set cache

这样,读操作就会把一个之前的脏值放入缓存中,导致缓存db不一致。

如果先更新db:

update:                                                 update db    delete cache

select:cache miss         select db                                                              set cache

这种情况也会导致缓存不一致,但是这种情况的条件要苛刻一些,因为update db和delete cache必须发生在select db 和 set cache之间才行。而update db执行一般比select db久,那么select db先发生,但是update db和delete cache已经结束时select db还没有结束导致无法set cache的概率就比较低。

当然,无论如何还是有脏数据的可能。

所以,为缓存设置一个超时时间是必须的,这样可以防止脏数据一直存在而无法被更新。

调用方只更新其中一个:

这种方式将会大大降低调用方的复杂度,读取和上面的没有区别,只是写入有区别,调用方仅仅需要更新一处,即可。

更新缓存:写入操作只更新缓存,然后由缓存更新到db。

更新db:写入操作只更新db,然后监听db的变更,比如说mysql的binlog,监听以后再更新缓存。

参考:https://juejin.im/post/5af5b2c36fb9a07ac65318bd

下面记录下监听mysql的binlog来更新或者删除缓存的考虑:

缺点:相比较于直接更新缓存,监听binlog从设计上来说更加复杂,另外可能会有延迟;

优点:解放业务代码,我业务代码涉及到更新的地方只需要改db即可,缓存更新不需要考虑。当然有人会说,你这样只是不在业务代码里写了而已,但是更新缓存的逻辑你还是需要在监听binlog的代码里写啊,该写的代码还是没少啊。对,是没少,但是,区别在于,你思考或者写一个更新逻辑时,完完全全可以把更新缓存与db分开,这是很重要的。否则,你需要一直考虑,我的db写入成功没?我写缓存是异步还是同步?等等这样的问题。而监听binlog的方式就不需要这样想,我只管写db就行,能监听到binlog就说明一定写入成功。这其实是一种解耦。

另外还有一个优点就是,如果要做数据迁移,不用binlog的方式可能需要同时迁移缓存数据,但是有了binlog,只迁移db数据就行。

再比如删除脏数据等。

总之,监听binlog方式最大的优点就是解耦,只关注db即可,缓存自动跟着db更新。

【缓存】缓存更新策略相关推荐

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

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

  2. 缓存系列文章--3.缓存常用更新策略对比(一致性)。

    2019独角兽企业重金招聘Python工程师标准>>> http://carlosfu.iteye.com/blog/2245723 转载于:https://my.oschina.n ...

  3. 缓存服务的更新策略有哪些?

    原文 在互联网项目开发中,缓存的应用是非常普遍了,缓存可以帮助页面提高加载速度,减少服务器或数据源的负载. 1.为什么需要缓存? 一般在项目中,最消耗性能的地方就是后端服务的数据库了.而数据库的读写频 ...

  4. 【Redis】缓存更新策略

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

  5. Redis的缓存更新策略

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

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

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

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

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

  8. Hibernate缓存原理与策略 Hibernate缓存原理:

    Hibernate缓存原理: 对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等 ...

  9. session.merge 缓存不更新_如何保证缓存与数据库双写时的数据一致性?

    在做系统优化时,想到了将数据进行分级存储的思路.因为在系统中会存在一些数据,有些数据的实时性要求不高,比如一些配置信息.基本上配置了很久才会变一次.而有一些数据实时性要求非常高,比如订单和流水的数据. ...

  10. 两难!先更新数据库再删缓存?还是先删缓存再更新数据库?

    前言 当我们在做数据库与缓存数据同步时,究竟更新缓存,还是删除缓存,究竟是先操作数据库,还是先操作缓存?本文带大家深度分析数据库与缓存的双写问题,并且给出了所有方案的实现代码方便大家参考. 本篇文章主 ...

最新文章

  1. soundex mysql_MySQL SOUNDEX()用法及代码示例
  2. MySQL—05—MySQL如何处理SQL语句;MySQL数据库存储引擎介绍;
  3. 数据类型_插入数据_选取数据_修改数据——删除行
  4. 一秒点击屏幕次数_手机屏幕刷新率那点事儿!
  5. Apache PDFBox命令行工具:无需Java编码
  6. 文件存储demo,直接存储内容到本地中。
  7. Titanium快速开发app
  8. .NET 下运用策略模式
  9. windows版redis报错:本地计算机上的Redis服务启动后停止
  10. 02-body标签中相关标签
  11. OpenGL编程指南(原书第8版)环境搭建
  12. 天涯明月刀如何修改登录服务器,天涯明月刀手游体验服和正式服怎么切换方法介绍...
  13. H5-表格的基本样式
  14. modelica语言学习心得
  15. 经典网页设计:25个精美的全屏背景网站设计作品
  16. 基于virtualbox 的虚拟路由器搭建
  17. 怎么删除微信的手机充值服务器,微信如何一键清空账单?全部删除的方法
  18. 经典的大学学习生活心得
  19. Ubuntu中Python无法显示图片
  20. JAVA8 BiConsumer 接口

热门文章

  1. blowfish java_blowfish加密算法
  2. python画立体地球_如何在Python中绘制3D地球?
  3. CSPNet: A New Backbone that can Enhance Learning Capability of CNN
  4. 王菲 单行道 今天忽然听
  5. matlab中class,[转载]Matlab中的类(Class)
  6. Opencv求轮廓的中心点坐标
  7. spring-ant-处理zip
  8. uni-app 点击生成海报
  9. android手机rom物理存储器,手机ROM/RAM的区别
  10. 零基础学CocosCreator·第八季-双人对战五子棋