1.linux
ln source_filepath dest_filepath //创建实体链接,指向inode
ln -s source_filepath dest_filepath //创建符号链接,类似快捷方式
od filepath //查看文件的16禁止信息
cat vs tac
cat filename |grep xxx
head //取得头几行
tail // 取得尾几行
which -a java //查找所有java命令的位置
find . -name 'filename"
//压缩
gzip [-cdtv#] filename
-c: 将压缩的数据输出到屏幕
-d: 解压缩
-t: 检验
-v: 显示压缩比等信息
-#: #为数字,表示压缩等级,最大为6
bzip2 [-cdkzv#] filename
-k: 保留源文件
xz [-dtlkc#] filename
//打包
tar -jtv filename.
echo $LANG
version=$(uanme -r)
echo $version //3.1.4-340.x86_64
declare [-aixr] variable
-a: 定义数组类型
-i: 定义为整数类型
-x: 定义为环境变量
-r: 定义为readonly 类型
标准错误输出(stderr) 2>
e.g. find ./ -name .bashrc > list 2>&1
//管道命令,将一个命令的标准输出作为另外一个命令的标准输入,在数据需要经过多个步骤的处理之后才能得到我们想要的内容时就可以使用管道;使用 | 作为标识符
ls -al /etc | less
//提取指令
cut
-d: 分隔符
-f: 经过-d分隔后,使用-f n 取出第n各区间
-c: 以字符为单位取出区间
ll /etc | cut -d ' ' -f 1
export | cut -d ' ' -f 3- //裁剪出第三个切割出来的部分的所有
sort
-f: 忽略大小写
-b: 忽略最前面的空格
-M: 一月份的名字来排序
-n: 使用数字
-r: 反向排序
-u: 重复内容仅出现一次
-t: 分隔符
-k: 指定排序的区间
cat /etc/passwd | sort -t ':' -k 3
export | cut -d ' ' -f 3 | sort -f
//双向输出重定向
tee -a file //增加了屏幕显示
tr -ds SET1
-d: 删除行中SET1这个字符串或替换
export | cut -d ' ' -f 3 | tr '=' ':'
col [-xb] //将tab字符转换为空格字符
expand [-t] file
//将tab转换为一定数量的空格
//将有相同数据的那一行合并起来
join [-ti12] file1 file2
-t :分隔符,默认为空格
-i: 忽略大小写的差异
-1: 第一个文件所用的比较字符
-2: 第二个文件所用的比较字符
paste [-d] file1 file2
-d: 分隔符,默认为tab
//将2行粘贴在一起
//将一个文件分成多个文件
split [-bl] file PREFIX
-b: 以大小来区分
-l: 以行数来区分
- PREFIX: 分区文件的前导名称
//正则表达式
grep [-acinv] [--color=auto] 字符串 filename
-c: 统计匹配到行的个数
-i: 忽略大小写
-n: 输出行号
-v: 反向选择
--color=auto :找到关键字就加颜色显示
//格式化输出
printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt)
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33
ps -l //查看自己进程
ps aux //查看系统所有进程
ps aux | grep xxx //查看特定进程
pstree -A //查看所有进程树
netstat -anp | grep port //查看
//进程状态
1.就绪
2.执行中
3.不可中断阻塞
4.可中断阻塞
5.僵死,进程已执行完毕但未被其父进程获取信息
6.结束
SIGCHLD
当一个子进程改变了它的状态时(停止运行,继续运行或退出),父进程会得到其SIGCHLD信号,waitpid或wait调用会返回
孤儿进程:父进程退出,子进程还在运行,其将被init进程(进程号为1)收养,并由init进程对它们完成状态收集工作
僵死进程:子进程退出,但其进程描述符仍未释放,将其父进程杀死,其就变成了孤儿进程;
2.消息队列
发布-订阅模式
异步处理
流量削峰
应用解耦
发送端的可靠性:一定能将消息成功发送至消息队列中;
接收端的可靠性:一定能从消息队列成功消费消息,且保证消息消费的幂等性;
## 3.缓存
缓存命中,某个请求通过缓存得到响应;
缓存淘汰策略:FIFO,LRU,LFU
分布式缓存:服务器集群均可以访问分布式缓存,而本地缓存需要在服务器集群间进行同步;
CPU多级缓存
CDN:内容分发网络,利用离用户较近的服务器返回用户的静态资源请求;
缓存穿透:对不存在的数据缓存一个空数据;对该类请求进行过滤
缓存雪崩:合理设置缓存过期时间;是同分布式缓存,每个节点仅缓存部分数据,当某个节点宕机时可以保证其他节点的缓存仍然可用;缓存预热;
缓存一致性:在数据更新同时立即更新缓存
读取缓存前判断缓存是否是最新的,不是则更新;
因此缓存最好仅放置一些对一致性要求不高的数据;
数据分布:
哈希分布:hash(key)%N
顺序分布(推荐,提高空间利用率,保持原有顺序): 1-1000, 1001-2000
一致性hash:先对缓存服务器ip进行hash后放置在环中,对资源唯一名称进行hash后将其缓存至顺势针第一台服务器上;
4.集群
负载均衡:
高可用:某个节点故障时,负载均衡会将用户请求转发到另外的节点上,从而保证所有服务持续可用;
伸缩性:根据系统整体负载情况,可以很容易地添加或移除节点;
负载均衡算法
1.轮询
2.加权轮询
3.最少连接
4.加权最少连接
5.随机算法
6.源地址哈希法
响应时间;
吞吐量;
并发用户数;
集群;
缓存;
异步;
伸缩性;
扩展性
5. Java
GBK: 中文2字节,英文1字节;
UTF-8: 中文3字节,英文1字节;
NIO实现IO多路复用中的Reactor模型,一个线程Thread使用一个选择器通过轮询的方式去监听多个通道Channel上的事件,从而让一个线程可以处理多个事件;
虚拟机栈:栈帧(局部变量表,操作数栈,常量池引用)
方法区:类信息,常量,静态变量,即时编译器编译后的代码;
GC Roots:虚拟机栈中局部变量表的引用;
本地方法站中JBI 中引用的对象;
方法区中静态属性引用;
方法区中常量引用的对象;
方法区回收:对常量池的回收或对类的卸载:
(1)该类所有实例均已被回收且未被引用
(2)该类的ClassLoader已被回收
(3)该类Class对象未被反射引用
新生代:eden + s0 + s1
老年代:tenured
永久代:permanent
内存分配策略:
(1)对象优先在eden区分配
(2)大对象直接进入老年代
(3)长期存活对象进入老年代
(4)空间分配担保,检查老年代最大可用连续空间是否大于新生代所有对象之和,若成立,则说明Minor GC是安全的;
类加载:
加载 - 校验 - 隐式初始化 - 设置对象头(GC分代年龄,线程持有锁,线程偏向id) - 显式初始化
GC Roots:方法区中对象,常量,栈帧中局部变量表或JNI中引用的对象;
Serial:串行,效率高;新生代标记复制,老年代标记整理
ParNew:Serial的多线程版本;
Parallel Scavenge:同ParNew,吞吐量优先;
Serial Old:Serial的老年代版本
CMS:concurrent Mark Sweep 初始标记(停顿)-》并发标记-》重新标记-》并发清除
无法处理浮动垃圾(并发清除节点用户新产生的垃圾)
G1:手机范围包括新生代以及老年代;
初始标记 -》并发标记 -》最终标记(修正并发标记阶段用户修改的标记记录(Remember Set中)) -》 筛选回收
(标记-整理)
类加载时机:new,newInstance(),SecurityContext.getContextHolder();
类相等:类本身相等,使用同一个类加载器进行加载;
基础线程机制:
CachedThreadPool
FixedThreadPool
SingleThreadExecutor
Thread.sleep() 不会释放锁
Thread.yield()表明当前线程已完成生命周期中最重要的部分,可以切换给其他线程来执行;
synchronized :非公平
ReentrantLock :默认非公平锁,可选择公平锁,需自行释放锁
在线程中调用另外一个线程的join方法,会将当前线程挂起,直到目标线程结束;
Semaphore
CyclicBarrier
CountDownLatch
LinkedBlockingQueue
ArrayBlockingQueue
PriorityBlockingQueue
ForkJoin:运用于并行计算中,将大的计算任务拆分成多个小任务并行计算;
volatile:保证变量可见性;禁止指令重排序;
主内存 - 工作内存 - Thread
内存三大特性:
原子性:AtomicInteger, synchronized, monitorenter monitorexit
可见性:volatile
有序性:volatile禁止指令重排序
CAS:乐观锁冲突检测(内存地址V,旧的预期值A,新值B,仅当内存地址中V的值 == A,才将V更新为B)
ABA问题:AtomicStampedReference
ThreadLocal 个各线程拥有各自的本地存储地址;
存在内存泄漏情况,即该线程完成工作后需要手动调用remove
锁优化:
自旋锁:让一个线程在请求一个共享数据时自选一会看看能不能拿到锁,否则进入阻塞状态;
锁消除:比如逃逸分析出来的私有数据就无需上锁
锁粗化:将连续的细小的上锁操作合并成一个较粗的上锁操作;
轻量级锁:
无锁 - 偏向锁 - 轻量级锁 - 重量级锁
偏向锁:某一线程获取该锁后就无需在进行同步操作
容器:
Collection
Set: TreeSet; HashSet;LinkedHashSet
List:ArrayList,Vector,LinkedList
Queue:LinkedList;PriorityQueue
Map:TreeMap,HashMap,HashTable,ConcurrentHashMap,LinkedHashMap
ArrayList:默认大小为10,扩容 oldCapacity + (oldCapacity >> 1)
Fail-Fast
modCount用于记录ArrayList结构发生变化的次数,结构发生拜年话是指添加或删除至少一个元素的所有操作,或者调整内部数组的大小;
Vector 扩容变为原来的2倍
Collectioins.synchronizedList(list); //包装类模式
CopyOnWriteArrayList
//写操作在一个复制的数组上进行,且需上锁,适合读多写少
HashMap:
y%x = y&(x - 1)
capacity: 16
threshold: 当size>=threshold时进行扩容操作
loadFactor: threshold = capacity * loadFactor
扩容时扩为原来的2倍;
ConcurrentHashMap 采用分段锁,每个分段维护者几个桶,多个线程可以访问不同分段的桶,从而使得并发度变得更高;
LinkedHashMap本身已经实现了LRU功能
afterNodeAccess();
afterNodeInsertion();
springboot启动流程:
new SpringApplication()
SpringApplication.run()
启动监听器模块
配置环境模块
ConfigurableApplicationContext应用上下文模块
创建应用上下文-》基本属性配置-》更新应用上下文
无锁-》偏向锁-》轻量级锁-》自旋锁-》适应性自旋锁
锁消除,锁粗化
ReentrantLock:等待可中段 lock.lockInterruptly()
支持公平锁
并发编程:原子性,可见性,有序性
ThreadLocal -> ThreadLocalMap
线程池号处:提高响应速度;降低资源消耗;提高线程可管理性
Executors.fixedThreadPool()//请求队列不限长 OOM, 阻塞队列为链表实现
Executors.cacheThreadPool();//请求队列不限长 OOM, 阻塞队列为链表实现
Executors.singleThreadExecutor();//请求队列不限长 OOM, 阻塞队列为链表实现
ThreadPoolExecutor
corePoolSize: 核心线程数,最小可同时运行的线程数量
workQueue:若当前运行的线程数量是否达到核心线程数,则放入队列中
maximumPoolSize: 当阻塞队列的任务满时,将同时运行的线程数变为该值
keepAliveTime:若此时没有新任务提交,核心线程外的线程不会立即销毁,而是会等待,知道等待时间超时
threadFactory:如何创建一条线程
handler:全满了后的策略
Abort:拒绝,抛异常
Caller:自己线程运行任务
Discard:丢弃
Discard:丢弃最早未处理的
AbstractQueuedSynchronizer
Semqphore ->资源同步
CountDownLatch.await() ->线程同步
CompletableFuture
模板模式
6. mysql
6.1.常识
B+树相比红黑树有更低的树高,进行寻道的次数与树高成正比,在同一个磁盘块上进行访问只需要很短的磁盘旋转时间,因此B+树更适合磁盘数据的读取;
B+树索引,无需对全表进行扫描,仅需对树仅需搜索,适用于全键值,键值范围和键最左前缀查找;
主索引(聚簇索引):叶子节点data域记录着完整数据记录;
辅助索引:叶子节点的data域记录着主键的值,因此使用辅助索引进行查找时,需要先查找到主键值,然后再到主索引中进行查找;
自适应哈希索引:当某个索引值使用的非常频繁时,会在B+Tree索引上再创建一个哈希索引,因此可以更快;
全文索引:查找文本中关键词
6.2.索引优化
(1)在进行查询时,索引列不能时表达式的一部分,也不能是函数的参数,否则无法使用索引;
(2)多列索引
(3)索引列的顺序
(4)前缀索引
(5)覆盖索引
6.3.索引优点
(1)减少服务器扫描的数据行数
(2)帮助服务器避免进行排序分组,以及创建临时表(排序,分组过程中创建);
(3)将随机IO变为顺序IO
6.4.适用
小表:全表扫描
中标:索引
特大表:建立和维护索引代价较高;
explain使用:
select_type:查询类型,简单查询,联合查询,子查询;
key:使用的索引
rows:扫描的行数
6.5.查询优化
1.减少请求的数据量 -》 仅返回必要的数据
2.减少服务端扫描的行数 -》 使用索引
3.切分大查询 -》使用循环
4.分解大连接查询 -》 将一个大连接查询分解成对每一个表进行依次单表查询,然后再应用程序中进行关联;
6.6.存储引擎
InnoDb:默认事务型存储引擎,默认可重复读,通过MVCC + Next-Key Locking 防止幻读;
主索引为聚簇索引;优化了可以从磁盘中读取数据时采用可预测读,并拥有自适应哈希索引;支持在线热备份;
MyISAM:提供压缩表,空间数据索引等功能,不支持事务,不支持行级锁,
事务:InnoDB
并发:InnoDb支持行级锁,MyISAM表级锁
外键:InnoDb支持外键
备份:InnoDb支持在线热备份
崩溃恢复:MyISAM恢复速度较慢;
其他:MyISAM支持压缩以及空间数据索引;
6.7.数据类型
datetime:8字节
timestamp:4字节
6.8.切分
水平切分:将表的一些数据分布到集群不同节点上;
垂直切分:将一张表切分成多张表;
Sharding策略:
哈希取模:hash(key)%n
范围:可以是id范围或时间范围
映射:使用一个单独数据库来存储映射关系;
6.9.复制
主从复制:
binlog线程:将主服务器上数据修改写入二进制日志中
I/O线程:从主服务器中读取二进制日志,并写入从服务器的中继日志;
SQL线程:负责读取中继日志,解析出主服务器已经执行的数据更改并在从服务器中重放;
6.10.语法
6.10.1.常用函数
//汇总函数
in:用于子查询
concat:连接,若有一端为null,则直接为null;
avg(): 返回某列平均值
count(): 返回某列的行数
max() : 返回某列的最大值
min() :某列最小值
sum():某列和
//文本处理
left():左边字符
right():右边字符
lower():转为小写
upper():转为大写
ltrim():去除左边的空格
rtrim():去除右边空格
length():长度
soundex();转为语音值
//日期和时间处理
adddate();//增加一个日期
addtime();//增加一个时间
curdate();//当前时间
date();//日期
datediff();//日期之差
date_add();//灵活的日期运算函数
date_format();//返回格式化的日期或时间串
day();//返回一个日期的天数部分
dayofweek();//对于一个日期,返回对应的星期几
hour();//返回一个时间的小时部分
minute();//分钟部分
month();//月份部分
now();//但钱日期时间
second();;//秒
time();//时间
year();//年
//数学
sin();
cos();
tan();
abs();
sqrt();
mod();
exp();
PI();
RAND();
//子查询
子查询中仅能返回i一个字段的数据
select * from t where c1 in (select c2 from t2);
select cust_name, (select count(*) from orders where orders.cust_id = customers.cust_id) as orders_num from customers order by cust_name;
//内连接
inner join xxx on xxx=xxx
select A.value, B.value from t as a inner join t as B on A.key = B.ley;
//自连接
select name from employee where department = ( select department from employee where name = “Jim”);
select e1.name from employee as e1 inner join employee as e2 on e1.department = e2.department and e2.name = “Jim”;
//自然连接
select A.value, B.value from tablea as A natural join tableb as B;
//外连接
左外连接:保留左表
left outer join
右外连接:保留右表
right outer join
//组合查询
union:默认去除相同行
union all:暴露相同行
//视图
create view as select * from mytable;
(1)简化复杂连接
(2)仅使用实际表中一部分数据
(3)通过加权限保证数据安全性
//存储过程,一系列SQL操作批处理;
代码封装
代码复用
预编译,高性能
//游标
(1)声明游标
(2)打开游标
(3)取出数据
(4)关闭游标
//触发器
触发器会在某个表执行delete,insert,update时自动执行;
before:数据验证和净化
after:审计跟踪
create trigger xxx after insert on mytable for each row select NEW.col into @result;
select @result;
delete触发器包含一个名为OLD的虚拟表,且仅是可读的;
update触发器包含一个名为NEW和一个名为OLD的虚拟表,其中NEW是可以被修改的,而OLD仅是只读的;
MYSQL不允许再触发器过程中使用CALL语句;
//事务
事务;回滚;提交;
保留点:事务中设置的临时占位符,可对其发布回退;
myql默认事务(autocommit为1)
start transaction
save point1
save point2
commit/rollback to savepoint1
//字符集
create table t (col varchar(10) charset set latin collate latin1_general_ci) default character set hebrew collate hebrew_general_ci;
//可在排序,分组时指定校对
select * from t order by col collate latin1_general_ci;
//创建账号
select * from mysql.user;
create user liyuan IDENTIFIED BY ‘123456’;
//修改账号名
rename user liyuan to yuanxi;
//删除账号
drop user liyuan;
//查看权限
show grants for liyuan;
//授予权限
grant select, insert on mydb.* to liyuan;
//删除权限
revoke
revoke all/grant all
//修改密码
set password for liyuan = password(‘123456’);
7.0.数据库原理
ACID
丢失修改:
脏读:
不可重复读
幻读:
两段封锁协议
第一范式:属性不可分
第二范式:非主属性依赖于键码
第三范式:非主属性不传递函数依赖于键码
8.Spring
8.1.spring
SecurityContextHolder
SecurityContextHolderStrategy策略
SecurityContextHolderStrategy实现
ThreadLocalSecurityContextHolderStrategy -》存在ThreadLocal中
InheritableThreadLocalSecurityContextHolderStrategy -》 同ThreadLocalMap
GlobalSecurityContextHolderStrategy-》static SecurityContext
Ioc:从容器中获取对象实例
aop: 代理
spring aop:运行时增强
aspectJ aop:编译时增强
singleton
prototype
session
request
global-session
单实例bean不安全
@Configuration ->@Bean -> 标注在方法上
bean
生命周期
反色实例化->对象属性->Aware -> BeanPostProcessor前置处理 >InitializingBean -> init-method - BeanPostProcessor后置处理 ->注册相关销毁时回调接口 -> 使用 ->DispableBean -> destroy
8.2.spring mvc
(1)Dispatcher
(2)接口名找到 HandlerMapping
(3)解析到 Controller中
(4)调用相应方法
(5)ModelAndView
(6)ViewResolver
spring中的设计模式
(1)工厂模式 (BeanFactory)
(2)代理
(3)单例
(4)模板
(5)包装器
(6)观察者
(7)适配器
事务:
//遇到运行时或非运行时异常均回滚;
@Transactional(rollbackFor = Exception.class)
TransactionDefinition.PROPAGATION_SUPPORTS:若当前存在事务,则加入当前事务;
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,若当前存在事务,则挂起当前事务
TransactionDefinition.PROPAGATION_NEVER :以非事务的方式运行,若当前存在事务,则抛出异常
TransactionDefinition.PROPAGATION_REQUIRED:当前存在事务,加入
TransactionDefinition.PROPAGATION_REQUIRES_NEW:当前存在事务,新开事务,且相互独立,互不打扰
TransactionDefinition.PROPAGATION_NESTED:但钱存在事务,则创建一个事务作为当前事务的嵌套事务,且新开的事务相互独立;
TransactionDefinition.PROPAGATION_MANDATORY:当前存在事务,加入,否则,抛出异常;
8.3.springboot
(1)springboot使用了SPI的方式,开启时自动扫描META-INF/spring.factories文件,将文件中配置类型信息加载到spring容器,并执行类中定义的各种操作。
(2)@EnableAutoConfiguration: 启用springboot自动装配机制
@COnfiguration: 运行在上下文中注册额外的bean胡导入其他配置类
@ComponentScan: 扫描被@Component及其派生注解标注的bean,注解默认会扫描启动类所在包下的所有类, 可以自定义扫描某些bean, 容器将排除TypeExcludeFilter, AutoConfigurationExcludeFilter
springboot在执行扫描过程中,会使用TypeExcludeFilter进行过滤
,要想重写过滤规则,仅需继承该类重写match方法加入容器即可