专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

别再问了,数据库与缓存一致性问题今天全整齐活了

  Redis拥有高性能的数据读写功能,被我们广泛用在缓存场景,一是能提高业务系统的性能,二是为数据库抵挡了高并发的流量请求。
  把Redis作为缓存组件,需要防止出现以下的一些问题,否则可能会造成生产事故。
  Redis缓存满了怎么办?缓存穿透、缓存击穿、缓存雪崩如何解决?Redis数据过期了会被立马删除么?Redis突然变慢了如何做性能排查并解决?Redis与MySQL数据一致性问题怎么应对?
  今天跟大家一起深入探索缓存的工作机制和缓存一致性应对方案。
  在本文正式开始之前,我们需要先取得以下两点的共识:
  1)缓存必须要有过期时间;
  2)保证数据库跟缓存的最终一致性即可,不必追求强一致性。
  目录如下:
  1。什么是数据库与缓存一致性
  2。缓存的使用策略
  2。1CacheAside(旁路缓存)
  2。2ReadThrough(直读)
  2。3WriteThrough(同步直写)
  2。4WriteBehind
  3。旁路缓存下的一致性问题分析
  3。1先更新缓存,再更新数据库
  3。2先更新数据库,再更新缓存
  3。3先删缓存,再更新数据库
  3。4先更新数据库,再删缓存
  4。一致性解决方案有哪些
  4。1缓存延时双删
  4。2删除缓存重试机制
  4。3读取binlog异步删除
  总结
  一、什么是数据库与缓存一致性
  数据一致性指的是:
  缓存中存有数据,缓存的数据值数据库中的值;缓存中没有该数据,数据库中的值最新值。
  反推缓存与数据库不一致:
  缓存的数据值数据库中的值;缓存或者数据库存在旧的数据,导致线程读取到旧数据。
  为何会出现数据一致性问题呢?
  把Redis作为缓存的时候,当数据发生改变我们需要双写来保证缓存与数据库的数据一致。
  数据库跟缓存,毕竟是两套系统,如果要保证强一致性,势必要引入2PC或Paxos等分布式一致性协议,或者分布式锁等等,这个在实现上是有难度的,而且一定会对性能有影响。
  如果真的对数据的一致性要求这么高,那引入缓存是否真的有必要呢?
  二、缓存的使用策略
  在使用缓存时,通常有以下几种缓存使用策略用于提升系统性能:
  CacheAsidePattern(旁路缓存,业务系统常用)ReadThroughPatternWriteThroughPatternWriteBehindPattern
  1、CacheAside(旁路缓存)
  所谓旁路缓存,就是读取缓存、读取数据库和更新缓存的操作都在应用系统来完成,业务系统最常用的缓存策略。
  1)读取数据
  读取数据逻辑如下:
  当应用程序需要从数据库读取数据时,先检查缓存数据是否命中。如果缓存未命中,则查询数据库获取数据,同时将数据写到缓存中,以便后续读取相同数据会命中缓存,最后再把数据返回给调用者。如果缓存命中,直接返回。
  时序图如下:
  旁路缓存读时序图
  优点
  缓存中仅包含应用程序实际请求的数据,有助于保持缓存大小的成本效益。实现简单,并且能获得性能提升。
  实现的伪代码如下:
  StringcacheKey公众号:码哥字节;StringcacheValueredisCache。get(cacheKey);缓存命中if(cacheValue!null){returncacheValue;}else{缓存缺失,从数据库获取数据cacheValuegetDataFromDB();将数据写到缓存中redisCache。put(cacheValue)}
  缺点
  由于数据仅在缓存未命中后才加载到缓存中,因此初次调用的数据请求响应时间会增加一些开销,因为需要额外的缓存填充和数据库查询耗时。
  2)更新数据
  使用cacheaside模式写数据时,如下流程。
  旁路缓存写数据
  写数据到数据库将缓存中的数据失效或者更新缓存数据
  使用cacheaside时,最常见的写入策略是直接将数据写入数据库,但是缓存可能会与数据库不一致。
  我们应该给缓存设置一个过期时间,这个是保证最终一致性的解决方案。
  如果过期时间太短,应用程序会不断地从数据库中查询数据。同样,如果过期时间过长,并且更新时没有使缓存失效,缓存的数据很可能是脏数据。
  最常用的方式是删除缓存使缓存数据失效。
  为啥不是更新缓存呢?
  性能问题
  当缓存的更新成本很高,需要访问多张表联合计算,建议直接删除缓存,而不是更新缓存数据来保证一致性。
  安全问题
  在高并发场景下,可能会造成查询查到的数据是旧值,具体待会会分析。
  2、ReadThrough(直读)
  当缓存未命中,也是从数据库加载数据,同时写到缓存中并返回给应用系统。
  虽然readthrough和cacheaside非常相似,在cacheaside中应用系统负责从数据库获取数据和填充缓存。
  而ReadThrough将获取数据存储中的值的责任转移到了缓存提供者身上。
  ReadThrough
  ReadThrough实现了关注点分离原则。代码只与缓存交互,由缓存组件来管理自身与数据库之间的数据同步。
  3、WriteThrough(同步直写)
  与ReadThrough类似,发生写请求时,WriteThrough将写入责任转移到缓存系统,由缓存抽象层来完成缓存数据和数据库数据的更新,时序流程图如下:
  WriteThrough
  WriteThrough的主要好处是应用系统的不需要考虑故障处理和重试逻辑,交给缓存抽象层来管理实现。
  单独直接使用该策略是没啥意义的,因为该策略要先写缓存,再写数据库,对写入操作带来了额外延迟。
  当WriteThrough与ReadThrough配合使用,就能成分发挥ReadThrough的优势,同时还能保证数据一致性,不需要考虑如何将缓存设置失效。
  WriteThrough
  这个策略颠倒了CacheAside填充缓存的顺序,并不是在缓存未命中后延迟加载到缓存,而是在数据先写缓存,接着由缓存组件将数据写到数据库。
  优点
  缓存与数据库数据总是最新的;查询性能最佳,因为要查询的数据有可能已经被写到缓存中了。
  缺点
  不经常请求的数据也会写入缓存,从而导致缓存更大、成本更高。
  4、WriteBehind
  这个图一眼看去似乎与WriteThrough一样,其实不是的,区别在于最后一个箭头的箭头:它从实心变为线。
  这意味着缓存系统将异步更新数据库数据,应用系统只与缓存系统交互。
  应用程序不必等待数据库更新完成,从而提高应用程序性能,因为对数据库的更新是最慢的操作。
  WriteBehind
  这种策略下,缓存与数据库的一致性不强,对一致性高的系统不建议使用。
  三、旁路缓存下的一致性问题分析
  业务场景用的最多的就是CacheAside(旁路缓存)策略,在该策略下,客户端对数据的读取流程是先读取缓存,如果命中则返回;未命中,则从数据库读取并把数据写到缓存中,所以读操作不会导致缓存与数据库的不一致。
  重点是写操作,数据库和缓存都需要修改,而两者就会存在一个先后顺序,可能会导致数据不再一致。针对写,我们需要考虑两个问题:
  1)先更新缓存还是更新数据库?
  2)当数据发生变化时,选择修改缓存(update),还是删除缓存(delete)?
  将这两个问题排列组合,会出现四种方案:
  先更新缓存,再更新数据库;先更新数据库,再更新缓存;先删除缓存,再更新数据库;先更新数据库,再删除缓存。
  接下来的分析大家不必死记硬背,关键在于在推演的过程中大家只需要考虑以下两个场景会不会带来严重问题即可:
  其中第一个操作成功,第二个失败会导致什么问题?在高并发情况下会不会造成读取数据不一致?
  如果第一个失败了,第二个就不用执行了,直接在第一步返回50x等异常信息即可,不会出现不一致问题。
  只有第一个成功,第二个失败才让人头痛,想要保证它们的原子性,就涉及到分布式事务的范畴了。
  1、先更新缓存,再更新数据库
  先更新缓存再更新数据库
  如果先更新缓存成功,写数据库失败,就会导致缓存是最新数据,数据库是旧数据,那缓存就是脏数据了。
  之后,其他查询立马请求进来的时候就会获取这个数据,而这个数据数据库中却不存在。
  数据库都不存在的数据,缓存并返回客户端就毫无意义了。
  该方案直接Pass。
  2、先更新数据库,再更新缓存
  一切正常的情况如下:
  先写数据库,成功;再update缓存,成功。
  1)更新缓存失败
  这时候我们来推断下,假如这两个操作的原子性被破坏:第一步成功,第二步失败会导致什么问题?
  会导致数据库是最新数据,缓存是旧数据,出现一致性问题。
  该图我就不画了,与上一个图类似,对调下Redis和MySQL的位置即可。
  2)高并发场景
  谢霸歌经常996,腰酸脖子疼,bug越写越多,想去按摩推拿放提升下编程技巧。
  疫情影响,单子来之不易,高端会所的技师都争先恐后想接这一单,高并发啊兄弟们。
  在进店以后,前台会将顾客信息录入系统,执行setxx的服务技师待定的初始值表示目前无人接待保存到数据库和缓存中,之后再安排技师按摩服务。
  如下图所示:
  高并发先更新数据库,再更新缓存
  98号技师先下手为强,向系统发送set谢霸歌的服务技师98的指令写入数据库,这时候系统的网络出现波动,卡顿了,数据还没来得及写到缓存。接下来,520号技师也向系统发送set谢霸歌的服务技师520写到数据库中,并且也把这个数据写到缓存中了。这时候之前的98号技师的写缓存请求开始执行,顺利将数据set谢霸歌的服务技师98写到缓存中。
  最后发现,数据库的值set谢霸歌的服务技师520,而缓存的值set谢霸歌的服务技师98。
  520号技师在缓存中的最新数据被98号技师的旧数据覆盖了。
  所以,在高并发的场景中,多线程同时写数据再写缓存,就会出现缓存是旧值,数据库是最新值的不一致情况。
  该方案直接pass。
  如果第一步就失败,直接返回50x异常,并不会出现数据不一致。
  3、先删缓存,再更新数据库
  按照前面说的套路,假设第一个操作成功,第二个操作失败推断下会发生什么?高并发场景下又会发生什么?
  1)第二步写数据库失败
  假设现在有两个请求:写请求A,读请求B。
  写请求A第一步先删除缓存成功,写数据到数据库失败,就会导致该次写数据丢失,数据库保存的是旧值。
  接着另一个读请B求进来,发现缓存不存在,从数据库读取旧数据并写到缓存中。
  2)高并发下的问题
  先删缓存,再写数据库
  还是98号技师先下手为强,系统接收请求把缓存数据删除,当系统准备将set肖菜鸡的服务技师98写到数据库的时候发生卡顿,来不及写入。这时候,大堂经理向系统执行读请求,查下肖菜鸡有没有技师接待,方便安排技师服务,系统发现缓存中没数据,于是乎就从数据库读取到旧数据set肖菜鸡的服务技师待定,并写到缓存中。这时候,原先卡顿的98号技师写数据set肖菜鸡的服务技师98到数据库的操作完成。
  这样子会出现缓存的是旧数据,在缓存过期之前无法读取到最数据。肖菜鸡本就被98号技师接单了,但是大堂经理却以为没人接待。
  该方案pass,因为第一步成功,第二步失败,会造成数据库是旧数据,缓存中没数据继续从数据库读取旧值写入缓存,造成数据不一致,还会多一次cahche。
  不论是异常情况还是高并发场景,会导致数据不一致。miss。
  4、先更新数据库,再删缓存
  经过前面的三个方案,全都被pass了,分析下最后的方案到底行不行。
  按照套路,分别判断异常和高并发会造成什么问题。
  该策略可以知道,在写数据库阶段失败的话就直返返回客户端异常,不需要执行缓存操作了。
  所以第一步失败不会出现数据不一致的情况。
  1)删缓存失败
  重点在于第一步写最新数据到数据库成功,删除缓存失败怎么办?
  可以把这两个操作放在一个事务中,当缓存删除失败,那就把写数据库回滚。
  高并发场景下不合适,容易出现大事务,造成死锁问题。
  如果不回滚,那就出现数据库是新数据,缓存还是旧数据,数据不一致了,咋办?
  所以,我们要想办法让缓存删除成功,不然只能等到有效期失效那可不行。
  使用重试机制。
  比如重试三次,三次都失败则记录日志到数据库,使用分布式调度组件xxljob等实现后续的处理。
  在高并发的场景下,重试最好使用异步方式,比如发送消息到mq中间件,实现异步解耦。
  亦或是利用Canal框架订阅MySQLbinlog日志,监听对应的更新请求,执行删除对应缓存操作。
  2)高并发场景
  再来分析下高并发读写会有什么问题
  先写数据库后删缓存
  98号技师先下手为强,接下肖菜鸡的这笔生意,数据库执行set肖菜鸡的服务技师98;还是网络卡顿了下,没来得及执行删除缓存操作。主管Candy向系统执行读请求,查下肖菜鸡有没有技师接待,发现缓存中有数据肖菜鸡的服务技师待定,直接返回信息给客户端,主管以为没人接待。原先98号技师接单,由于卡顿没删除缓存的操作现在执行删除成功。
  读请求可能出现少量读取旧数据的情况,但是很快旧数据就会被删除,之后的请求都能获取最新数据,问题不大。
  还有一种比较极端的情况,缓存自动失效的时候又遇到了高并发读写的情况,假设这会有两个请求,一个线程A做查询操作,一个线程B做更新操作,那么会有如下情形产生:
  缓存忽然失效
  缓存的过期时间到期,缓存失效。线程A读请求读取缓存,没命中,则查询数据库得到一个旧的值(因为B会写新值,相对而言就是旧的值了),准备把数据写到缓存时发送网络问题卡顿了。线程B执行写操作,将新值写数据库。线程B执行删除缓存。线程A继续,从卡顿中醒来,把查询到的旧值写到入缓存。
  出了不一致的情况的概率微乎其微,发生上述情况的必要条件是:
  步骤(3)的写数据库操作要比步骤(2)读操作耗时短速度快,才可能使得步骤(4)先于步骤(5)。缓存刚好到达过期时限。
  通常MySQL单机的QPS大概5K左右,而TPS大概1k左右,(ps:Tomcat的QPS4K左右,TPS1k左右)。
  数据库读操作是远快于写操作的(正是因为如此,才做读写分离),所以步骤(3)要比步骤(2)更快这个情景很难出现,同时还要配合缓存刚好失效。
  所以,在用旁路缓存策略的时候,对于写操作推荐使用:先更新数据库,再删除缓存。
  四、一致性解决方案有哪些
  最后,针对CacheAside(旁路缓存)策略,写操作使用先更新数据库,再删除缓存的情况下,我们来分析下数据一致性解决方案都有哪些?
  1、缓存延时双删
  如果采用先删除缓存,再更新数据库如何避免出现脏数据?
  采用延时双删策略。
  先删除缓存。写数据库。休眠500毫秒,再删除缓存。
  这样子最多只会出现500毫秒的脏数据读取时间。关键是这个休眠时间怎么确定呢?
  延迟时间的目的就是确保读请求结束,写请求可以删除读请求造成的缓存脏数据。
  所以我们需要自行评估项目的读数据业务逻辑的耗时,在读耗时的基础上加几百毫秒作为延迟时间即可。
  2、删除缓存重试机制
  缓存删除失败怎么办?比如延迟双删的第二次删除失败,那岂不是无法删除脏数据。
  使用重试机制,保证删除缓存成功。
  比如重试三次,三次都失败则记录日志到数据库并发送警告让人工介入。
  在高并发的场景下,重试最好使用异步方式,比如发送消息到mq中间件,实现异步解耦。
  重试机制
  第(5)步如果删除失败且未达到重试最大次数则将消息重新入队,直到删除成功,否则就记录到数据库,人工介入。
  该方案有个缺点,就是对业务代码中造成侵入,于是就有了下一个方案,启动一个专门订阅数据库binlog的服务读取需要删除的数据进行缓存删除操作。
  3、读取binlog异步删除
  binlog异步删除
  更新数据库;数据库会把操作信息记录在binlog日志中;使用canal订阅binlog日志获取目标数据和key;缓存删除系统获取canal的数据,解析目标key,尝试删除缓存。如果删除失败则将消息发送到消息队列;缓存删除系统重新从消息队列获取数据,再次执行删除操作。
  总结
  缓存策略的最佳实践是CacheAsidePattern。分别分为读缓存最佳实践和写缓存最佳实践。
  读缓存最佳实践:先读缓存,命中则返回;未命中则查询数据库,再写到缓存中。
  写缓存最佳实践:
  先写数据库,再操作缓存;直接删除缓存,而不是修改,因为当缓存的更新成本很高,需要访问多张表联合计算,建议直接删除缓存,而不是更新,另外,删除缓存操作简单,副作用只是增加了一次chachemiss,建议大家使用该策略。
  在以上最佳实践下,为了尽可能保证缓存与数据库的一致性,我们可以采用延迟双删。
  防止删除失败,我们采用异步重试机制保证能正确删除,异步机制我们可以发送删除消息到mq消息中间件,或者利用canal订阅MySQLbinlog日志监听写请求删除对应缓存。
  那么,如果我非要保证绝对一致性怎么办,先给出结论:
  没有办法做到绝对的一致性,这是由CAP理论决定的,缓存系统适用的场景就是非强一致性的场景,所以它属于CAP中的AP。
  所以,我们得委曲求全,可以去做到BASE理论中说的最终一致性。
  其实一旦在方案中使用了缓存,那往往也就意味着我们放弃了数据的强一致性,但这也意味着我们的系统在性能上能够得到一些提升。
  所谓tradeoff正是如此。
  参考资料
  https:docs。aws。amazon。comwhitepaperslatestdatabasecachingstrategiesusingrediscachingpatterns。htmlhttps:codeahoy。com20170811cachingstrategiesandhowtochoosetherightonehttps:blog。cdemi。iodesignpatternscacheasidepatternhttps:hazelcast。comblogahitchhikersguidetocachingpatternshttps:developer。aliyun。comarticle712285
  作者丨码哥字节
  来源丨公众号:码哥字节(ID:MageByte)
  dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editordbaplus。cn
  更多精彩内容
  dbaplus社群最新一期直播【话题接力丨智能运维AIOps难落地呼声极高,如何破局?】将于今晚8点开播,dbaplus社群邀请到京东科技智能运维算法负责人张静、蚂蚁集团AIOps技术专家徐新龙在云上汇聚,希望通过汇集两位运维专家的研究成果和实践积累,给大家进一步明确智能运维发展的方向,提供可参考、可落地的智能运维实战经验。
  直播地址:http:zmz。cn5lIbo
  关于我们
  dbaplus社群是围绕Database、BigData、AIOps的企业级专业社群。资深大咖、技术干货,每天精品原创文章推送,每周线上技术分享,每月线下技术沙龙,每季度GdevopsDAMS行业大会。
  关注公众号【dbaplus社群】,获取更多原创技术文章和精选工具下载

教材插画整改刻不容缓,要秉持负责任的态度去修改教材是孩子们每天上课都会接触到的东西,一旦教材出现问题,它的危害是及其严重的。每个人的美感都是从生活中的一点一点事物培养出来的,然而教材中的图片对人物进行丑化,与传统审美有着很大的毒教材!郑渊洁公开喊话主编曹文轩请出示2700万收入的税单这段时间以来,想必大家都关注到了人教版数学教材的插图事件。因为书中的插画太过粗俗,甚至有些内容直接颠覆了成年人的三观。原来阳光帅气催人奋进的插图没有了,取而代之的是眯眯眼萎靡不振猥安倍晋三批评泽连斯基如果不是你一意孤行,俄乌战争本可以避免5月26日英国经济学人刊发了对安倍晋三的访谈,安倍晋三借此机会谈及俄乌问题,并提出了自己的观点。第一,安倍晋三认为,俄乌战争原本可以避免,如果乌克兰总统泽连斯基在2月20日之前能够节前最后一天哪些题材值得关注?每个端午节前的一两个交易日,股市都有跳水的举动。跳水是常态,只不过,要么是飞流直下不回头,要么类似今天,急杀后尾盘又拉了回来。理论上说,假期要用钱的,想砸的,今天的都砸了。之前,很就业不愁升学不慌核工业卫生学校毕业生很吃香视频加载中核工业卫生学校。红网时刻记者谭倩衡阳报道又到一年毕业季,马上要高考了,如果您觉得自己成绩不太理想,报读一所卫校是很不错的,社会上对医护行业的人才需求量非常大,所以近几年报孟玉楼陪嫁两张拔步床!类似现在的兰博基尼242拔步床国人最伟大的发明之一我们的床文化还不仅到此为止国人发明的最伟大的一种床叫拔步床,在架子床的基础上外面设浅廊,廊像一间房子吧,这是中国人发明的最伟大的床。拔步床的出现主要在乌克兰空军即将覆灭,超300架战机被俄军击落,泽连斯基求外援曾经号称战斗力世界第四的乌克兰空军,如今面临着彻底消失的巨大风险。据俄罗斯媒体报道,随着俄乌军事冲突的持续,乌克兰空军目前几乎没有可用的战斗机。根据俄罗斯国防部最新的战报,俄乌军事女子豪饮后一脚踏在餐桌上,指着男友对闺蜜抱怨他说我不淑女花开千朵,各表一枝!我们这颗蔚蓝色的星球之所以如此美丽,就是因为其生物的多样性,花草鱼虫,飞禽走兽,每一个物种都有它存在的意义。花开千多,各表一枝。每一朵花有不同的颜色形状味道,甚2019年,四川遂宁27岁女子用敌敌畏毒死7岁继子,还让外婆埋尸2019年2月7日,傍晚7点多,四川遂宁花莲派出所接到一个报警电话。喂,110吗?我们这里不见了一个小孩子。派出所立马安排一个从警十多年的老警察来负责调查这件事,他问报警人,孩子的08年原油147美元一桶,国内油价6块钱,现在130美元,油价要9块钱2008年还有养路费,每辆私家车每月固定200元养路费,大车更多,每个地区不一样,由公路运政部门进行征收,并上交省交通厅。2008年之后因汽车保有量暴增,养路费征收困难,改收汽柴油四川雅安地震已造成1人遇难8人受伤2022年6月1日17时00分,四川省雅安市芦山县附近(北纬30。37度,东经102。94度)发生6。1级左右地震,震源深度17千米。截至目前,接雅安当地报告,事故已造成1人死亡8
不约而同,中俄相继发出重磅警告!中亚东亚决不许域外势力作乱拜登最近就像你公司里最讨厌的那个领导,爱上了开会,天天开会,还拉着不同的国家,在不同的地区开会。美国东盟峰会美日印澳四方会谈美洲峰会,说的好听是促进地区繁荣发展,说的不好听就是拉帮晨起有这4个迹象,暗示肝已变烂?若一个不占,肝还不错俗话说得好养肝就是养命。肝脏是我们身体极为重要的器官,承载着代谢排毒等诸多功能。一旦肝脏出现疾病,将会严重影响我们的健康。与肝脏有关的疾病有慢性乙肝肝癌肝肿瘤等等。其实,当肝出现异国羽三冠收官!2022印尼大师赛决赛国羽四战三胜,男双遗憾落败北京时间6月12日印度尼西亚大师赛正式结束,国羽取得不错的成绩,混双郑思维和黄雅琼夺得冠军,陈雨菲夺得女单冠军,女双陈清晨和贾一凡轻松夺冠。郑思维黄雅琼20吉凯尔德尔吕首局比赛前半人民的力量真伟大唐山的行凶者都抓捕归案,其中有几个披着羊皮的狼将服装品牌直接躺着中枪,物以类聚人以群分,人渣的着装是那么的相同,也反应了吴亦凡的心里和唐山的心里都是一样的,那么的肮脏!龌蹉!狼就是八号当铺的赵梁吟影视畅聊季前阵子看了韩国电视剧德鲁纳酒店的剧情解说,唯一比较吸引我的是女主神秘的身世和飒爽英姿。后来看到下面有人评论为什么韩国能拍出这么精彩的电视而中国不能(大意)?我小朋友!你一南京大学土家族女孩走红,学历证书曝光,评论区里一片柠檬精现在是网络时代,我们通过网络社交平台就能得知很多事情,同时也让我们学到了很多知识,开拓了我们的视野,还增长了见识。我国地域辽阔,有56个民族,不同民族有自己的文化与地方语言,不同民2022厦门人才服务月活动启动获钟南山院士点赞导报讯(记者钱玲玲通讯员杨鸿杏)厦门重磅推出十大人才礼包,以高质量人才服务助推五洲四海的优秀人才在厦腾飞。昨日,2022厦门人才服务月暨鼓励留学人员来厦创业工作规定颁布20周年庆启警惕孕妇吃水果吃得不对,会引发不良后果一如何正确吃水果?特别是患有糖尿病的孕妇,应该吃哪些水果?艳红是个怀孕6个月的孕妇,特别喜欢吃水果。孕前血糖正常,妊娠期间血糖高。医生让艳红把水果停掉,后来血糖倒是恢复正常了。可是霍家为何没有跻身香港四大家族?深扒霍英东输给李嘉诚的三场商战在香港,没有哪一个富豪在发家后,像我一样如履薄冰地生存,就像是走钢丝险象环生。霍英东香港,城是李嘉诚的城,香港商界的江山却不是李嘉诚打下来的。严格来讲,香港算是白手起家的富豪,只有神回复女朋友一定要找手小的,手大的扇脸疼1。hr2。hr3。hr4hr5。hr6。hr7hr8hr9hr10hr11hr12hr13hr14hr15hr16hr17hr18hr19hr20hr21唐山烧烤店打人案中,那名拼命拉住自己女朋友的男人,他做得对吗6月10日,在河北唐山的某家烧烤店中发生了一起令人愤怒的事情已是凌晨,依旧有一大堆人在烧烤店中饮酒谈心,此时却有人打破了这欢快的氛围。一名男子径直走向门口的桌子面前,并把手伸向了一
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网