自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 【MySQL实战45讲2】日志系统:一条SQL更新语句是如何执行的

在数据库中,查询语句的执行流程通常包括连接器、分析器、优化器、执行器等模块,最终到达存储引擎。然而,当我们谈论更新语句的执行流程时,情况会有所不同。更新操作不仅涉及数据的读取,还包括数据的修改和写入,这一过程更为复杂。本文将探讨更新语句的执行流程,并揭示MySQL实现数据恢复的奥秘。通过了解这些底层原理,我们不仅能更好地理解数据库的工作机制,还能在实际应用中更加得心应手。首先,查询语句会走的流程,更新语句也同样会走一遍,所以先回顾一下SQL语句基本的执行链路。执行语句要先连接数据库,这是连接器的工作。

2025-01-07 00:19:41 946

原创 【MySQL实战45讲10】MySQL为什么有时候会选错索引

优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。如果使用索引 b 进行查询,那么就是扫描索引 b 的最后 50001 个值,与上面的执行过程相同,也是需要回到主键索引上取值再判断,所以需要扫描 50001 行。采样统计的时候,InnoDB 默认会选择 N 个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。MySQL是通过采样统计来得到索引的基数的,虽然把整张表一行行统计,可以得到精确的结果,但是代价太高了,索引选择了采样统计。

2024-11-25 22:26:05 799

原创 【Java并发编程的艺术3】Java内存模型(下)

根据volatile的happens-before规则,释放锁的线程在写volatile变量之前可见的共享变量,在获取锁的线程读取同一个volatile变量后将立即变得对获取锁的线程可见。对于引用类型,写final域的重排序规则对编译器和处理器增加了如下约束:在构造函数内对一个final引用的对象成员域的写入,与随后在构造函数外把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。如上图所示,线程A在写flag变量后,本地内存A中被线程A更新过的两个共享变量的值被刷新到主内存中。

2024-11-25 22:24:07 963

原创 【MySQL实战45讲9】普通索引和唯一索引怎么选择

今天的话题是,在不同的业务场景下,应该选择普通索引,还是唯一索引假设现在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似下面的sql语句;这种情况下,会考虑在id_card字段上建索引。由于身份证号字段比较大,不建议作为主键,那么现在就有了两个选择,要么给id_card字段创建唯一索引,要么创建一个普通索引。如果业务代码已经保证不会写入重复的身份证号,那么这两个选择逻辑上都是正确的。

2024-10-24 01:20:41 468

原创 【Java并发编程的艺术3】Java内存模型(中)

虽然线程A可能在临界区内做了重排序,但由于监视器互斥执行的特性,这里的线程B根本无法“观察”到线程A在临界区内的重排序,这种重排序既提高了执行效率,又没有改变程序的执行结果。但A和B之间没有数据依赖关系,编译器和处理器可以重排序A和B之间的执行顺序,下图是该程序的两种执行顺序。对于未同步或未正确同步的多线程程序,JMM只提供最小安全性,线程执行时读取到的值,要么是之前某个线程写入的值,要么是默认值(0,Null,False),JMM保证线程读操作读取到的值不会无中生有地冒出来。

2024-10-24 01:19:24 787

原创 【MySQL实战45讲8】事务到底是隔离还是不隔离

如果是可重复读隔离级别,事务T启动的时候会创建一个视图read-view,之后事务T执行期间,即使有其他事务修改了数据,事务T看到的仍然跟在启动时看到的一样。但当一个事务要更新一行的时候,如果刚好有另外一个事务拥有这一行的行锁,这个事务会被锁住,进入等待状态。问题是,既然进入了等待状态,那么等到这个事务自己获取到行锁要更新数据的时候,它读到的值又是什么呢?

2024-10-15 19:45:02 785

原创 【MySQL实战45讲7】行锁功过

但是第二种策略也是有额外负担的,可以想象一下这个过程:每当一个事务被锁的时候,就要看看它所依赖的线程有没有被别人锁住,如此循环,最后判断是否出现了循环等待,也就是死锁。但是这种操作本身带有一定的风险,因为业务设计的时候一般不会把死锁当做一个严重错误,毕竟出现死锁了,就回滚,然后通过业务重试一般就没问题了,这是业务无损的。当然,为了保证交易的原子性,要把这三个操作放在一个事务中。对于第一种策略,设置时间太长对于在线服务是无法容忍的,太短,又可能误伤类似锁等待的情况,所以,正常情况下,使用第二种策略。

2024-10-06 01:10:54 510 1

原创 【Java并发编程的艺术3】Java内存模型(上)

与程序员密切相关的happens-before规则如下;程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。

2024-10-05 01:18:09 1153 2

原创 【MySQL实战45讲6】全局锁和表锁

全局锁的典型使用场景是,

2024-10-03 23:48:40 1569 2

原创 【Nacos架构 & 原理】内核设计之Nacos一致性协议

配置数据,是直接在 Nacos 服务端进行创建并进行管理的,必须保证大部分的节点都保存了此配置数据才能认为配置被成功保存了,否则就会丢失配置的变更,如果出现这种情况,问题是很严重的,如果是发布重要配置变更出现了丢失变更动作的情况,那多半就要引起严重的现网故障了,因此对于配置数据的管理,是必须要求集群中大部分的节点是强一致的,而这里的话只能使用。作为一种有状态的中间件应用的内嵌协议,Distro保证了各个Nacos节点对于海量注册请求的统一协调和存储。,通过算法来保障各个节点之间的数据的一致性。

2024-10-03 19:23:09 1609 2

原创 【Nacos架构 & 原理】内核设计之Nacos寻址机制

可以想象下,当你新增一个 Nacos 节点时,需要去手动修改每个 Nacos 节点下的 cluster.conf 文件,这是多么辛苦的一件工作,或者稍微高端一点,利用 ansible 等自动化部署的工具去推送 cluster.conf 文件去代替自己的手动操作,虽然说省去了较为繁琐的人工操作步骤,但是仍旧存在一个问题——每一个 Nacos 节点都存在一份 cluster.conf 文件,当 Nacos节点启动时,会读取该文件的内容,然后将文件内的 IP 解析为节点列表,调用。的内容信息,这样,运维人员。

2024-10-02 12:54:18 958 3

原创 【Nacos架构 & 原理】内核设计之Nacos通信通道

(当前实现版本)人工管控方案:集群视角的系统负载控制台,提供连接数,负载等视图(扩展新增连接数,负载,CPU 等信息,集群间 report 同步),实现人工调节每个 Server 节点的连接数,人工触发reblance,人工削峰填谷。(未来终态版本)自动化管控方案:基于每个 server 间连接数及负载自动计算节点合理连接数,自动触发reblance,自动削峰填谷。核心的策略是客户端+服务端双向调节策略,客户端随机选择+服务端运行时柔性调整。,http 短连接性能压力巨大,未来 Nacos 需要。

2024-10-01 19:57:35 1416 2

原创 【Nacos架构 & 原理】服务发现模块之Nacos注册中心的设计原理

这种健康检查方式的多样性非常重要,这样可以支持各种类型的服务,让这些服务都可以使用到Nacos的负载均衡能力。使用心跳上报方式维持活性,发送心跳的周期默认是5秒,Nacos服务端会在15秒没收心跳后将实例设置为不健康,在30秒没收到心跳时将这个临时实例摘除。Nacos试图做的是将服务端负载均衡与客户端负载均衡通过某种机制结合起来,提供用户扩展性,并给予用户充分的自主选择权和轻便的使用方式。Nacos目前的一致性协议实现,一个是基于简化的Raft的CP一致性,一个是基于自研协议的Distro的AP一致性。

2024-10-01 15:29:39 788 2

原创 【Nacos 架构 & 原理】服务发现模块之Nacos注册中心服务数据模型

命名空间(Namespace):Nacos 数据模型中最顶层、也是包含范围最广的概念,用于在类似环境或租户等需要强制隔离的场景中定义。Nacos 的服务也需要使用命名空间来进行隔离。分组(Group):Nacos 数据模型中次于命名空间的一种隔离概念,区别于命名空间的强制隔离属性,分组属于一个弱隔离概念,主要用于逻辑区分一些服务使用场景或不同应用的同名服务,最常用的情况主要是同一个服务的测试分组和生产分组、或者将应用名作为分组以防止不同应用提供的服务重名。服务名(Name)

2024-09-29 14:08:14 1380 2

原创 【Nacos 架构 & 原理】服务发现模块之Nacos健康检查机制

由于持久化服务的实例的在被主动删除前一直存在的特性,探活的定时任务会不断探测服务的健康状态,并且将无法探测成功的实例标记为不健康。但是有些时候会有这样的场景,有些服务不希望去校验其健康状态,**Nacos也是提供了对应的白名单配置,用户可以将服务配置到该白名单,那么 Nacos 会放弃对其进行健康检查,**实例的健康状态也始终为用户传入的健康状态。临时实例只会对其被负责的注册中心节点发送心跳信息,注册中心服务节点会对其负责的永久实例进行健康探测,在。进行临时实例的注册,通过 Nacos 的。

2024-09-28 20:43:23 889 2

原创 【MySQL实战45讲4-5】索引

索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本500页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那寻找起来是很费劲的。同样,对于数据库的表而言,索引其实就是它的“目录”。

2024-09-28 14:17:09 968 1

原创 【MySQL实战45讲3】事务隔离

当前值是 D,但是在查询这条记录的时候,不同时刻启动的事务会有不同的 readview。如图中看到的,在视图 1、2、3 里面,这一个记录的值分别是 A、B、D,同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)。同时你会发现,即使现在有另外一个事务正在将 D 改成 E,这个事务跟 readview 1、2、3 对应的事务是不会冲突的。到了月底你要做数据校对,也就是判断上个月的余额和当前余额的差额,是否与本月的账单明细一致。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。

2024-09-23 23:47:20 763 1

原创 【Java并发编程的艺术2】Java并发机制的底层实现原理

Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。术语英文单词术语描述内存屏障一组处理器指令,用于实现对内存的顺序限制缓冲行cache lineCPU高速缓存中可以分配的最小存储单位。处理器填写缓存行时会加载整个缓存行,现代CPU需要执行几百次CPU指令原子操作不可中断的一个或一系列操作缓存行填充当处理器识别到从内存中读取操作数是可缓存的,处理器读取整个高速缓存行到适当的缓存(L2,L3,L3的或所有)写命中。

2024-09-21 22:00:19 1189 1

原创 JVM学习笔记:类加载器

类加载器是一个负责加载类的对象。是一个抽象类。给定类的二进制名称,类加载器应该尝试定位或生成构成类定义的数据。典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的"类文件"。每个Java类都有一个引用指向加载它的。不过,数组类不是通过创建的,而是JVM在需要的时候自动创建的,数组类通过方法获取的时候和该数组的元素类型的是一致的。由此可得类加载器是一个负责加载类的对象,用于实现类加载过程中的加载这一步。每个Java类都有一个引用指向加载它的数组类不是通过。

2023-12-04 15:15:46 1617 1

原创 JVM学习笔记:类加载机制

对于初始化阶段,虚拟机严格规范了。

2023-11-30 23:00:53 765 1

原创 JVM学习笔记:垃圾回收

当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。它的“单线程”的意义不仅仅意味着它只会使用一条垃圾收集线程完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程(“stop the world”),直到它收集结束。扫描堆中的对象,看是否能够沿着GC ROOT对象为起点的引用链找到该对象,能够达到的对象都是存活的,不可达的对象可被回收。Java的自动内存管理主要是针对对象内存的回收和对象内存的分配。

2023-11-29 22:37:10 872 2

原创 JVM学习笔记:内存结构

主要存放了编译器可这的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。因为永久代(方法区实现)的GC回收效率太低,只有在整堆收集(Full GC)的时候才会被执行GC。: 在编译时,Java 类中的方法和字段不是通过直接的内存地址表示,而是通过符号引用表示,它是一种符号化的引用,类似于符号表中的条目。

2023-11-28 21:32:30 974

原创 RocketMQ学习笔记:秒杀+分布式锁 Redis RocketMQ SpringBoot

【代码】RocketMQ学习笔记:秒杀+分布式锁 Redis RocketMQ SpringBoot。

2023-11-02 15:31:30 295 2

原创 RocketMQ学习笔记:多种发送消息模式Demo

producer.send中的SendCallback是异步执行的,为了在测试中体现其异步性,在send方法后面先打印一句“我先执行”后挂起,查看异步执行的回调方法SendCallback是否执行。我们往一个主题里面发送消息的时候,根据业务逻辑,可能需要区分,比如带有tagA标签的被A消费,带有tagB标签的被B消费。例如:下订单业务,提交一个订单后就可以发送一个延时消息,30分钟后去检查这个订单的状态。分区有序:当有多个queue参与的时候,相对每个queue,消息都是有序的。

2023-10-28 13:51:08 305 2

原创 Redis学习笔记:缓存击穿及其解决,Redis结合SpringBoot

大量的请求同时查询一个key时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去。

2023-10-23 13:27:21 110 1

原创 Redis学习笔记:Bitmap结合SpringBoot自研布隆过滤器案例

由0和1状态表现的二进制位的bit数组。

2023-10-23 13:02:37 323

原创 Redis学习笔记:GEO结合SpringBoot案例 附近的地点推送

Redis中的GEO主要用于存储地理位置信息,并对存储的信息进行操作。包括:添加地理位置的坐标、获取地理位置的坐标、计算两个位置之间的距离、根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。

2023-10-23 12:07:46 250 1

原创 Redis学习笔记: HyperLogLog结合SpringBoot案例 大量UV的Redis统计方案

Unique Visitor,独立访客,一般理解为客户ip需要考虑去重Page View,页面浏览量不用去重Daily Active User,日活跃用户量,登录或者使用了某个产品的用户数(去重复登录的用户)常用于反映网站、互联网应用或者网络游戏的运营情况Monthly Active User,月活跃用户。

2023-10-23 11:29:10 340 1

原创 Redis学习笔记:Redis与MySQL数据双写一致性 Java Canal配置Redis,MySQL步骤

文件位置在mysql的安装目录下,博主的目录如下:D:\Environments\Mysql\mysql-8.0.34-winx64。第二个红框中个的ip地址即mysql所在的ip,博主的mysql是在windows上的。首先以管理员的身份打开命令行工具,WIN+R后,Ctrl+Shift+Enter即可。

2023-10-19 23:02:48 274 1

原创 Redis学习笔记:缓存双写一致性的更新策略

缓存双写一致性指:数据库中的数据与缓存中的数据一致。由于高并发的场景,所以缓存双写一致性实际是指最终一致性,而非实时一致性。

2023-10-19 21:52:31 229 1

原创 Redis踩坑记录:Windows Redis设置密码无效 解决过程记录

根据网上资料,得知设置redis密码需要在redis安装目录下的redis.windows.conf中找到requirepass,将注释去掉,并设置自己需要的密码。通过反复查阅资料,发现,系统设置了redis自动启动,如果redis设置了自动启动,则无法设置redis启动时加载配置文件,所以需要取消redis自动启动。最后通过redis-cli中检查密码是否设置成功,但是与大多数教程不同的是,我的设置没有生效,仍然不需要密码就可以set key value。,设置redis启动时加载配置文件。

2023-10-14 22:46:34 3128 4

原创 Redis学习笔记:Redis扣减库存案例 逐步优化

例如有三个用户并发执行,三个用户都获取了stock的值后进入if判断语句,现在三者获得的stock都是初始值298,那么该业务执行后stock的值是297,但是实际上还多卖给了两个用户,出现超卖现象。:出现当前获取锁的用户需要的执行时间大于分布式锁的超时时间,自动释放后,下一个用户获取分布式锁,而当前用户会执行释放锁的操作,就把下一个用户获取的锁释放了,以此类推。:将分布式锁的value设置为UUID,每次删除之前,判断当前锁的value与执行删除锁逻辑的线程的UUID是否相同,不同则等待,相同则删除。

2023-10-10 19:09:21 1031 3

原创 Mybatis踩坑:使用@Alias,启动报错To display the conditions report re-run your application with ‘debug‘ enabled

为了避免在使用Mybatis的时候,反复在mapper.xml文件中指定参数类型(ParamterTyp)和返回类型(resultType)的完整包名,决定在实体类上使用@Alias注解来简化操作。使用@Alias注解前。使用@Alias注解后。

2023-09-23 19:13:53 442 3

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除