1. MySQL持久化数据,Redis只读数据

redis在启动之后,从数据库加载数据。

读请求:

不要求强一致性的读请求,走redis,要求强一致性的直接从mysql读取

写请求:

数据首先都写到数据库,之后更新redis(先写redis再写mysql,如果写入失败事务回滚会造成redis中存在脏数据)

一般缓存是这样的:

#读的顺序是先读缓存,后读数据库

#写的顺序是先写数据库,然后写缓存

#每次更新了相关的数据,都要把该缓存清理掉

#为了避免极端条件下造成的缓存与数据库之间的数据不一致,缓存需要设置一个失效时间。时间到了,缓存自动被清理,达到缓存和数据库数据的“最终一致性”

2.MySQL和Redis处理不同的数据类型

MySQL处理实时性数据,例如金融数据、交易数据

Redis处理实时性要求不高的数据,例如网站最热贴排行榜,好友列表等

在并发不高的情况下,读操作优先读取redis,不存在的话就去访问MySQL,并把读到的数据写回Redis中;写操作的话,直接写MySQL,成功后再写入Redis(可以在MySQL端定义CRUD触发器,在触发CRUD操作后写数据到Redis,也可以在Redis端解析binlog,再做相应的操作)

在并发高的情况下,读操作和上面一样,写操作是异步写,写入Redis后直接返回,然后定期写入MySQL。

名词解释:crud是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。crud主要被用在描述软件系统中数据库或者持久层的基本操作功能。

几个例子:

1.当更新数据时,如更新某商品的库存,当前商品的库存是100,现在要更新为99,先更新数据库更改成99,然后删除缓存,发现删除缓存失败了,这意味着数据库存的是99,而缓存是100,这导致数据库和缓存不一致。

解决方法:

这种情况应该是先删除缓存,然后在更新数据库,如果删除缓存失败,那就不要更新数据库,如果说删除缓存成功,而更新数据库失败,那查询的时候只是从数据库里查了旧的数据而已,这样就能保持数据库与缓存的一致性。

2.在高并发的情况下,如果当删除完缓存的时候,这时去更新数据库,但还没有更新完,另外一个请求来查询数据,发现缓存里没有,就去数据库里查,还是以上面商品库存为例,如果数据库中产品的库存是100,那么查询到的库存是100,然后插入缓存,插入完缓存后,原来那个更新数据库的线程把数据库更新为了99,导致数据库与缓存不一致的情况

解决方法:

遇到这种情况,可以用队列的去解决这个问,创建几个队列,如20个,根据商品的ID去做hash值,然后对队列个数取摸,当有数据更新请求时,先把它丢到队列里去,当更新完后在从队列里去除,如果在更新的过程中,遇到以上场景,先去缓存里看下有没有数据,如果没有,可以先去队列里看是否有相同商品ID在做更新,如果有也把查询的请求发送到队列里去,然后同步等待缓存更新完成。

这里有一个优化点,如果发现队列里有一个查询请求了,那么就不要放新的查询操作进去了,用一个while(true)循环去查询缓存,循环个200MS左右,如果缓存里还没有则直接取数据库的旧数据,一般情况下是可以取到的。

在高并发下解决场景二要注意的问题:

(1)读请求时长阻塞

由于读请求进行了非常轻度的异步化,所以一定要注意读超时的问题,每个读请求必须在超时间内返回,该解决方案最大的风险在于可能数据更新很频繁,导致队列中挤压了大量的更新操作在里面,然后读请求会发生大量的超时,最后导致大量的请求直接走数据库,像遇到这种情况,一般要做好足够的压力测试,如果压力过大,需要根据实际情况添加机器。

(2)请求并发量过高

这里还是要做好压力测试,多模拟真实场景,并发量在最高的时候QPS(每秒查询次数)多少,扛不住就要多加机器,还有就是做好读写比例是多少

(3)多服务实例部署的请求路由

可能这个服务部署了多个实例,那么必须保证说,执行数据更新操作,以及执行缓存更新操作的请求,都通过nginx服务器路由到相同的服务实例上

(4)热点商品的路由问题,导致请求的倾斜

某些商品的读请求特别高,全部打到了相同的机器的相同丢列里了,可能造成某台服务器压力过大,因为只有在商品数据更新的时候才会清空缓存,然后才会导致读写并发,所以更新频率不是太高的话,这个问题的影响并不是很大,但是确实有可能某些服务器的负载会高一些。

本文转自https://blog.csdn.net/thousa_ho/article/details/78900563,感谢博主的辛勤付出。

redis持久化 mysql_Redis 如何保持和MySQL数据一致相关推荐

  1. redis 如何 mysql_Redis 如何保持和 MySQL 数据一致

    一.需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景, ...

  2. redis 备份导出rdb_Redis学习——Redis持久化之RDB备份方式保存数据

    从这一个介绍里面知道,redis比memcache作为缓存数据库强大的地方,一个是支持的数据类型比较多,另一个就是redis持久化功能. 下面就介绍Redis的持久化之RDB! 一:什么是redis的 ...

  3. 什么时候用redis什么时候用mysql_Redis和MySql数据同步以及Redis使用场景

    Redis和MySql的数据同步是我们开发中经常遇到的问题,怎么实现Redis和MySql之间的数据同步? 实际开发中我们经常采用如下方式实现Mysql和Redis数据同步: 当我们对MySQL数据库 ...

  4. redis缓存mysql_redis缓存mysql数据

    redis (Remote Dictionary Server)是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持存储的value类型相对更多,包括str ...

  5. Redis持久化数据之RDB和AOF

    文章目录 一.RDB(Redis DataBase) 概述 持久化过程 配置 优势和劣势 二.AOF(Append Of File) 概述 AOF持久化过程 AOF 配置 Rewrite 压缩 优势和 ...

  6. redis持久化到mysql的方案_纯干货|深度解析Redis持久化策略

    设为"星标",好文章不错过! 全是干货的技术号:本文已收录在github,欢迎 star/fork:https://github.com/Wasabi1234/Java-Inter ...

  7. redis与mysql数据同步_Redis与MySQL数据同步解决方案

    数据库同步到Redis 我们大多倾向于使用这种方式,也就是将数据库中的变化同步到Redis,这种更加可靠.Redis在这里只是做缓存. 方案1 做缓存,就要遵循缓存的语义规定: 读:读缓存redis, ...

  8. Redis 缓存和 MySQL 数据如何实现一致性?

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  9. Redis和mysql数据怎么保持数据一致的?

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

最新文章

  1. 为什么企业选择年底裁员?如何选择一个正确的公司!
  2. js中字符串转json
  3. html怎么让文本自动换行不,【HTML】让pre标签文本自动换行
  4. 干货 | 126 篇 AI 原创文章精选(ML、DL、资源、教程)
  5. boost::regex模块实现config_info 来打印正则表达式库配置信息的测试程序
  6. vite2.1 最新alias别名设置方式
  7. activemq 安全连接
  8. android真实项目教程(五)——有时三点两点雨_by_CJJ
  9. WOW、ScrollReveal:WOW.js和ScrollReveal.js基础学习
  10. 树莓派安装TPLINK_WN725n v2网卡驱动
  11. java基础总结08-集合
  12. 如何委婉地拒绝公司的offer?
  13. 多目标启发式算法(NSGA2, MOEA, MOPSO)python实现
  14. ps文件怎么导出html文件,PS存储到网页格式的最佳方式
  15. 【Python】断言(assert)
  16. Error:Excepted resource of type id
  17. 杭电计算机学院研究生校区,杭州电子科技大学研究生在哪个校区
  18. PHP8与PHP7计算性能对比
  19. Android整合网上资源以及个人对GreenDao数据库框架的理解与使用(android-studio开发)
  20. DOS子程序汇编样例及详解

热门文章

  1. datagridvie设置行高列宽_DataGridView使用技巧(七、设定列宽和行高自动调整)----.NET...
  2. 为什么越来越多硕博人消失在朋友圈?
  3. 香港中文大学Center for Gut Microbiota Research招聘启事
  4. HUMAnN2:人类微生物组统一代谢网络分析2
  5. R语言使用ggplot2包的快速可视化函数qplot绘制散点图(设置每个数据点的文本标签信息)实战
  6. R语言常用sys函数汇总:sys.chmod、Sys.Date、Sys.time、Sys.getenv、Sys.getlocale、sys.getpid、sys.glob、sys.info等
  7. pandas使用apply函数基于条件(if condition)生成新的数据列
  8. R语言四格表、列联表秩和检验
  9. python读写二进制文件(读写字节数据)
  10. Cross-Validation交叉验证是什么?详解及实施