设为首页 - 加入收藏 武汉站长网 (http://www.027zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 2018 区块 365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版 学习
当前位置: 首页 > 站长学院 > MySql教程 > 正文

「系统架构」缓存与365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版一致性方案介绍

发布时间:2018-10-26 03:44 所属栏目:[MySql教程] 来源:佚名
导读:9月15日技术沙龙 | 与东华软件、AWS、京东金融、饿了么四位大咖探讨精准运维! 在很多系统中重要365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版通常都是写入关系365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库如mysql中,为了实现读写分离,提高系统负载能力,缩短响应时间通常还需要用到缓存。 缓存带来了系统性能的提升同时也把365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版一致性
9月15日技术沙龙 | 与东华软件、AWS、京东金融、饿了么四位大咖探讨精准运维!

在很多系统中重要365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版通常都是写入关系365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库如mysql中,为了实现读写分离,提高系统负载能力,缩短响应时间通常还需要用到缓存。

缓存带来了系统性能的提升同时也把365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版一致性问题摆在了开发者面前,在365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库使用读写分离和主从同步的情况下这种一致性问题会变得更加复杂。本文将介绍几种提升一致性的方案供大家参考。

背景介绍

一般使用缓存(本文中的缓存不特指某一种分布式缓存或本地缓存)的方式为在读365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版时首先读取缓存,如果缓存没有则读365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库然后将365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版写入缓存最后返回;写365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版时首先清除缓存内的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版,然后写365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库。

「系统架构」缓存与365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版一致性方案介绍

这种方式在365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库配置了主从库时会遇到365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版不一致的问题,首先来看一下这种实现的具体流程如下图:

「系统架构」缓存与365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版一致性方案介绍

图1 主从365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版不一致

在读365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版时如果缓存中没有365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版则读取从库的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版,然后写入缓存中并返回;在写365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版时先清除缓存中的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版,然后将365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版写入主库,主库365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版会被同步到从库。

这种实现方式的主要问题在于当365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版写入主库后,缓存没有365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版,这时读请求会读取从库的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版。此时如果发生主从延迟,主库的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版还没有写到从库,则应用服务器会将从库读到的脏365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版写入缓存服务器中,如果写入的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版没有加有效期或有效期很长就会造成365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版不一致,如果主从延迟时间较长可能会导致大面积的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版不一致。下面将介绍几种解决365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版一致性问题的方案。

加有效期

给缓存中的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版增加有效期是解决一致性问题最简单的确保365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版最终一致性的方法,这种方法在缓存中没有365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版需要查询365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库时将查询结果放入缓存的时候设置一个有效期(更新365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版时仍然先清除缓存365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版),非常适用于更新频率较低的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版,例如商品信息。

但是单纯给365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版加上有效期也存在一些明显的问题,如果有效期较长就会出现上面提到的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版不一致的问题,如果有效期较短就会出现缓存效率不高经常读库的情况。在使用这种方法的时候就需要我们根据365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版的更新频率确定合适的有效期时间,当冷热365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版并存时这种方案就显得难以兼顾。那么什么策略既能确保365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版的最终一致性又能充分利用缓存呢?这就要提到业内使用最多的双淘汰了。

双淘汰

双淘汰与本文第一个方案相比在读取365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版时是相同的,区别在于更新365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版的流程。在更新365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版时仍然首先清除缓存的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版,然后将365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版写入到365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库中,然后将365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版记录在一个延迟队列或哈希表中,同时另一个线程不断读取延迟队列或者哈希表,根据365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版存入的时间也预先设定的延迟时间再次清除缓存了的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版。

可以看出预先设定的延迟时间应该大于365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库主从同步较慢情况下的同步时间,这样就能确保在主从延迟的情况下缓存中的脏365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版也能被清除保证了365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版一致性。流程如下图,C语言中可以使用哈希表实现。

虽然双淘汰保证了365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版的最终一致性并提高了缓存的使用率,但在两次“淘汰”之间读取的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版仍然有可能是脏365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版,这种情况会在主从延迟较长的情况下尤为明显。对于某些对实时一致性要求较高的系统如何获得更好的读一致性呢,这里需要提到双淘汰的另一种变型。

「系统架构」缓存与365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版一致性方案介绍

图2 双淘汰

另一种双淘汰

为了提高读到365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版的准确性这种方法在更新365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版时首先清除缓存365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版并在缓存中存入这个365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版对应的标记,在写入365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库成功后再将365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版写入到一个延迟队列或哈希表中。在读取365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版时从缓存读取365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版,如果存在直接返回,如果不存在则读取365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版对应的标记,如果标记存在则读主库否则读从库,最后将365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版写入缓存中。

同时另一个线程不断读取延迟队列或者哈希表,根据365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版存入的时间也预先设定的延迟时间再次清除缓存了的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版。整个读写过程如下图。可以看出这种方法通过在缓存增加一个标记将部分读请求分流到了主库,这个标记可以是365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版的主键或其他唯一标识,通过牺牲一部分主库的性能提高了读请求的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版一致性。

「系统架构」缓存与365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库的365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版一致性方案介绍

图3 双淘汰2

目前为止没有哪一种缓存策略是万能的,基本上我们仍需要根据具体的业务场景和365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版类型选择合适的缓存策略。365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版量越大365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版情况也复杂通常就需要越复杂的缓存策略,希望本文介绍的几个方案对读者今后的开发有所帮助。

【编辑推荐】

  1. 针对静默365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版错误,如何采用DIX和DIF保证365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版一致性?
  2. 深度挖掘 Web 缓存体系
  3. 缓存这匹“野马”,你驾驭得了吗?
  4. 如何保护基础架构免受DNS缓存中毒攻击
  5. 浅谈三大主流365棋牌官方网版_www.365棋牌游戏下载_365棋牌2018新版库 哪一款你更喜爱
【责任编辑:武晓燕 TEL:(010)68476606】
点赞 0

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论