读写一致 && MySQL&&Redis

这篇具有很好参考价值的文章主要介绍了读写一致 && MySQL&&Redis。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

存储一致性&& CPU存储 && L1L2Cache等等 

不懂CPU如何读写内存还敢说自己是程序员? - 知乎 (zhihu.com)

 

 基础知识:

1. 什么是cache line :

cache line 位于 CPU 与内存之间,CPU想要获得数据的时候,先从CPU cache中获取。

若CPU cache中不存在,发生cache miss,那么,cache要从主存memory 中获取数据缓存到cache中并且返回给CPU。

由于局部性原理,CPU Cache每次不会只将需要的字节读取进来,而是会读走需要字节和该字节旁边的部分字节,这一组读取的大小就是 cache line 的大小=64Byte 

因此,可以说,CPU Cache 从 Memory 中取数据的最小单位就是64Byte,

                      而 Memory 从 磁盘中读取数据的最小单位是 4092Byte

2. CPU cache 分级 :L1 L2 L3 cache

L1 cache、L2 cache是每个CPU核独享,L3 cache是多个CPU核共享

L1 cache 分为 数据缓存 和 指令缓存

L2、L3 级别的cache 不区分 数据缓存或指令缓存

还有一种缓存是TLB,这个是专门用来存放页表,用于虚拟地址和真实地址映射的

3. CPU cache的性能优化:

当出现多核多线程对数据进行处理时,容易出现位于同一个cache line 上的2个不同变量 x 和 y被两个线程 A 和 B 所修改,而这个同时包含x 和 y 的 cache line 会被两个CPU核的cache 缓存,由于x 和 y被一个线程修改而导致 另一个线程上的 该行 cache line 失效,两个线程虽然在代码逻辑上修改的是不同的变量但是却会有着 一方修改x另一方的CPU cache中 y也失效,需要重新更新的情况。这种频繁更新的情况 called “伪共享”,若操作频繁会很消耗性能。

==》为了解决这个问题:使用填充技术,实现 cacheline 对齐

将例如先定义x变量占4Byte,那么填充60Byte无关字节,然后再定义y变量,这样x和y就不会存放在同一cacheline 中被获得。以此来避免伪共享。

数据一致性的含义:

它目的不是说==》两个线程并发读写,然后某个线程获得的数据是旧数据

而目的是==》过了一小段时间,缓存数据和数据库中的数据是不是一致的。或者说主从数据库中的数据是不是一致的。

==》为啥会不一致,我觉得主要原因就是过期策略导致的。若热点数据长时间不过期,里面一直放着旧数据,这不出问题了么

1. 缓存雪崩:缓存雪崩的关键在于在同一时间大规模的key失效。

出现原因:①Redis宕机 ② Redis中的大量数据采用同一过期时间

解决措施:①熔断机制,当请求流量达到阈值,就提示一会再进入,保证一部分用户可用,另一部分多刷新几次也能用

                  ②提高数据库容灾能力,读写分离,分库分表,提高数据库可靠性可用性

                  ③将Redis变成集群

2. 缓存击穿:热点数据过期,大量请求直接访问数据库

解决措施:①业务允许热点数据不设置过期时间

                  ②当热点数据过期时,使用互斥锁,降低同一时间访问数据库的请求数量

3. 缓存穿透:恶意攻击,访问不存在于数据库中的请求,那Redis中没缓存。自然要访问MySQL

解决措施:布隆过滤器

常见的缓存读写策略:旁路缓存、读写穿透、异步缓存

(一)旁路缓存:适合读请求多的情况

读:

数据先从cache里面读,如果有,读走;

如果没有,从MySQL中获取,写入Redis再返回。

写:

先更新DB,然后删除Redis中的缓存

(二)读写穿透:==》把Redis视作主要的数据存储空间,读和写都在对Redis

读:数据先从cache里面读,有就直接读走

如果没有,从MySQL中读取,写入缓存,然后再返回。

==》和旁路缓存的区别在于:旁路缓存是全由用户去做的,数据不存在就自己写代码从MySQL中读,load到Redis中;但是读写穿透则是:用户就直接和缓存交互,缓存和数据库的交互有缓存自己处理,不用用户操心。

写:

先查看该更新写数据在Cache中是否存在,若不存在直接写入数据库

若存在,那么,先更新Cache,而后Cache自己

(三)

延时双删:==》解决Redis和MySQL数据一致性

删除两次:写库前后都进行 Redis 的删除操作

实现逻辑:

在修改MySQL前删一次cache;

修改MySQL(数据库数据);

延迟等待一小段时间(避免此时的读操作 正在把 之前读到的旧数据写回到Cache的路上,等这个读操作把旧数据写回到cache,然后在删除,这样就避免了,我这边刚删完,写操作就带着旧数据写回到Cache中了,这不白删除了嘛);

再次删除cache中的数据

再读一读这些在总结整理:

ref:Redis和Mysql如何保证数据一致?面试可以这样说自己的看法 - 知乎 (zhihu.com)

缓存与数据库一致性问题深度剖析 (修订) (qq.com)

3种缓存读写策略都不了解?面试很难让你通过啊兄弟! (qq.com)文章来源地址https://www.toymoban.com/news/detail-671515.html

到了这里,关于读写一致 && MySQL&&Redis的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis可以代替MySQL作为数据库吗

    当使用Redis作为数据库时,以下是一些基本的代码示例 展示了如何使用Redis进行数据存储、读取和更新: 1.连接到Redis服务器: 2.存储和获取数据: 3.列表操作: 4.有序集合操作: 6.键过期和删除: Redis作为数据库时,下面是一些更复杂的代码示例,展示了如何使用Redis进行高

    2024年02月16日
    浏览(36)
  • Redis与数据库保持一致

    参考链接 先更新数据库,再更新redis 存在漏洞,如果更新Redis失败,仍然会导致不一致 先删Redis,再更新数据库并同步数据到Redis 存在漏洞,多线程情况下,线程1删除redis后,还是有可能被其他线程读取旧的数据库数据加载到redis当中 延迟双删, 在2的基础上,更新成功后延迟

    2024年02月11日
    浏览(44)
  • 126、高频Redis面试题:如何保证Redis和数据库数据一致性

    问题:如果数据库中的某条数据放入缓存后,又马上被更新了,那我们应该如何更新缓存 缺点: 如果先更新缓存成功,在更新数据库的时候失败,这时候会导致数据不一致;缓存的作用是不是临时将我们数据保存在内存,便于提高查询速度;但是如果某条数据在数据库中都

    2024年02月13日
    浏览(43)
  • Redis和数据库保持数据一致性方案

    Redis和数据库一致性又称为“双写一致性”,在分布式系统中,由于多个节点之间的并发读写操作,可能导致数据不一致的情况发生。本文将着重介绍如何通过使用Redis与数据库相结合的方案来实现数据一致性。 首先,读取数据时都是先查询Redis,命中则直接返回,未命中则先

    2024年02月11日
    浏览(88)
  • springboot+redis+mysql+quartz-通过Java操作redis的KEYS*命令获取缓存数据定时更新数据库

    代码讲解: 3-点赞功能-定时持久化到数据库(pipeline+lua)-完善过程2_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1w14y1o7BV 本文章代码: blogLike_schedule/like03 · xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com) https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOrDemo/tree/master/blogLike_schedule/like03 数据

    2024年02月15日
    浏览(52)
  • redis的缓存更新策略以及如何保证redis与数据库的数据一致性

    redis的缓存更新策略有这么几种: 1、由应用直接和redis以及数据库相连接:         查询数据时,应用去redis中查询,查不到的话再由应用去数据库中查询,并将查询结果放在redis;         更新数据时,由应用去触发redis数据的删除以及数据库的update。 2、应用只跟redi

    2024年02月13日
    浏览(57)
  • Redis如何保证缓存和数据库一致性?

    现在我们在面向增删改查开发时,数据库数据量大时或者对响应要求较快,我们就需要用到Redis来拿取数据。 Redis:是一种高性能的内存数据库,它将数据以键值对的形式存储在内存中,具有读写速度快、支持多种数据类型、原子性操作、丰富的特性等优势。 优势: 性能极高

    2024年01月16日
    浏览(70)
  • Redis---数据库和缓存如何保证一致性?

    用「读 + 写」请求的并发的场景来分析: 假如某个用户数据在缓存中不存在,请求 A 读取数据时从数据库中查询到年龄为 20,在未写入缓存中时另一个请求 B 更新数据。它更新数据库中的年龄为 21,并且清空缓存。这时请求 A 把从数据库中读到的年龄为 20 的数据写入到缓存

    2024年01月24日
    浏览(57)
  • 【4种方案】如何保证Redis与数据库的数据一致!

    先删除“缓存”再去更新“数据库”。 但是该方案还存在问题:         在高并发情况下, 第一个线程删除缓存 ,还没来得及去操作数据库,这时 第二个线程访问缓存 ,发现为 null ,于是去数据库查询,获取到需要的值,这时候 第一个线程 才开始操作数据库,然后设

    2024年02月14日
    浏览(37)
  • 怎样保证数据库和redis里的数据一致性

    使用缓存更新策略:在更新数据库时,同时更新Redis中相应的数据。这可以通过编写代码来实现,在数据库更新操作完成后,同步更新Redis中对应的数据。这可以通过在代码中使用事务来保证更新的原子性,确保数据库和Redis中的数据保持一致。 使用消息队列:可以将数据库更

    2024年02月19日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包