mysql数据库总结
事务和ACIDmysql只有在InnoDB引擎下是支持事务的,MyISAM是不支持事务的。
事务具有ACID(原子性,一致性,隔离性,持久性)
原子性 + 隔离性 + 持久性 是为了满足一致性
只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A、I、D 是手段,C 是目的!
无并发时,只需要保证原子性就能满足一致性
有并发时,还需要保证隔离性才能满足一致性
持久性是为了应对数据库宕机的情况
事务的隔离级别MySQL有四种事务隔离级别:读未提交,读提交,可重复读,序列化。(可重复读是默认的隔离级别)
对应事务会发生的问题有三种:脏读,不可重复读,幻读(都发生在多线程下)
三种问题含义如下
脏读:事务A读到的num数据,是事务B修改后还没提交的数据
丢失修改(Lost to modify):ab事务都访问了同一数据,在a事务中修改了这个数据后,b事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。
不可重复读:事务A读到的num数据后,事务B修改了num数据并提交,A此时再读num会发生和第一次读不一致的情况
幻读:和不可重复读类似, ...
redis数据库总结
Redis有哪几种数据结构redis一共有5中基本数据结构和4中高级数据结构
string类型
redis的所有的key都是string类型,对于值也可以存储为string类型。
string类型是以二进制存储的,所以它也可以存储图片、音视频等转换后的数据。
List类型
lis类型可以当作一个简易的消息队列使用,但是无法提供消息的成功消费、多次消费的功能
Set类型
redis的set类型类似于java中的set类型,他的数据也是不可重复的,但是在求并集交集等操作方面有较好的实现
ZSet类型
是一种排序的set类型,他为每一个set新增了一个score分数,set中的数据按照分数排序。
zset的底层数据结构是跳表,类似于一种树,有链表构成的树。用一倍的空间,换取了logn的查询复杂度
Map类型
Map类型和java中的hashmap基本一致
HyperLogLog类型
用概率论的算法统计网站的UV和PV,数据量高时,准确率很高
GEO
记录地理信息,经纬度
BitMap
32位的二进制,可以做签到等逻辑
stream
一种加强的消息队列数 ...
项目分布式扩展
1.背景和计划为了提升项目的健壮性,决定分多个服务器部署,并做好数据库主从备份和引入部分springcloud组件加强项目的实际使用性能
此次提升计划将所有中间件都部署于docker容器中,一是为了简便开发,二是以后方便如果日后引入k8s管理
又购买了一个2g4g的服务器,和之前2核4g服务器一起部署
2.分布式数据库2.1 mysql2.1.1 安装MySQL新服务器安装mysql,具体实现移步另一篇文章:docker安装部署中间件
2.1.2 主节点的mysql配置12345678910111213141516171819202122232425262728293031323334#安装vim编辑器yum -y install vim#修改配置文件vim cat /etc/my.cnf#增加下面加航log-bin=mysql-binbinlog_format=mixedserver-id = 1innodb-file-per-table =ONskip_name_resolve=ON#配置完成后,需要重启mysql服务使其修改的配置文件生效,使用如下命令使mysql进行重启 ...
java虚拟机总结
jvm内存模型GC回收算法GC回收器有哪些双亲委派类加载机制
算法训练——递归
递归1.树的遍历1497. 树的遍历 - AcWing题库
一个二叉树,树中每个节点的权值互不相同。
现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。
输入格式
第一行包含整数 N,表示二叉树的节点数。
第二行包含 N个整数,表示二叉树的后序遍历。
第三行包含 N 个整数,表示二叉树的中序遍历。
输出格式
输出一行 N 个整数,表示二叉树的层序遍历。
数据范围
1≤N≤30官方并未给出各节点权值的取值范围,为方便起见,在本网站范围取为 1∼N
输入样例:
12372 3 1 5 7 6 41 2 3 4 5 6 7
输出样例:
14 1 6 3 5 7 2
代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081import java.io.BufferedReader;import java.io.IOException; ...
java并发编程总结
Java中有哪些锁
悲观锁和乐观锁
悲观锁和乐观锁只是一种感念
悲观锁:认为资源一定会发生多线程冲突,所以每次操作都会上锁。
乐观锁:认为资源不会被其他线程所修改,不上锁。使用volatile与CAS机制配合使用,也可以加版本号。
这种概念在mysql数据库中也经常使用,乐观锁:mysql添加一列版本号的字段。
独享锁和共享锁
独享锁和共享锁只是一种感念
独享锁:只让本线程持有这把锁
共享锁:允许多个线程持有这把锁
如ReentrantReadWriteLock,通过实现AQS的不同实现方法来实现想要的效果
互斥锁和读写锁
是独享锁和共享锁的具体实现
读写锁的具体实现是ReadWriteLock
可重入锁
允许一个线程多次获得一把锁
加锁是state + 1,释放锁时state - 1,为0则完全释放锁
也是一种不同的实现AQS方式
分段锁
concurrentHashMap,用Segment分段,默认16段,后优化为每个节点一段
公平锁和非公平锁
公平锁:来了的线程都去阻塞队列排队
非公平锁:新来的线程有机会去抢夺锁资源,失败则取排队
偏向锁,轻量级锁和重量级 ...
算法训练——递推
递推1.砖块3777. 砖块 - AcWing题库
n个砖块排成一排,从左到右编号依次为 1∼n。
每个砖块要么是黑色的,要么是白色的。
现在你可以进行以下操作若干次(可以是 00 次):
选择两个相邻的砖块,反转它们的颜色。(黑变白,白变黑)
你的目标是通过不超过 3n 次操作,将所有砖块的颜色变得一致。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据第一行包含一个整数 n。
第二行包含一个长度为 n的字符串 s。其中的每个字符都是 W 或 B,如果第 i个字符是 W,则表示第 i号砖块是白色的,如果第 i 个字符是 B,则表示第 i 个砖块是黑色的。
输出格式
每组数据,如果无解则输出一行 −1−1。
否则,首先输出一行 k,表示需要的操作次数。
如果 k>0,则还需再输出一行 k 个整数,p1,p2,…,pk。其中 pi 表示第 i 次操作,选中的砖块为 pi和 pi+1 号砖块。
如果方案不唯一,则输出任意合理方案即可。
数据范围
1≤T≤102≤n≤200
输入样例:
12345678948BWWWWWWB4BWBB5WWWWW3BWB
输出样例: ...
算法训练——双指针
双指针1.字符串删减3768. 字符串删减 - AcWing题库
给定一个由 n 个小写字母构成的字符串。
现在,需要删掉其中的一些字母,使得字符串中不存在连续三个或三个以上的 x。
请问,最少需要删掉多少个字母?
如果字符串本来就不存在连续的三个或三个以上 x,则无需删掉任何字母。
输入格式
第一行包含整数 n。
第二行包含一个长度为 n 的由小写字母构成的字符串。
输出格式
输出最少需要删掉的字母个数。
数据范围
3≤n≤100
输入样例:
126xxxiii
输出样例:
11
代码
1234567891011121314151617181920212223242526272829303132import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/** * 3768. 字符串删减 * https://www.acwing.com/problem/content/3771/ * * @author yangxiaozhuo * @date 2023/02/ ...
算法训练——二分
二分1.一维常见题789. 数的范围 - AcWing题库
给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。
对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 00 开始计数)。
如果数组中不存在该元素,则返回 -1 -1。
输入格式
第一行包含整数 n 和 q,表示数组长度和询问个数。
第二行包含 n 个整数(均在 1∼100001∼10000 范围内),表示完整数组。
接下来 q 行,每行包含一个整数 k,表示一个询问元素。
输出格式
共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。
如果数组中不存在该元素,则返回 -1 -1。
数据范围
1≤n≤1000001≤q≤100001≤k≤10000
输入样例:
123456 31 2 2 3 3 4345
输出样例:
1233 45 5-1 -1
代码
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 ...
算法训练——差分
差分1.一维模板题797. 差分 - AcWing题库
输入一个长度为 n 的整数序列。
接下来输入 m个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r]之间的每个数加上 c。
请你输出进行完所有操作后的序列。
输入格式
第一行包含两个整数 n 和 m。
第二行包含 n 个整数,表示整数序列。
接下来 m 行,每行包含三个整数 l,r,c,表示一个操作。
输出格式
共一行,包含 n 个整数,表示最终序列。
数据范围
1≤n,m≤1000001≤l≤r≤n−1000≤c≤1000−1000≤整数序列中元素的值≤1000
输入样例:
123456 31 2 2 1 2 11 3 13 5 11 6 1
输出样例:
13 4 5 3 4 2
代码
12345678910111213141516171819202122232425262728293031323334353637383940414243import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReade ...