PS:带图的,观察图,理解结构。
-------------------------------------------------------------------
1、TCP/IP协议
2、Java的集合类
主要由两个接口派生而出:Collection和Map,
Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。
3、数据库事物/spring事物
Read uncommitted | 读未提交 | 产生脏读 |
Read committed | 读提交 | 产生不可重复读 |
Repeatable read | 重复读 | 出现幻读 |
Serializable | Serializable 序列化 | 可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用 |
4、分布式锁:
数据库乐观锁增加版本号;
数据库排他锁末尾增加“ for update”(不建议使用);
Redis 分布式锁,基于 SETNX、EXPIRE;
Zookeeper 分布式锁,很少使用,略。
5、Session 共享机制:
使用分布式缓存方案比如 Memcached、Redis 进行存储session数据,进行共享。
6、线程状态图:
//再来段朋友总结的:
MySQL考点
一、MySQL基础
MySQL数据类型
整形:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,属性UNSIGNED
长度:可以为整数类型指定宽度,例如:INT(11),对大多数应用是没有意义的,它不会限制值得合法范围,只会影响显示字符的个数。
实数类型:FLOAT、DOUBLE、DECIMAL
DECIMAL可以存储比BIGINT还大的整数;可以用于存储精确的小数
FLOAT和DOUBLE类型支持使用标准的浮点进行近似计算
字符串类型:VARCHAR、CHAR、TEXT、BLOG
VARCHAR类型用于存储可变长字符串,它比定长类型更节省空间
VARCHAR使用1或2个额外字节记录字符串的长度,列长度小于255字节,使用1个字节表示,否则用2个
VARCHAR长度,如果存储内容超出指定长度,会被截断
CAHR是定长的,根据定义的字符串长度分配足够的空间
CHAR会根据需要采用空格进行填充以方便比较
CHAR适合存储很短的字符串,或者所有值都接近同一个长度
CHAR长度,超出设定的长度,会被截断
对于经常变更的数据,CHAR比VARCHAR更好,CHAR不容易产生碎片
对于非常短的列,CHAR比VARCHAR在存储空间上更有效率
只分配真正需要的空间,更长的列会消耗更多的内存
尽量避免使用BLOB/TEXT类型,查询会使用临时表,导致严重的性能开销
枚举:
有时可以使用枚举代替常用的字符串类型
把不重复的集合存储成一个预定义的集合
非常紧凑,把列表值压缩到一个或两个字节
内存存储的是整数
尽量避免使用数字作为ENUM枚举的常量,易混乱
排序是按照内部存储的整数进行排序
枚举表会使表大小大大减小
日期和时间类型
尽量使用TIMESTAMP,比DATETIME空间效率高
用整数保存时间戳的格式通常不方便处理
如果需要存储微秒,可以使用bigint存储
列属性:
auto_increment、default、not null、zerofill
MySQL基础操作
MySQL的链接和关闭:mysql -u -p -h -p;
MySQL存储引擎
InnoDB表引擎:默认事务型引擎,最重要最广泛的存储引擎,性能非常优秀,数据存储在共享表空间,可以通过配置分开,对主键查询的性能高于其他类型的存储引擎,内部做了很多优化,从磁盘读取数据时自动在内存构建hash索引,插入数据时自动构建插入缓冲区。可以通过一些机制和工具支持真正的热备份。支持崩溃后的安全恢复。支持行级锁,支持外键。
MyISAM表引擎:5.1版本前,MyISAM是默认的存储引擎,拥有全文索引、压缩、空间函数。不支持事务和行级锁,不支持崩溃后的安全恢复。表存储在两个文件,MYD和MYI。设计简单,某些场景性能很好。
MySQL锁机制
共享锁和排他锁,其实就是读锁和写锁
读锁:共享的,不堵塞,多个用户可以同时读一个资源,互不干扰
写锁:排他的,一个写锁会阻塞其他的写锁和读锁,这样可以只允许一个人进行写入,防止其他用户读取正在写入的资源。
锁粒度:表锁,系统性能开销最小,会锁定整张表,MyISAM使用表锁
InnoDB实现行级锁
MySQL事务处理、存储过程、触发器
同一个事务,由多种存储引擎不靠谱,在非事务的表上执行事务操作MySQL不会发出提醒,也不会报错
存储过程:
为以后的使用而保存的一条或多条MySQL语句的集合
存储过程就是业务逻辑和流程的集合
可以再存储过程中创建表,更新数据,删除等等
使用场景:
通过把处理封装在容易使用的单元中,简化复杂的操作
保证数据的一致性
简化对变动的管理
触发器提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程
使用场景:
可以通过数据库中的相关表实现级联更改
实时监控某张表中的某个字段得更改而需要作出相应的处理
某些业务编号的生成等
滥用会造成数据库及应用程序的维护困难
二、创建高性能索引
MySQL索引的基础和类型
索引可以大大减少服务器需要扫描的数据量
帮助服务器避免排序和临时表
将随机I/O变顺序I/O
大大提高查询速度,降低写的速度,占用磁盘
普通索引
唯一索引
主键索引:不允许有控制
组合索引
外键索引
全文索引
MySQL索引的创建原则
1.最适合索引的列是出现在WHERE子句的列
2.索引列的基数越大,索引的效果越好
3.对字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间
例:alter table x_test add index(x_name(1));
4.根据情况创建复合索引,复合索引可以提高查询效率
5.避免创建过多索引,索引会额外占用磁盘空间,降低写操作效率
6.主键尽坑你选择较短的数据类型,可以有效减少索引的磁盘占用提高查询效率
MySQL索引的注意事项
1.复合索引遵循前缀原则
2.like查询,%不能在前,可以使用全文索引
3.column is null 可以使用索引
4.如果MySQL估计使用索引比全表扫描更慢,会放弃使用索引
5.如果or前的条件中的列有索引,后面的没有,索引都不会被用到
6.列类型是字符串,查询时一定要给值加引号,否则索引失效
三、MySQL编写
四、MySQL优化
查找分析查询速度慢的原因
1.用pt-query-digest工具分析慢语句
2.show profile: set profiing=1;开启
3.exlpain
优化查询过程中的数据访问
1.用limit解决不需要查询的数据
2.尽量不要返回全部列
3.开启缓存
优化长难的查询语句
分解关联查询
优化特定类型的查询语句
count(*)会忽略所有列
增加汇总表
确定on或者using子句的列上有索引
增加ORDER BY NULL,MySQL不会再进行文件排序
正则
一、单字符
范围内字符:单个字符[]
数字字符:[0-9],[259]
小写字符:[a-z]
大写字符:[A-Z]
范围内字符:反向字符^
取反:[^0-9],[^0]
任意字符
代表任何一个字符:’.’
注意与’[.]’和’\.’的区别
在中括号是代表点,在反义字符后
对任一特殊字符使用反斜杠,即可对其转义并使之按字面解释,例如:
• \\(对反斜杠转义)
• \[(对中括号转义)
• \{(对花括号转义)
• \.(对点转义)
二、其他符号
边界字符:头尾字符
^:^root 注意与[^]的区别
$:false$
空行的表示:^$
元字符(代表普通字符或特殊字符)
\w:匹配任何字类字符,包括下划线([A-Za-z0-9])
\W:匹配任何非字类字符。([^A-Za-z0-9])
\b:代表单词的分隔
三、字符组合
字符串
‘root’ ‘1000’ ‘m..c’ ‘[A-Z][a-z]’ ‘[0-9][0-9]’
重复
*:零次或多次匹配前面的字符或子表达式
+:一次或多次匹配前面的字符或子表达式
?:零次或一次匹配前面的字符
重复特定次数:{n,m}
*:{0,}
+:{1,}
?:{0,1}
四、字符组合
任意字符串的表示:.*
例如:^r.* m.*c
注意与m..c区别
逻辑的表示
|:’/bin\(false\|true\)’
五、案例
匹配4-10位的qq号
‘^[0-9]\{4,10\}$’
匹配15位或18位身份证号
‘^[1-9]\([0-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$’
匹配密码(由数字、26个字母和下划线组成)
‘^\w\+$’
六、总结
Linux常用命令
系统安全
sudo、su、chmod、setfacl
进程管理
w、top、ps、kill、pkill、pstree、killall
用户管理
id、usermod、useradd、groupadd、userdel
文件系统
mount、umount、fsck、df、du
系统关机和重启
shutdown、reboot
网络应用
curl、telnet、mail、elinks
网络测试
ping、netstat、host
网络配置
hostname、ifconfig
常用工具
ssh、screen、clear、who、date
软件包管理
yum、rpm、apt-get
文件查找和比较
locate、find
文件内容查看
head、tail、less、more
文件处理
touch、unlink、rename、ln、cat
目录操作
cd、mv、rm、pwd、tree、cp、ls
文件权限属性
setfacl、chmod、chown、chgrp
压缩/解压
bzip2/bunzip2、gzip/gunzip、zip/unzip、tar
文件传输
ftp、scp
Linux系统定时任务
crontab命令
crontab -e
*****命令(分时日月周)
at命令
# at 2:00 tomorrow
vi/vim编辑器
shell基础
赋予权限,直接执行,例:chmod+x test.sh;./test.sh
调用解释器使得脚本执行,例:bash、csh、csh、ash、bsh、ksh等等
使用source命令,例:sourche test.sh
编写基础
开头用#!指定脚本解释器,例如#!/bin/sh
编写具体功能
Awk命令
一、介绍
文本与数据处理工具,它可编程,处理灵活,功能强大,例如它可以统计,可以制表
1.awk行处理方式与格式
2.awk内嵌参数应用
3.awk内嵌程序应用
二、awk处理方式
awk一次处理一行内容,awk对每行可以切片处理
例:$ awk ‘{print $1}’ //输出首个单词
使用awk—格式
命令行格式
$ awk [options] ‘command’ file(s)
基本格式
command:pattern{awk操作命令} pattern:正则表达式;逻辑判断式
操作命令
内置函数:print() printf() getline…;
控制指令:
if(){…}else{…};while(){…};
扩展格式
脚本格式
$ awk -f awk-script-file file(s)
三、awk内置参数应用
awk内置变量1
$0:表示整个当前行
$1:每行第一个字段
$2:每行第二个字段
awk内置参数:分割符
options: -F filed-separator(默认为空格)
例:$ awk -F ‘,’ ‘{print $3}’ /etc/passwd
awk内置变量2
NR:每行的记录号
NF:字段数量变量
FILENAME:正在处理的文件名
例:$ awk -F ‘,’ ‘{print NR,NF}’ /etc/passwd
例:$ awk -F ‘,’ ‘{print FILENAME}’ /etc/passwd
四、awk内置参数应用
显示/etc/passwd每行的行号,每行的列数,对应行的用户名(print,printf)
$ awk -F ‘:’ ‘{printf(“Line:%s Col:%s User:%s\n”,NR,NF,$1)}’ /etc/passwd
显示/etc/passwd中用户ID大于100的行号和用户名(if...else...)
$ awk -F ‘:’ ‘{if($3>100) print ”Line: “NR,”User: “$1}’ /etc/passwd
在服务器log中找出 ‘Error’的发生日期
awk ‘/Error/ {print $1}’ error.log
五、awk—逻辑判断式
~,!~:匹配正则表达式
==,!=,<,>:判断逻辑表达式
例:$ awk -F ‘:' ‘$1~/m.*/{print $1}’ passwd
例:$ awk -F ‘:' ‘$3>100{print $1,$3}’ passwd
六、awk扩展格式
例:制表显示/etc/passwd每行的行号,每行的列数,对应的用户名
例:$ awk -F ‘:’ ‘BEGIN{print “Line Col User”} {print NR,NF,$1}END{print "———“FILEAME”-----"}’ passwd
七、逻辑处理案例
统计当前文件夹下的文件/文件夹占用的大小
ls -l | awk ‘BEGIN{size=0}{size+=5}END{print “size is “size/1024/1024”M"}’
统计显示/etc/passwd的账户总人数
$ awk -F ‘:’ ‘BEGIN{count=0}$1!~/^$/{count++}END{print “count = “ count}’
统计UID显示大于100的用户名
统计netstat -anp 状态下为LISTEN和CONNECTED的连接数量
netstat -anp | awk ‘$6~/CONNECTED|LISTEN/{sum[$6]++}END{for (i in sum) print i,sum[i]}’