首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

高速缓存和主内存之间如何保持数据一致性

,每个CPU内核都有着自己的L1、L2级缓存,多个CPU内核共享L3级缓存和计算机的组主内存。...CPU在加载数据的时候,首先会尽可能的从 Cache 中取加载,并不是一开始就从主内存中取加载数据。当 Cache 中没有数据的时候,才会从内存中去加载数据。...这个策略存在一个很明显的问题,就是不管缓存命中与否,都要写入到主内存中。...所以写回这个策略不再需要每次都同步数据到主内存中,而只是写到 Cache中,只有当 Cache 中的数据要被替换(应该是由于缓存淘汰策略)的时候才同步到主内存中。...在数据同步方面就像我们在编程过程中使用redis作为mysql的缓存层,同样也是需要面临和计算机组成一样的问题。以及多核cpu换从同步和应用程序的缓存集群同步问题。

50630

缓存+redis+容器

缓存理论 1、 缓存适合的场景 缓存,就是将一些需要读取数据放在磁盘或者内存中,由于是追求速度,从而一般放在内存中。...在读取数据的时候,一般是从关系型数据库中读取数据,在数据库层面也可以进行各种优化,例如读性能不足,那么可以添加几个从库,从而数据库的一主多从;例如写性能不足,那么可以分库分表。...在有些场景中,要使用缓存,是因为无法解决读的速度,例如count(*)的操作,无论从数据库的层面如何优化,都不可能提高;还有一种就是sql的执行本身就必须消耗很多资源和时间,例如各种关联查询子查询,这些时候...redis主备 reids是一个键值存储的内存cache或者持久化存储,用redis做缓存是简单的。而redis再此时也无需持久化机制,从而直接在容器中使用。 ?...一个系统的构成,各种各样的方式,如何进行主备复制?sentinel如何来检测master是否宕机?sentinel为何要用3个或者5个节点? 子子孙孙无穷尽也。。。

74530
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    什么是缓存雪崩、击穿、穿透?

    当业务线程访问不到「主 key 」的缓存数据时,就直接返回「备 key 」的缓存数据,然后在更新缓存的时候,同时更新「主 key 」和「备 key 」的数据。 4....如果 Redis 缓存的主节点故障宕机,从节点可以切换成为主节点,继续提供缓存服务,避免了由于 Redis 故障宕机而导致的缓存雪崩问题。...缓存穿透的发生一般有这两种情况: 业务误操作,缓存中的数据和数据库中的数据都被误删除了,所以导致缓存和数据库中都没有数据; 黑客恶意攻击,故意大量访问某些读取不存在数据的业务; 应对缓存穿透的方案,常见的方案有三种...接下来,我介绍下。 布隆过滤器由「初始值都为 0 的位图数组」和「 N 个哈希函数」两部分组成。...而缓存穿透主要原因是数据既不在缓存也不在数据库中。因此,缓存穿透与缓存雪崩、击穿应对的方案不太一样。 我这里整理了表格,你可以从下面这张表格很好的知道缓存雪崩、击穿和穿透的区别以及应对方案。

    46620

    再也不怕,缓存雪崩、击穿、穿透!

    当业务线程访问不到「主 key 」的缓存数据时,就直接返回「备 key 」的缓存数据,然后在更新缓存的时候,同时更新「主 key 」和「备 key 」的数据。 4....如果 Redis 缓存的主节点故障宕机,从节点可以切换成为主节点,继续提供缓存服务,避免了由于 Redis 故障宕机而导致的缓存雪崩问题。...缓存穿透的发生一般有这两种情况: 业务误操作,缓存中的数据和数据库中的数据都被误删除了,所以导致缓存和数据库中都没有数据; 黑客恶意攻击,故意大量访问某些读取不存在数据的业务; 应对缓存穿透的方案,常见的方案有三种...接下来,我介绍下。 布隆过滤器由「初始值都为 0 的位图数组」和「 N 个哈希函数」两部分组成。...而缓存穿透主要原因是数据既不在缓存也不在数据库中。因此,缓存穿透与缓存雪崩、击穿应对的方案不太一样。 我这里整理了表格,你可以从下面这张表格很好的知道缓存雪崩、击穿和穿透的区别以及应对方案。 ?

    49840

    深入理解JMM-CPU多核硬件架构剖析及Java内存模型

    前言 上一节了解synchronized 关键字的底层原理以及锁的升级过程,本节带着大家了解CPU多核硬件架构以及Java内存模型 CPU多核硬件架构剖析 CPU每次从主内存读取数据比较慢,CPU通常涉及多级缓存...,其它处理器的请求将被阻塞住,那么该处理器可以独占共享内存 总线锁定会将并行的程序,变为串行 缓存锁定 缓存锁定是某个CPU对缓存数据进行更改时,会通知缓存了该数据的该数据的CPU抛弃缓存的数据或者从内存重新读取...缓存一致性协议会锁缓存行,其性能要比锁总线要高得多 MESI协议 M 修改 (Modified) 这行数据有效,数据被修改了,和主内存中的数据不一致,数据只存在于本Cache中。...JMM内存模型 主内存 存放我们共享变量的数据 工作内存 每个CPU对共享变量(主内存)的副本 JMM八大同步规范 read(读取):从主内存读取数据 load(载入):将主内存读取到的数据写入工作内存中...use(使用):从工作内存读取数据来计算 assign(赋值):将计算好的值重新赋值到工作内存中 store(存储):将工作内存数据写入主内存 write(写入):将store过去的变量值赋值给主内存中的变量

    65270

    MESI协议,JMM,线程常见方法等

    我们可以从下图看出在CPU和主内存之间加了一个缓存,用来提升交互速度。 ?...解决方式一——总线加锁(性能太低) CPU从主内存读取数据到缓存区,并在总线对这个数据进行加锁,其他CPU无法去读写这个数据,直到这个CPU使用完数据,锁被释放了才访问。...read(读取):从主内存中读取数据 load(载入):将主内存读取到的数据写入工作内存 user(使用):从工作内存读取数据来计算 assign(赋值):将计算好的值重新赋值到工作内存中 store(...1.read读取:将主内存中的a=1读取出来。 2.load载入:将从主内存中a=1载入到线程A的工作内存中。 3.use使用:将线程A工作内存的a=1读取到,并进行自增操作。...线程B一直使用嗅探监控总线中自己感兴趣的变量a,一旦发现a值有修改,立刻将自己工作内存中a置为无效Invalid(利用MESI协议),并立刻从主内存中读取a值,这个时候总线中a还没有写入内存,所以有个短暂的

    70511

    kswapd0进程占用大量cpu

    swapoff -a && swapon -a 到这里再次查看top命令,发现杀不掉的kswapd0进程没了,CPU占用也下去了; 说下为什么吧 可能看到这里,有些朋友会云里雾里的(Tip:相信我,我不是故意忘记截图的...这些数据通常是从文件系统读取的文件块、执行的程序、网络数据等。Linux 的缓存机制有助于提高系统性能,因为它可以减少对慢速存储设备(如硬盘)的访问次数。...当应用程序读取文件时,内核会将文件的数据块缓存到内存中,以便下次访问同一数据时可以更快地获取。如果内存不足,内核会根据一定的置换策略(如LRU)来释放缓存中的页。...Swap 缓存​: Swap 缓存是指将内存中不常用的数据移动到交换空间(硬盘)中的一种机制。虽然不严格属于缓存,但它是 Linux 系统用来扩展虚拟内存的一种方式。...结言 Linux 的缓存机制是通过在内核中实现的,它们都可以自动管理,并且在系统运行时根据需要动态调整。这些缓存机制的存在可以显著提高系统的性能和响应速度,特别是在频繁读取相同数据的情况下。

    65410

    java内存模型JMM「建议收藏」

    ,同一时刻,可能存在多个操作, 内存:一个计算机包含一个主存,所有cpu都可以访问主存,主存通常远大于cpu中的缓存, 运作原理: 通常,当一个cpu需要读取主存时,他会将主存的内容读取到缓存中,将缓存中的内容读取到内部寄存器中...从更低的层次来说,主内存就是硬件的内存,是为了获取更好的运行速度,虚拟机及硬件系统会让工作内存优先存储于寄存器和高速缓存中,jmm中线程中的工作内存是硬件系统中cpu的寄存器和高速缓存的一个抽象描述,jvm..., 释放后的变量才可以被其他线程锁定unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来 , 释放后的变量才可以被其他线程锁定 read(读取) : 作用于主内存的变量 , 把一个变量值从主内存传输到线程的工作内存中...,以便随后的load动作使用read(读取) : 作用于主内存的变量 , 把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用 load(载入):作用域工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中...-同步规则 如果要把一个变量从主内存中复制到工作内存, 就需要按顺序地执 行read和load操作 , 如果把变量从工作内存中同步回主内存中, 就要按顺序地执行store和write操作.

    57610

    豁然开朗:这问题我不信你能分析的这么透彻!

    如果是CPU内存模型呢,计算机执行程序时,每条执行指令都是在CPU中执行的,并且在CPU执行指令的过程中就会涉及到数据的读写操作,CPU并不会直接从计算机的磁盘上读数据,而是从计算机的主存,也就是我们常说的内存中读取数据...3.将visitCount的值写回主内存。 “我们一步步讲,这样你也好理解些”,老王继续说,“我们先来看第1步:从主内存读取visitCount的值。...“在步骤1从主内存读取visitCount的值时,线程1和线程2都会把主内存中的visitCount值读取到自己的工作内存中,此时线程1和线程2自身工作内存中的visitCount值都是0,这点能理解吗...“此时,线程1和线程2都将读取到自己工作内存中的visitCount的值进行加1,此时线程1和线程2各自工作内存中的visitCount值都是1,这点能理解吗?”。 “能理解”。...“我们再次看看visitCount++操作在内存中的执行流程”。 1.从主内存读取visitCount的值。 2.将visitCount的值进行加1操作。 3.将visitCount的值写回主内存。

    16830

    Java程序员面试必备:Volatile全方位解析

    在多路处理器系统中,每个处理器都有自己的高速缓存,而它们共享同一主内存。「计算机抽象内存模型」如下: ? 程序执行时,把需要用到的数据,从主内存拷贝一份到高速缓存。...CPU处理器计算时,从它的高速缓存中读取,把计算完的数据写入高速缓存。 当程序运算结束,把高速缓存的数据刷新会主内存。...,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。...如何保证当前处理器的内部缓存、主内存和其他处理器的缓存数据在总线上保持一致的?...举个例子吧,假设i的初始值是0,执行以下语句: i = i+1; 首先,执行线程t1从主内存中读取到i=0,到工作内存。然后在工作内存中,赋值i+1,工作内存就得到i=1,最后把结果写回主内存。

    51530

    你可能不知道的mysql

    mysql5.7采用并行复制的策略减少主备延迟 因为主备同步会存在延迟,所以在开发的时候一定要注意读取从库的时候不一定是最新的值。...binlog之后会返回主库一个ack,主库只有收到这个ack之后才认为事务完成 如何进行主备切换????...如果位点相同可以认为已经同步 对比GTID集合确保主备无延迟: 如何判断一个数据库正常 1、使用select进行查询,查询一个创建在mysql库中的表;容易实现,但是因为只是查询所以会漏掉一些错误条件,...故意延迟复制的从库,弄一个故意延迟一个小时复制的从库,这样无论什么时候都能快速拿到一个小时前的数据。...主库将修改写入本地binlog中 从库将拉取主库binlog写入本地relay log中 从库读取relay log并执行(这里是单线程执行,不能并发,所以慢) innodb和myisam与区别 innodb

    56610

    Jmm内存模型_java jvm内存模型

    Java内存模型是一种虚拟机规范,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。...,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝...答案是,不确定,即B线程有可能读取到A线程更新前的值1,也有可能读取到A线程更新后的值2,这是因为工作内存是每个线程私有的数据区域,而线程A变量x时,首先是将变量从主内存拷贝到A线程的工作内存中,然后对变量进行操作...如以下示例图所示案例: 以上关于主内存与工作内存之间的具体交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步到主内存之间的实现细节,Java内存模型定义了以下八种操作来完成。...(3)read(读取):作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用 (4)load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中

    46310

    volatile(1)

    ),L3和主内存同步数据。...CPU避免了与主内存直接打交道,与速度比主内存高出很多的CPU高速缓冲区打交道,充分利用了CPU的高性能。 ---- CPU读取速度是够快了,问题是:CPU操作完成后,如何将数据写入?...第3节 缓存一致性问题 ---- 举个栗子 i++; 当线程运行这段代码时 1. 首先会从主内存中读取i( i = 1)。 2. 然后复制一份到CPU高速缓存中,然后CPU执行 + 1 的操作。...---- 假如有两个线程A、B都执行这个操作(i++), 按照我们正常的逻辑思维主内存中的i值应该是3,但事实是这样么?分析如下: 1. A、B两个线程从主存中读取i的值1到各自的高速缓存中。 2....此外,已修改缓存行如果被丢弃或标记为失效(即,从M状态 ——> I状态),那么先要把它的内容回写到内存中 ———— 这和回写模式下常规的处理方式一样。

    52830

    彻底理解Java内存模型,它为什么会引发线程安全问题【吐血总结】

    据当事人陈述: 线程在操作数据时,会从主内存中拷贝一份数据副本到自己的工作内存,操作完再写回主内存,那如果这个数据超级大,也会拷贝到工作内存中吗?...,但随着技术的发展,cpu执行效率远远超过了内存的读写效率,所以出现了一个现象 cpu执行 +1 操作耗时很短,假设只需要1ms,而从内存中读取 i ,再写回内存,耗时很长,假设是10ms cpu...,也就是我们平时说的L1、L2、L3缓存,这一块缓存一般比较小,但嗷嗷快,你懂我意思吧 注意:知识点来了,一定要把cpu的高速缓存和内存条的内存区分开 这是内存条的内存(系统属性中可以查看)...这是cpu的高速缓存(任务管理器-性能一栏可以查看到) 所以现在操作流程变成了: cpu会事先将需要用到的数据从主内存中复制一份到高速缓存,cpu在执行计算操作时,依次从L1、L2、L3级缓存中查找...,线程需要 上面说了,Java内存模型就是一种协议;线程要操作数据,需要先从主内存中读取到工作内存,操作完再写回主内存,看起来简单,但这之间有很多底层技术细节,比如: 什么时候读取?

    32720

    Java并发编程(1)-并发基础

    ---- CPU多级缓存-乱序执行优化 什么是乱序执行优化: 处理器为提高运算速度而做出违背代码原有顺序的优化 例如,我现在有两个变量a和b,a的值为10,b的值为200,我要计算a乘以b的结果。...如果上图中的线程A和线程B要通信,必须经历两个步骤: 首先线程A要把本地内存A中更新过的共享变量刷新到主内存里 然后线程B再到主内存中去读取线程A更新的共享变量,这样就完成了两个线程之间的通信了 因此,...就在此时线程B并没有等待线程A把累加后的结果写入到主内存中再进行读取,而是在主内存中直接读取到了变量值为1,然后保存到本地内存B中进行累加。...read(读取):作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用 load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中...,它把store操作从工作内存中一个变量的值传送到主内存的变量中 同步规则 如果要把一个变量从主内存中复制到工作内存,就需要按顺序的执行read和load操作,如果把变量从工作内存中同步回主内存中,就要按顺序的执行

    57230

    探讨缓存行与伪共享

    缓存行(Cache line) 对计算机组成原理相对熟悉的小伙伴都知道,CPU 的速度比内存的速度高了几个数量级,为了 CPU 更快从内存中读取数据,设置了多级缓存机制,如下图所示: ?...那是不是可以从主内存拿数据的时候,顺便多拿一些呢?这样就可以避免频繁从主内存中获取数据了。聪明的计算机科学家已经想到了这个法子,这就是缓存行的由来。...缓存是由多个缓存行组成的,而每个缓存行大小通常来说,大小为 64 字节,并且每个缓存行有效地引用主内存中的一块儿地址,CPU 每次从主内存中获取数据时,会将相邻的数据也一同拉取到缓存行中,这样当 CPU...可以看到,使用缓存行比没有使用缓存行的性能提升了将近 4 倍。 伪共享问题 当 CPU 执行完后,还需要将数据回写到内存上,以便于别的线程可以从主内存中获取最新的数据。...这时会重新从主内存中读取该 Cache line 数据。

    79510

    ④数据查询时,解决Redis缓存穿透的问题...

    个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 ④解决Redis缓存穿透 什么是缓存穿透?...缓存击穿(Cache Breakdown): 请求的数据在数据库中存在,但由于某些原因(例如缓存过期),导致缓存失效,每次请求都需要重新查询数据库。 如何解决缓存穿透?...误判: 误判率: 数组越小,误判率就越大;数组越大,误判率就越小,但同时带来更多的内存消耗; ②缓存空对象(缓存空值): 当系统判断某个数据在数据库中不存在时,可以将这个结果缓存起来,并设置一个较短的过期时间...从redis缓存中获取shop信息 String shopJSON = stringRedisTemplate.opsForValue().get(key); //2....缓存未命中,从数据库中获取 Shop shop = this.getById(id); //4.

    16810

    译文《Java并发编程之volatile》

    更准确地说,每次对volatile变量的读取都将从计算机主内存中读取,而不是从CPU缓存中读取,并且每次对volatile变量的写入都将写入主内存,而不仅仅写在CPU缓存。...这听起来可能有点抽象,所以让我详细说明。 在多线程应用程序中,如果多个线程对同一个无声明volatile关键词的变量进行操作,出于性能原因,每个线程可以在处理变量时将变量从主内存复制到CPU缓存中。...如果计数器(counter)变量没有声明volatile关键词,则无法保证计数器变量的值何时从CPU缓存写回主内存。这就意味着,每个CPU缓存上的计数器变量值和主内存中的变量值可能不一致。...days变量的值到total变量中,当程序读取days变量时,也会从主内存读取month变量和years变量的值。...同时间线程2也可以从主内存中读取到相同的计数器变量,其中变量的值仍为0,存进其自己的CPU高速缓存。 然后,线程2也可以将计数器(counter)递增到1,也还未将其写回主内存。

    25230

    不会Java内存模型,就先别扯什么熟悉并发编程

    ,结果无法预测 内存之间的交互操作 关于主内存和工作内存之间具体的交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步回主内存之类的实现细节,Java 内存模型中定义了 8 种 操作来完成...read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。...load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。...如果需要把一个变量从主内存复制到工作内存,那就要顺序地执行 read 和 load 操作,如果要把变量从工作内存同步回主内存,就要顺序地执行 store 和 write 操作。...除此之外,Java 内存模型还规定了在执行上述 8 种基本操作时必须满足如下规则 不允许 read 和 load、store 和 write 操作之一单独出现,即不允许一个变量从主内存读取了但工作内存不接受

    39920

    Java内存模型(JMM)解析:为何并发编程如此重要?

    计算机现代计算机的架构,尤其是冯·诺依曼模型,为我们提供了一个理解计算机如何工作的框架。在这一模型中,CPU与主内存之间的交互是至关重要的。...在计算机系统中,我们无需过多关注输入输出设备,因为最关键的是中央处理器(CPU)与主内存之间的数据交互过程,即CPU从主内存中取数并进行计算、再将结果存回主内存的动态过程。...read(读取):作用于主内存的变量,将一个变量的值从主内存复制到线程的工作内存中,以便后续的load操作使用。...load(载入):作用于工作内存的变量,将read操作从主内存中获取的变量值放入工作内存的变量副本中,供线程使用。...write(写入):作用于工作内存的变量,将store操作从工作内存中的一个变量的值传送到主内存中的变量,更新主内存中的值。

    63452
    领券