- 博客(79)
- 收藏
- 关注
原创 MySQL-锁
给记录加锁,一致性要求强。快照读是读取快照信息,在读已提交的情况下读取的是最新的快照信息,在可重读读的情况下读取的是事务开始时的快照信息。,用于协调表锁和行锁之间的关系。在事务加了行锁的情况下,判断是否还需要加表锁。意向锁是由数据引擎自己维护的,用户无法手动操作。InnoDB中主要有三种行锁,分别是。
2025-04-13 02:48:54
26
原创 MySQL-事务
在读已提交的事务隔离级别中,每次查询都会生成一个ReadView。而在读已提交的隔离级别中,相同的查询只会生成一个ReadView。临键锁是记录锁和间隙锁的集合,记录锁只能锁定一行数据,也就是记录本身。间隙锁锁定一个范围,不包含记录本身,可以避免插入新数据。那么临键锁就是锁定一个范围,包括记录本身,这样就可以解决幻读的问题。,MVCC是多版本并发控制,存储多个版本的数据。锁根据粒度不同分为行锁和表锁,行锁就是对一行或多行数据加锁,表锁就是对整张数据库表加锁。,undolog保存的是。未提交事务的最小ID。
2025-04-13 02:46:30
67
原创 MySQL-日志文件
redolog buffer存放在内存中,当内存中的buffer poll中的数据页发生变化时就会同步到redolog buffer中。然后,redolog buffer中的数据再同步到磁盘中的redolog file文件中。redolog重做日志,记录事务提交时数据页的物理修改。而一行redolog记录只占几十字节,支持顺序I/O,刷盘性能非常好。,主要用于记录数据发生的变化,用于主从同步。redolog是重做日志,记录数据的。undolog是回滚日志,记录的是数据的。MySQL中的日志文件有错误日志、
2025-04-13 02:39:25
122
原创 MySQL-存储引擎和索引
创建的索引,相比于单列索引,每个索引对应一颗B+树,而联合索引只需要一颗B+树。我们在使用联合索引的时候,将区分度最高的字段放到左边,这样可以过滤更多的数据。如果我们使用主键进行查询,那么就会采用聚簇索引返回所有字段的数据,这就是覆盖索引查询。非聚簇索引不一定回表查询,比如查询用户名,用户名正好建立了索引,直接返回就可以。MySQL中的存储引擎是插件式的,可以为不同的数据库表设置不同的存储引擎。覆盖索引就是查询使用了索引,返回的字段必须在索引中全部找到。聚簇索引就是将主键做为索引,只能有。
2025-04-13 00:47:18
165
原创 Redis-集群
Redis Cluster就是部署多台Redis主节点,这些节点之间平等没有主从之说,同时对外提供。单节点的Redis并发能力是有限的,要想进一步提高Redis的并发能力就要搭建集群,实现。主从复制有一个缺点,不能保证redis的高可用,主节点宕机后就丧失了写数据的能力。哨兵会监听主从节点的状态,当master节点发生故障的时候,会自动从剩下的slave节点中一个新的master。,主节点负责写操作,从节点负责读操作。来实现的,共识算法就是让分布式系统中的节点就某个问题达到共识。主节点的自动故障恢复。
2025-04-12 02:44:56
205
原创 Redis-出现的问题
设置了过期时间,当Key过期的时候,恰好这时间点对这个Key有大量的并发请求,这些大量并发的请求可能会瞬间把数据库压垮。对于过期key,Redis采用的是定期删除+惰性删除。但是针对于大量key集中过期,可以给key。机制,Redis会在后台异步删除过期的key,不会阻塞主线程的运行。或者缓存服务器宕机,导致大量的请求访问数据库,对数据库造成很大压力。,这将导致据每次请求都要到数据库去查询,对数据库造成了巨大的压力。遇到过缓存击穿的问题,在给热门商品信息设置了过期时间。
2025-04-12 02:37:07
94
原创 Redis-事务
Redis的设计更倾向于性能,而不是为了像数据库一样,保证事务的一致性而且牺牲性能。Redis的事务用的并不多,通过Lua脚本也可以保证多个命令执行的原子性,并且性能还会更好。因为通过Lua脚本,它会将多个命令打包,一起放到Redis的服务端进行执行。,这些队列中的命令才会执行。在这个过程中如果某一个命令发生异常,不会导致所有的命令回滚,而是忽略异常命令,继续执行其它命令。数据库的事务就是开启事务,然后执行数据库的一系列操作,如果没有异常就会提交事务,如果出现异常就会回滚事务。
2025-04-12 02:32:37
65
原创 Redis-内存
Redis先采用定期删除每隔一段时间就抽取一定数量的key来检查和删除,然后采用惰性删除,在获取key的时候,redis会检查key是否过期,然后删除。这样即对内存友好,又对CPU友好。Redis在过期字典中保存数据过期时间,查询key的时候首先判断是否在过期字典中,如果没有的话直接返回,如果存在的话需要判断key是否过期。的时候对过期时间进行检查,这种方式对CPU友好,但是对内存不友好,可能出现大量的过期key没有被访问,从而不会被删除。子进程完成重写之后,会将重写缓冲区的命令写入到新的AOF文件中。
2025-04-12 02:29:56
208
原创 Redis-数据类型
属性,检查空间大小是否满足,如果不满足就会动态扩充。SDS获取字符串长度的时间复杂度是O(1),直接获取len属性的值即可。String可以存储各种类型的数据,比如:整数、字符串、浮点数和图片等。如果List为空,Redis服务器会等List中有新数据或者等待超时之后返回。如果对象中某些字段经常变化或查询,使用Hash存储很适合。同时Hash比String更节省空间,特别是字段较多且长度较短时。简单动态字符串,SDS可以避免缓冲区溢出,在修改字符串的时候会先判断。,用在不能重复的场景。(存放0、1数组)、
2025-04-12 02:22:33
105
原创 Redis-分布式锁
选取的新的主节点就会再次获取锁,这就不满足锁的互斥性了。唯一的key使用:用户token+商品的url和重复提交的key,保证当前用户当前商品重复下单操作只能提交一次,其他通过setNX保存失败的都忽略掉。Reids实现的分布式锁是不可以重入的,但是Redission实现的分布式锁是可以重入的。,当重入次数大于0时,需要判断该占有锁的线程和请求获取锁的线程是否为同一个,如果是同一个就将重入次数加1。这样主节点宕机之后,就不能在其它节点上加锁了,红锁的实现复杂,性能很差。当用户下单的时候,可以通过。
2025-04-12 02:17:05
231
原创 Redis-基本概念
Reids是非关系型数据库,主要用于分布式缓存。由于数据存储在内存,所以速度很快。Redis支持五种基本的数据类型分别是StringListSetZSet和Key-Value键值对。Redis是单线程,I/O多路复用。2.除了Redis还知道哪些分布式缓存吗?除了Redis还有Memcached,Redis和Memcached都是基于内存的数据库,速度都很快。Memcached只支持Key-Value数据类型,而Redis支持多种数据类型。Memcached将全部的数据存储在内存中,不支持数据持久化。
2025-04-12 02:12:04
243
原创 RabbitMQ
RabbitMQ为了保证MQ的可靠性,采用数据持久化,包括交换机持久化、队列持久化和消息持久化,都是需要配置Durability属性来开启持久化的。RabbitMQ通过convertAndSend方法来发送消息,第一个参数为交换机名,第二个参数为routingKey,第三个参数为发送的消息。可能出现消息丢失的场景分别是生产者发送消息时消息丢失、MQ宕机导致消息丢失,消费者处理消息时抛异常导致消息丢失。采用确认机制和重试机制中,很有可能出现同一个消息被重复消费的可能,可以采用唯一ID的方式来保证幂等性。
2025-04-12 01:56:40
760
原创 SpringCloud - 分布式事务
由于单体事务在不同的微服务中,无法保证全局事务的ACID特性。比如创建订单成功,购物车页清理成功了,但是扣减库存失败,此时购物车中的商品信息也清空了,无法回滚。其中TC可以协调全局事务提交回滚,TM向TC报告方法的开始和结束,RM负责管理分支事务提交或回滚。,我们项目中使用的是AT,在这里主要讲下XA和AT,XA和AT都是采用两阶段提交来解决分支事务问题。是解决分布式事务的中间件,Seata事务管理有三个重要的角色,分别是。Seata中提供了四种不同的分布式事务解决方案,分别是。
2025-04-12 00:54:00
95
原创 SpringCloud-服务熔断降级
由于我们的查询购物车和修改购物车都属于购物车微服务里,查询购物车需要调用商品服务,如果商品服务出现故障,查询购物车业务就会等待商品服务返回。如果查询购物车的请求太多,那么就会将购物车服务压垮,导致雪崩。由于修改购物车业务在购物车服务中,修改购物车请求也会失败。所有我们就用Sentinel对查询购物车和修改购物车做了线程隔离。查询购物车失败的时候,如果没有查询到最新的商品信息。这样在购物车查询失败的时候,修改购物车业务不会受到影响。在项目中查询购物车和修改购物车中用到了。
2025-04-12 00:50:11
50
原创 Spring Cloud网关
客户端的请求先通过匹配规则找到合适的路由,就能映射到具体的服务。然后请求经过过滤器处理后转发给具体的服务,服务处理后,再次经过过滤器处理,最后返回给客户端。先将路由信息添加到Nacos配置中,当路由配置信息发生变更的时候就推送到网关。如何在网关和微服务之间传递用户信息?客户端的请求先经过路由匹配规则找到合适的路由,映射到具体的服务上。然后,请求经过过滤器处理转交给具体的服务,服务处理后再经过过滤器返回给客户端。路由断言就是客户端发送的请求满足断言之后,就会映射到指定的路由器,然后转发到指定的微服务。
2025-04-12 00:46:15
838
原创 Spring Cloud 远程调用
微服务间的远程调用可以分为两种,第一种采用Nacos服务注册发现,然后RestTemplate实现远程调用,这种方式比较蛮烦。第二种是采用Openfeign实现远程调用,我们不需要关注底层的实现细节。实现微服务间的远程调用主要有两种方式,第一种是先通过Nacos服务注册发现获取到服务实例列表,然后通过RestTemplat实现远程调用。第二种方法是基于Openfeign实现远程服务调用,如果采用OpenFeign的方法就不需要关注底层的实现细节。在使用OpenFeign的时候,主要关心两个注解,
2025-04-12 00:02:02
286
原创 Sping Cloud配置和注册中心
Nacos通过心跳监测来检查服务实例是否异常,如果定期时间内没有返回心跳,就将服务实例设置为不可用。注册中心会将服务实例列表发送给Nacos客户端,Nacos客户端会根据本地的负载均衡算法选择一个实例调用。Nacos实现配置共享和热更新时,首先将配置信息添加到Nacos中,然后在bootstrap.yaml文件中拉取共享配置。Nacos采用长轮询的方式来检查配置信息变更,如果服务端配置信息没变更,连接就会一直打开。如果服务端的配置信息发生变更,就将变更的配置信息拉取到本地。
2025-04-11 23:49:14
288
原创 MyBatis(2)
动态SQL可以根据具体的参数,对SQL语句进行拼接。标签用来做迭代拼接,通常会与SQL语句中的IN查询条件结合使用。一个班级对应多个学生,也就是班级类中有一个学生集合属性,这就是一对多关系。属性则为需要迭代的集合,由于入参是个List,所以参数名必须为list。一个学生对应一个班级,也就是学生类中有一个班级属性,这就是一对一关系。标签只会在至少有一个子元素返回了SQL语句时,才会向SQL语句中添加。标签用来将重复的SQL片段提取出来,然后在需要的地方,使用。,后面在引用时,参数名必须为。
2025-04-11 02:21:20
460
原创 MyBatis(1)
对象指的是Java对象,关系指的是数据库中的关系模型。对象关系映射,指的就是在Java对象和数据库的关系模型之间建立一种对应关系,比如用一个Java的Student类,去对应数据库中的一张student表,类中的属性和表中的列一一对应。占位符,会对输入参数进行类型解析(如果入参是String类型,设置参数时会自动加上引号),可以防止SQL注入,一般用于传参。持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性.MyBatis是一款半自动的。
2025-04-11 02:18:40
225
原创 SpringBoot
然后将自己的自动配置类维护在@EnableAutoConfiguration这个key中。这样SpringBoot在启动时才能读取这个文件的自动配置类。SpringBoot的启动原理就是在运行SpringApplication.run时,底层到底如何运行,能帮助我们启动一个SpringBoot的应用。文件中获取所需要装配的类,并生成相应的Bean对象,然后交给IOC容器进行管理。SpringBoot的默认日志框架是。自动装配实际上就是为了从。文件夹,并在文件夹里创建。切换日志框架就是添加。
2025-04-11 00:16:27
288
原创 Spring其它知识点
Spring默认的Bean作用域是单例,多个线程同时操作同一个Bean实例。若Bean包含可变成员变量,可能引发线程安全问题。
2025-04-10 14:51:08
408
原创 Spring 事务
幻读和不可重复读是类似的,但是幻读针对的是整张数据库表,前后两次读取的数据不一致。临键锁是记录锁和间隙锁的集合,记录锁只能锁定一行数据,也就是记录本身。脏读就是事务1先修改数据,在未提交的时候,事务2读取到了修改的数据,如果此时事务1发生了回滚,那么事务2就读到了脏数据。事务传播行为是为了解决业务层方法之间互相调用的事务问题,当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。不可重复读就是一个事务前后两次读到的结果不一样,可以通过设置隔离级别为重复读来解决这个问题。
2025-04-10 14:46:18
356
原创 Spring MVC
我们知道MyBatis是持久层框架,假如有一天我们使用其他的持久层框架,我们只需要改持久层的代码,上面的表现层和业务层都不需要改变。之前,可以根据需要检查或修改,在HttpServletResponse返回之前,也可以检查或修改。MVC是针对表现层水平分层的一种架构,分为:Model模型、View视图和Controller控制。三层架构就是将应用服务器进行分层,分为表现层、业务层和持久层。中的技术,可以对指定的一些行为进行拦截,例如URL级别的权限访问控制等。(完成后)方法,即可自定义拦截器。
2025-04-10 14:33:51
510
原创 Spring AOP
面向对象编程OOP是将程序中所有参与模块都抽象成对象,然后通过对象之间的相互调用关系完成需求。面向切面编程AOP是面向对象编程的补充,它是指程序运行时动态的将非业务代码切入到业务代码中。然后在运行时,动态的添加到指定位置。Spring AOP是基于动态代理实现的,动态代理的实现方式有两种,分别是。AOP的优点是可以降低模块间的耦合度,使系统更容易扩展,代码复用性更好。由于CGLIB是通过继承的方式做的动态代理,所以目标类如果被。修饰,那么它是无法使用CGLIB做动态代理的。AOP的实现方式有两种,分别是。
2025-04-10 13:58:24
348
原创 Spring基本概念
控制反转是一种设计思想,就是将我们手动创建对象的控制权交给Spring框架来管理,由Spring负责对象生命周期和对象间的依赖关系。Spring IoC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。4.Spring中的DI依赖注入是什么?依赖注入是IOC的一种实现方式,通过将依赖对象注入到目标对象来实现解耦。通过依赖注入,我们只需要简单的配置就能获取所需要的资源,完成自身的业务逻辑。不需要关心具体的资源来自何处,由谁实现。
2025-04-10 02:56:39
407
原创 微服务-配置管理
微服务共享的配置可以统一交给Nacos保存和管理,在Nacos控制台修改配置后,Nacos会将配置变更推送给相关的微服务,并且无需重启即可生效,实现配置热更新。,要实现动态路由首先要将路由配置保存到Nacos,当Nacos中的路由配置变更时,推送最新配置到网关,实时更新网关中的路由信息。因此,我们必须监听Nacos的配置变更,然后手动把最新的路由更新到路由表中。)初始化时处理的,发生在项目的引导阶段。将来根据id做更新,id一致就会覆盖,id不一致就会新增,删除的时候也会根据id。
2025-02-02 19:33:39
1261
1
原创 Day07:缓存-数据淘汰策略
(每次检查一定量的key,随着时间的推移会遍历一遍redis中所有的key,直到都检查一遍。,在设置该key过期时间后,我们不去管它,当需要该key时,我们再检查其是否过期,如果过期,我们就删掉它,反之返回该key。定期删除的优点:可以通过限制删除操作执行的时长和频率来减少删除操作对CPU的影响。优点:对CPU友好,只有使用该key时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查。缺点:对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key会一直存在内存中。
2025-01-30 22:04:52
858
原创 网关登录校验
路由过滤器,就是之前33种过滤器,作用范围比较灵活,可以是任意指定的路由Route:全局过滤器,作用范围是所有路由,不可配置。其实和/*** 处理请求并将其传递给下一个过滤器* @param exchange 当前请求的上下文,其中包含request、response等各种共享数据* @param chain 过滤器链,当前过滤器执行完后,要调用过滤器链种的下一个过滤器。* @return 根据返回值标记当前请求是否被完成或拦截,chain.filter(exchange)就放行了。*/
2025-01-29 21:08:59
1056
原创 微服务拆分
其中,查询商品、扣减库存都是与商品有关的业务,在item-service中有相关功能;清理购物车商品是购物车业务,在cart-service中有相关功能。链接: https://pan.baidu.com/s/1EJpQg9gUfIZlO6-e187IaA?请求参数:1654779387523936258,交易服务测试通过。注意,创建订单接口无法测试,因为无法获取登录用户信息。因此交易服务要调用他们,必须通过OpenFeign远程调用。因此交易服务要调用他们,必须通过OpenFeign远程调用。
2025-01-22 20:33:47
1408
原创 服务注册和发现
这个坐标里面没有版本号,因为在父工程的pom.xml文件中已经定义好spring-cloud-dependencies,这里面管理各组组件的版本。可以发现,这里Nacos的依赖于服务注册时一致,这个依赖中同时包含了服务注册和发现的功能。因为任何一个微服务都可以调用别人,也可以被别人调用,即可以是调用者,也可以是提供者。先将文件中的nacos.tar上传到宿主机中,由于本地没有镜像需要去下载,所以可以直接将镜像nacos.tar上传到docker容器中。不过这种手动发送Http请求的方式存在一些问题。
2025-01-15 01:27:37
990
原创 微服务拆分
什么时候需要拆分微服务?如果是创业型公司,最好先用单体架构快速迭代开发,验证市场运作模型,快速试错。当业务跑通以后,随着业务规模扩大、人员规模增加,再考虑拆分微服务。如果是大型企业,有充足的资源,可以在项目开始之初就搭建微服务架构。如何拆分?首先要做到高内聚、低耦合从拆分方式来说,有横向拆分和纵向拆分两种。纵向就是按照业务功能模块,横向则是拆分通用性业务,提高复用性服务拆分之后,不可避免的会出现跨微服务的业务,此时微服务之间就需要进行远程调用。微服务之间的远程调用被称为RPC,即远程过程调用。
2025-01-14 18:17:03
1058
原创 Docker基础
其中,比较常见的命令有:用一副图来表示这些命令的关系:默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实现开机自启:命令演示以Nginx为例演示上述命令。第1步,去DockerHub查看nginx镜像仓库及相关信息第2步,拉取Nginx镜像第3步,查看镜像第4步,保存镜像到本地第5步,删除镜像查看镜像第6步,读取本地镜像再次查看第7步,创建并运行容器第8步,查看容器状态对输出的内容格式化第9步,停止容器再次查看容器发现没有查看到ngi
2025-01-08 20:35:33
2106
原创 Docker安装
Docker是用来快速构建、运行、管理应用的工具,简单来说就是用来部署项目,以及项目所依赖的各种组件,这是一个典型的运维工具。之前没有Docker的时候,去做部署,往往都是基于手动的Linux命令,操作Linux服务器,基于简单的脚本实现部署。在CentOS上安装mysql,首先要查看本机Linux系统的版本,然后去官网下载相应的版本。然后将下载的安装包上传解压,安装之前还得卸载系统自带的数据库,安装之前还需要安装相应的依赖,然后按照顺序逐个安装。
2024-12-28 21:20:59
725
原创 SSH客户端
首先建议设置一下默认编辑器,这样我们通过MobarXterm的FTP工具打开文件时会以指定的编辑器打开,方便修改。链接: https://pan.baidu.com/s/1vuMUk2XtyvaotlqKxn2s3g?pwd=67dt 提取码: 67dt。在VMware界面中操作虚拟机非常不友好,所以一般推荐使用专门的SSH客户端。复制粘贴是很常用的配置,MobarXterm默认左键选中即。这样,复制和粘贴可以全部通过鼠标操作,无需按键。通过网盘分享的文件:MobaXterm。,但是需要配置右键点击为。
2024-12-22 02:04:21
300
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人