- 博客(96)
- 收藏
- 关注
原创 分布式事务解决方案
分布式事务:分布式系统会把一个应用拆分为多个可独立部署的服务,此时要完成事务,就需要这些服务之间。简单的说跨JVM进程或者跨数据库实例产生分布式事务。
2022-09-04 21:10:50 703
原创 Seata服务的搭建、Seata AT模式演示
这两个不同的服务都存在本地事务,在本地事务中如果出现异常,那么就会回滚本地事务,且controller层会捕捉异常,不让异常抛给用户,所以订单服务即使发生异常回滚了,扣减库存的服务是感知不到的。4.第二阶段全局事务提交,TC会通知各个分支参与者提交分支事务,在第一阶段就已经提交了分支事务,这里各参与者只需要删除UNDO_LOG即可,并且可以异步执行,第二阶段很快可以完成。2.tc服务在管理分布式事务时,需要记录事务相关数据到数据库中,你需要提前创建好这些表,创建一个seata的数据库,新增如下表。
2022-09-04 17:21:12 1746 1
原创 Redis实现分布式锁方案
先来引入一个问题,复习复习以前多线程和数据库的知识。如下所示,有一个Product表,带有库存:使用jmeter测试,开启n多个线程同时去扣减id为1的数据的库存(每次减一):最终的结果显示库存为负数,明显超卖了(有可能是正数),这是在单线程下的并发安全问题。问题的原因是多个线程同时查询,都查询到库存充足,进入if块了,但库存被扣完了,此时就会超卖。为什么这么写?是因为直接加锁有一点问题——>。②在数据库层面加悲观锁:在第一条查询语句时就加上排他锁,保证了只有一个线程能够同时查询和更新。
2022-08-21 21:13:54 1167 2
原创 spring事务出现的超卖问题
虽然该方法加了锁,看似线程安全、人畜无害,但结果还是有可能会超卖,为啥呢?先来看看@Transactional注解的奥秘。PlatformTransactionManager的实现类如下:其中的比较常用。
2022-08-21 13:44:06 1006 3
原创 MySQL MVVC多版本并发控制
它和undo log中的版本链息息相关,MVVC通过数据行的多个版本来实现数据库的。简单的说就是当前事务查询另一个事务正在更改的行(如果此时读取就会发生脏读),不用加锁等待,而是读取该数据的历史版本,降低响应时间。MVVC是通过undo log和Read View两种技术实现的。...
2022-08-12 09:10:23 1497 1
原创 MySQL中的锁机制详解
事务的(隔离级别)是由锁来保证的。并发访问数据的情况分为:1.读-读即并发事务相继读取相同的记录,因为没涉及到数据的更改,所以不会有并发安全问题,允许这种情况发生。2.写-写即并发事务对相同记录进行修改,会出现问题,因为任何一种隔离级别都不允许发生脏写,所以多个未提交的事务对同一个记录修改时需要加锁,保证它们是顺序执行的。锁内存中的结构,当事务想对某条数据进行更改时,首先会查看该记录有没有与之关联的锁结构,有的话则等待它的事务被提交,锁被释放;反之没有锁则生成锁结构与该记录继续关联。......
2022-08-07 21:11:37 5218 5
原创 MySQL redo log和undo log
REDO LOG 称为,当mysql服务器意外崩溃或者宕机后,保证,持久化到磁盘中(持久性)。InnoDB是以页为单位去操作记录的,增删改查都会加载整个页到buffer pool中,事务中的修改操作并不是直接修改磁盘中的数据,而是先修改buffer pool中的数据,master线程每隔一段时间再异步刷新到磁盘中,因为直接修改磁盘数据的话,消耗大(不是随机IO,且需要刷新整个页到磁盘)。...............
2022-08-04 21:45:55 3681 4
原创 Mockito单元测试
mockito可以模拟一个真实的对象,如模拟需要连接数据库的对象或者是需要启动spring容器的对象,它并不真正的连接数据库,所以测试时间更快。该模拟出来的对象调用的方法默认情况都是null、0、false。使用方式1.在测试类上加上@RunWith(MockitoJUnitRunner.class)注解,如果是springboot应用用@ExtendWith(MockitoExtension.class)注解。2.模拟要测试的对象,有多种方式。...
2022-08-02 09:37:10 3012
原创 Linux shell
bash介绍shell(壳)程序时我们用户和内核打交道的一个中间层,好让内核可以控制硬件来正确无误地工作。shell有很多种,查看所以shell类型:[lxc@com ~]$ cat /etc/shells/bin/sh/bin/bash/usr/bin/sh/usr/bin/bash/bin/tcsh不同的用户使用不同的shell,这个取决于用户的配置,该配置在文件: /etc/passwd查看得知:root用户是使用bash这个shell,还有些隐藏用户使用的是/s...
2022-08-01 13:59:34 714
原创 MySQL查询优化与调优
MySQL查询优化与调优,大方向上可以分为物理查询优化和逻辑查询优化两块。物理查询优化是通过索引和表连接方式等技巧来进行优化。逻辑查询优化是通过SQL等价变换提升查询效率。
2022-08-01 13:57:05 2556
原创 MySQL导致索引失效的情况详解
首先准备两张表用于演示:如下一条sql语句是没有索引的情况:我们通过建立索引来优化它的查询效率,有如下几种方案:①建立普通索引:②在普通索引的基础上,再增加联合索引: 可以看到,在多个索引都可以使用时,系统一般优先使用更长的联合索引,因为联合索引相比来说更快,这点应该也很好理解,前提是要遵守联合索引的最左匹配原则。如果再创建一个name,course_id,class_id组成的联合索引,那么上述sql语句不出意外会使用这个key_len更长的联合索引(意外是优化器可能会
2022-06-22 13:30:38 718
原创 MySQL性能分析工具的使用
通过SHOW STATUS语句查询一些MySQL数据库服务器的性能参数、执行频率。一些常用的性能参数如下:2. 修改long_query_time阈值接下来我们来看下慢查询的时间阈值设置,使用如下命令:默认为10秒,即超过10秒的查询语句才会被记录到慢查询日志。2.开启profiling功能3.查看当前会话都有哪些 profiles4.查看具体的profileshow profile的常用查询参数:① ALL:显示所有的开销信息。
2022-06-21 15:51:55 422
原创 MySQL索引的使用,索引的使用场景
上一篇我们主要是对索引设计体系的一个讲解,本篇主要是对索引使用的一个讲解创建索引的方式:如下,创建两个表:查看emp的索引:一共自动创建了三个索引:结论:创建表时主键约束、唯一约束、外键约束上会隐式的创建索引查看dept的索引:也可以在创建表时,显式的创建索引,语法如下*: UNIQUE 、FULLTEXT 和SPATIAL为可选参数,分别表示唯一索引、全文索引和空间索引; INDEX与KEY为同义词,两者的作用相同,用来指定创建索引; index_name指定索引的名称,为可
2022-06-19 13:15:13 959
原创 MySQL索引内部原理
索引即一本书的目录,我们通过书的目录能够快速的查到对应文章的页码。数据库的索引也差不多,通过在某些字段建立索引,可以快速的查找某些特定的数据,避免全表搜索。MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。索引的优点:索引的缺点:想到查找,那我们可能会想到二叉搜索树,然后再到红黑树,但这两种树的类型都是二叉的,所以高度很高,意味着磁盘I/O会产生多次,为了降低树的高度,索引会采用多叉树的结构,即B树。首先看下面的一张表:这个表使用Compact行格式来实际存储记录
2022-06-17 19:48:40 321
原创 MySQL中的各种存储引擎
为了管理方便,人们把连接管理、查询缓存、语法解析、查询优化这些并不涉及真实数据存储的功能划分为MySQL server的功能,把真实存取数据的功能划分为存储引擎的功能。所以在MySQL server完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的API,获取到数据后返回给客户端就好了。也就是:通过命令查看mysql提供了哪些存储引擎:如下:优点:缺点:特点:和InnoDB存储引擎的一个对比:Memory采用的逻辑介质是内存, 响应速度很快 ,数据易丢失 。另外,要求存储的数据是数据
2022-06-16 21:12:22 286
原创 MySQL的逻辑架构和SQL执行流程分析
MySQL大致分为四层:连接层、服务层、引擎层、存储层。大致如下:连接层对应图中的Connection Pool。是MySQL服务器提供给外部客户端的一个连接接口,客户端可以通过不同的方式进行连接,如JDBC、ODBC和原生方式API等(其本质还是建立TCP连接)。连接层不仅是建立连接,还需要进行认证授权、维持连接等操作。 服务层有多个模块:用于接收用户的SQL命令,并且返回用户需要查询的结果。比如SELECT ... FROM就是调用SQL Interface对SQL 语句进行语法分析、语义分析。将SQL
2022-06-16 15:52:18 493
原创 MYSQL用户与权限管理,角色管理
用户名参数表示新建用户的账户,由用户(User) 和主机名(Host) 构成,默认host为'%',表示所有主机(ip)都可登录,也可以使用如'lxc'@'192.168.%.%'的形式 可以不指定用户密码,无需密码登录;3.修改用户1.使用DROP USER语句来删除用户时,必须用于DROP USER权限。DROP USER语句的基本语法形式如下:2.使用DELETE方式删除执行完DELETE命令后要使用FLUSH命令来使用户生效。1. 使用ALTER USER
2022-06-11 11:32:26 3625
原创 sql子查询详解
子查询指一个查询语句嵌套在另一个查询语句内部的查询。SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集合)进行比较。先引出几张简单的表,供后续使用,分别为emp员工表:dept部门表我们需要查出工资比id为2的员工的工资多的所有用户。解决方式:注意事项:我们按内查询的结果返回一条还是多条记录,将子查询分为单行子查询 、 多行子查询 。上面的例子
2022-06-06 15:26:40 10260
原创 SQL关联查询详解,SQL JOIN详解
关联查询,也称为多表查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。...
2022-06-04 19:00:12 23407 3
原创 mysql数据类型
1.整数类型2.浮点类型3.定点数4.位类型:BIT5.日期类型6.文本字符串类型7.TEXT类型8.ENUM类型9.SET类型10.二进制字符串类型11.JSON类型可选属性:(-3.402823466E+38,3.402823466351E+38)(-1.7976931348623157E+308,1.7976931348623157E+308)0和(2.2250738585072014E-308,1.7976931348623157E+308)浮点数类型不精准。比如,我们设计一个表,有f1这个字段,插
2022-06-02 11:05:16 523
原创 nginx静态资源压缩
在Nginx的配置文件中可以通过配置gzip来对静态资源进行压缩,相关的指令可以配置在http块、server块和location块中,Nginx可以通过。ngx_http_gzip_module模块ngx_http_gzip_static_module模块ngx_http_gunzip_module模块对这些指令进行解析和处理。Gzip模块配置指令...
2022-05-18 13:05:07 3802 1
原创 Linux Shell文本处理三剑客grep、sed、awk总结
目录grepsed工具地址基础命令:高级编辑:标签awk选项:内置变量:模式:awk流程控制:内置函数I/O语句自定义函数grep过滤来自一个文件或标准输入匹配模式内容。 除了 grep 外,还有 egrep、fgrep。egrep 是 grep 的扩展,相当于 grep -E。fgrep 相当于 grep - f,用的少。用法:grep [OPTION]... PATTERN [FILE]...常用选项:-E:支持扩展正则
2022-05-18 10:56:35 1549
原创 nginx配置文件基础配置汇总
本篇主要是对nginx.conf文件的的一些基本配置的汇总,方便日后使用。还有一些比较核心的、优化等配置会在另一篇写到。目录配置文件结构全局块1.user指令2.work process指令3.其他指令events块http块1.定义MIME-Type2.自定义服务日志3.其他指令server块和location块Nginx静态资源部署1、listen指令2、server_name指令3、location指令4、设置请求资源的目录root
2022-05-16 17:42:25 3281
原创 mybatis+redis实现分布式缓存+缓存面试题
前面已经讲解过spring与redis的环境搭建,此时我们需要用到redis了,用它来实现分布式缓存的应用,这里我已经搭建好了所有的基础环境(mybatis和redis的)。一,mybatis缓存机制mybatis提供了一级、二级缓存。一级缓存:线程级别的缓存,也称为本地缓存或sqlSession级别的缓存,一级缓存是默认存在的,同一个会话中,查询两次相同的操作就会从缓存中取。 二级缓存:全局范围的缓存;除了当前sqlSession能用外,其他的也可以使用。二级缓存默认也是开启的,只需要在
2022-05-13 15:57:47 2070
原创 springboot整合redis
一,引入依赖<!-- redis 在 SpringBoot2.x 之后,原来使用的jedis 被替换为了 lettuce--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- sp
2022-05-11 21:57:47 461
原创 平衡二叉树
1.定义平衡二叉树,又称AVL树,用于解决二叉排序树高度不确定的情况,如果二叉排序树的子树间的高度相差太大,就会让二叉排序树操作的时间复杂度升级为O(n),为了避免这一情况,为最坏的情况做准备,就出现了平衡二叉树,使树的高度尽可能的小,其本质还是一棵二叉搜索树。平衡二叉树的性质:左子树和右子树的高度之差的绝对值小于等于1 左子树和右子树也是平衡二叉树为了方便起见,给树上的每个结点附加一个数字,给出该结点左子树与右子树的高度差,这个数字称为结点的平衡因子(BF)平衡因子=结点左子树的高度-
2022-05-01 12:47:37 43962 9
原创 二叉排序树
二叉排序树1.定义二叉排序树(BST),又称为二叉树搜索树和二叉查找树。定义:如果它的左子树非空,则左子树中的所有结点的值都小于根节点的值 反之,若右子树非空,则右子树上所有的结点的值都大于等于根节点的值 其左右子树本身也是二叉排序树二叉排序树该二叉树的中序遍历的结果一定是有序的,如上的中序遍历的结果为3,12,24,37,45,53,61,78,90,992.二叉排序树的操作二叉排序树有关的一些操作可以包含search查找,minimum查找最小值,maxi
2022-04-30 18:34:46 5404 6
原创 Linux通配符和正则表达式
通配符*星号,匹配任何字符 ? 问号,匹配任意一个字符 []中括号,匹配括号中的一个字符 ls 会列出当前目录下所有文件,匹配了所有的文件名,而ls a*匹配所有a开头的文件。 需要注意的是,如果当前目录下有目录名匹配成功,会列出该目录下所有文件*可以代替任意个数字符,?只能代替一个。正则表达式[:alnum:]:代表英文大小写字符及数字,即0-9,a-z,A-Z[:alpha:]:代表任何英文大小写字符,即a-z,A-Z[:blank:]:代表空格键与[Tab]按键
2022-04-29 09:10:15 365
原创 redis持久化
持久化Redis官方提供了两种持久化的方式,分别是:快照(snapshot):保存某一时刻redis中的所有数据状态,需要时恢复快照即可回到快照的状态 AOF(Append Only File)追加日志文件:将所有redis的写命令记录到日志文件中,恢复时重新执行这些日志中的命令即可快照1.特点这种方式可以将某一时刻的所有数据都写入硬盘中,当然这也是redis的默认开启持久化方式,保存的文件是以.rdb形式结尾的文件因此这种方式也称之为RDB方式。2.快照生成方式客.
2022-03-27 15:59:47 3549
原创 redis数据类型和命令合集
1、redisredis默认有16个数据库,0-15,初始默认使用0号库,使用select [编号]修改当前库。如select 6。所有的库都是统一密码验证。 dbsize查看当前数据库的key数量 flushdb清空当前库 flushall清空全部库redis使用单线程+多了I/O复用的方式工作,多个客户端和同一个服务端交互,提高效率。2、五大数据类型redis键的操作keys *:查看当前库中的所有key exists key:判断某个key是否存在,返回值为1表示存.
2022-03-26 12:02:14 739
原创 redis安装与配置
redis概述NoSql(Not Only Sql),指非关系型数据库,分布式的,且一般不保证遵循ACID原则的数据存储系统,增加了数据库的扩展能力,远超于关系型SQL的性能。应用场景:对数据高并发的读写 海量数据的读写 对数据的高可扩展性缺点是:不支持事务、不能处理比较复杂的关系redis就是一种NoSql数据库,redis的特点是:数据都在内存中,但是也支持持久化,方便备份和恢复 不仅支持key-value的形式,还支持多种数据结构:list、set、hash、zset…
2022-03-25 20:45:20 4020
原创 操作系统线程
一、引入线程操作系统有了进程为何要出现线程呢?操作系统中可以使用进程来描述一个程序的执行过程,进程拥有该程序的所有数据(包括一些I/O分配情况、内存分配情况等),也就是该程序的一个载体,所以进程有一个特点就是资源分配的单位,这一点十分重要。进程还有一个特点就是调度执行,运行、交替执行提高资源利用率……。操作系统管理进程(创建、切换进程、分配与回收……)开销是很大的,比如进程创建时还需要创建PCB,分配内存独立的内空间,建立映射表,创建资源……,进程切换时还需要切换资源,如切换对应的内存映射表,进
2022-03-09 21:53:59 1159
原创 操作系统进程详解
一、多道批处理首先从操作系统的发展史说起,先是串行操作系统,到后来的单道批处理系统,单道批处理系统即首先把多个任务放到外存里,然后再由监控程序(最早期的操作系统)从外存中一个一个的把任务放到内存中执行,单道批处理系统的问题是等待io的时间太长了,为了提高cpu资源的利用率出现了多道批处理系统,它使得多个任务能同时驻留在内存上,并发的执行这多个任务,因为在内存中存在多个任务,所以os为了能更好的去管理这些任务就出现了进程的概念,把每一个任务当做一个或多个进程来表示出来。此外多道批处理系...
2022-03-03 12:06:37 2075
原创 操作系统中断
中断中断时提高处理器效率的一种手段,如任务A需要用到打印机,打印的时间相对于cpu来说会很长,如果在打印期间死等打印机太浪费资源,所以出现了中断,cpu会先放弃该任务的执行,然后转去执行其他任务,当打印机打印好后就会发出中断信号给cpu,cpu就暂停当前任务的执行,继续运行任务A。中断的分类:程序中断 由指令执行的结果产生,如算数溢出、除数为0、试图执行非法指令 时钟中断 由处理器内部的计时器产生,运行操作系统以一定的规律执行周期性的任务 I/O中断 由I/O控制器产生
2022-02-27 20:21:05 4366
原创 Linux常用命令及知识点汇总(三)
1.计划任务1.1单一计划任务使用at命令,前提是atd服务启动,任务存在于/var/spool/at目录下,如果有/etc/at.allow文件,则只有文件中的用户才能使用at,如果只有/etc/at.deny文件,那么文件中的用户不能使用at,其余的用户可以,如果两个文件都没有则只有root才能使用at命令。at [-mld] 时间: -m:任务执行完毕,发送邮件给用户 -l:列出所有用户的at计划,相当于atq -d:取消一个在at计划中的任务,后面接任务号码,相当于atrm
2022-02-12 20:35:22 2305 3
原创 数据库事务和隔离级别 MySQL
事务概述事务是一个或一组sql语句组成的一个执行单元,这个执行单元要么全部执行成功,要么全部执行失败。用于保证数据的完整性。如账户转账,张三给李四转500,对应的sql语句应该是update张三的余额-500,并且update李四的余额+500,如果先更新完张三的数据,然后出现了异常,导致李四的余额修改不了,那么就出现数据上的问题了,应该使用事务来解决这一问题,当中间出现异常后回滚,让张三的update失效;如果没有出现异常就提交事务。通过SHOW ENGINES;查看mysql中支持的存储引
2022-02-09 16:48:45 2948 5
原创 网络编程 socket详解 TCP socket和UDP socket
概述我们在网络编程时,通常是让我们本地的应用程序和远程的应用程序进行通信,也就是分布式的进程之间的通信,比如我写的程序A和小明的程序B进行通信,我的程序运行时在本机就是一个进程,是有pid号的,小明的也是。那这两个程序是怎么通信的呢?这就要理解网络分层的概念了,网络层实现的是主机到主机之间的通信,网络层的实现是ip协议,通过各自的ip地址就能实现远程数据传输,而网络层只是保证了主机A的数据能够到达主机B,并不能够识别和发送到对应的进程,而传输层实现的是进程到进程的通信,对网络层的功能进行了加强,能够
2022-02-08 20:32:17 13308 1
原创 Linux网络配置
虚拟机的网卡配置:桥接模式:表示虚拟机用物理机的真实网卡,不仅能和本机通信,而且还可以和在同一个局域网的其他真实计算机通信,缺点会占用真实网段的ip地址 nat模式:默认通过vmnet8这个虚拟网卡和本机通信,不能和局域网的其他真实计算机通信,但如果本机联入了internet,虚拟机也会跟着能够访问internet 仅主机模式:默认通过vmnet1这个虚拟网卡和本机通信,不能连接internet查看ip:使用ifconfig命令或ip addr命令查询ip地址。Centos7网卡.
2022-02-07 19:52:32 899
原创 Linux常用命令及知识点汇总(二)
1.Linux文件系统1.1存储结构linux文件的存储方式为inode:记录文件的属性(权限,大小,拥有者,时间),并且记录该文件在数据区分配的数据区的区块号 数据区块:记录真正的数据,大文件占用多个区块 超级区块:记录文件系统整体信息,inode与数据区的总量、使用量目录也是一样的也有inode,但是目录数据区的内容如下所以文件的名字是存在目录中的,inode本生不记录文件名。使用ls命令时加上-i可查看文件和目录对应的inode1.2挂载点每个文件系统都.
2022-02-02 11:53:18 1685 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人