# 统计行数 字数 字符数
wc 123.txt
# 找到并删除30天以前的符合格式的文件
find /home/midou/logs// -mtime +30 -name "*.log.gz" -exec rm -rf {} \;
# 比较文件不同
diff testA.txt testB.txt
CREATE TABLE order_record like order_today;
jmap -dump:format=b,file=/home/admin/logs/heap.hprof 6214
jstack -l 6111 > xxx.dump
ctrl+alt+shift+N
可以直接查spring上的mapping,比如/user/getPhone
database
的表,再ctrl+Q
可以快速查看表创建语句,索引创建语句,和开头10条数据shift+alt+c
查询最近作出的改变left join
的时候,左边表尽量小,更节省开销,有条件的尽量放到左边处理select * from A where deptId in (select deptId from B);
select * from A where exists (select 1 from B where A.deptId = B.deptId);
mysql优化原则,就是小表驱动大表,小的数据集驱动大的数据集,从而让性能更优。
因此,我们要选择最外层循环小的,也就是,如果B的数据量小于A,适合使用in,如果B的数据量大于A,即适合选择exist。
show VARIABLES like 'profiling'
判断是否开启调优set profiling=on
开启show profiles
show profile cpu,block io for query Query_ID;
进行针对sql诊断①converting HEAP to MyISAM:查询结果太大,内存不够,数据往磁盘上搬了。
②Creating tmp table:创建临时表。先拷贝数据到临时表,用完后再删除临时表。
③Copying to tmp table on disk:把内存中临时表复制到磁盘上,危险!!!
④locked。
如果在show profile诊断结果中出现了以上4条结果中的任何一条,则sql语句需要优化。
show VARIABLES like '%general%%'
查看是否开启set global general_log=1;
开启set global log_output='TABLE';
可通过sql查询查询过的sqlshow open tables where in_use>0;
则in_use
大于0则表示有锁unlock tables;
解锁表show status like 'table%';
,其中Table_locks_waited
出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁该值加1),此值高则说明存在较严重的表级锁争用情况show status like 'innodb_row_lock%';
Innodb_row_lock_current_waits 0
Innodb_row_lock_time 39122
Innodb_row_lock_time_avg 4890
Innodb_row_lock_time_max 23008
Innodb_row_lock_waits 8
①Innodb_row_lock_current_waits:当前正在等待锁定的数量。
②Innodb_row_lock_time:从系统启动到现在锁定的时长。
③Innodb_row_lock_time_avg:每次等待锁所花平均时间。
④Innodb_row_lock_time_max:从系统启动到现在锁等待最长的一次所花的时间。
⑤Innodb_row_lock_waits:系统启动后到现在总共等待锁的次数。
wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar --target-ip 0.0.0.0
jad --source-only com.onegene.biology.biologywork.util.ReportUtil > /tmp/ReportUtil.java
sc -d *ReportUtil | grep classLoaderHash
mc -c 66b1b2c /tmp/ReportUtil.java -d /tmp
redefine /tmp/com/onegene/biology/biologywork/util/ReportUtil.class
tk-mybatis
除了Mapper接口其实还提供了更多便捷接口 @Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
// 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
// Include.Include.ALWAYS 默认
// Include.NON_DEFAULT 属性为默认值不序列化
// Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量
// Include.NON_NULL 属性为NULL 不序列化
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 允许出现特殊字符和转义符
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
// 允许出现单引号
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
return objectMapper;
}
@EnableAutoConfiguration
配合META-INF/spring-factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration
@Vaildator
在Controller层对象的属性若是对象,属性需要加上@Vaild
注解,属性对象内的参数注解才会起作用CaseFormat
来自guava的驼峰转换工具CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, modelNameUpperCamel))
包括了崩溃恢复和消息广播
&characterEncoding=UTF-8
分布式锁的优化思路:购买商品,当有10000个请求同时并发过来,可以尝试用分段锁+合并库存的方式,比如将10000个库存拆分成10个1000个库存,相当于10个锁,可分配到不同机器上,当库存不够时,再锁别的库存合并
首先synchronized和ReentrantLock都是可重入锁
区别:
AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚
Netty是一个基于NIO的网络通信框架,具有高并发,传输快,封装好的特点
ChannelOption.SO_BACKLOG
,标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的最大长度。如果未设置或所设置的值小于1,Java将使用默认值50。ChannelOption.SO_KEEPALIVE
,是否启用心跳保活机制。在双方TCP套接字建立连接后(即都进入ESTABLISHED状态)并且在两个小时左右上层没有任何数据传输的情况下,这套机制才会被激活。ChannelOption.TCP_NODELAY
,如果要求高实时性,有数据发送时就马上发送,就将该选项设置为true关闭Nagle算法;如果要减少发送次数减少网络交互,就设置为false等累积一定大小后再发送。默认为false。ChannelOption.SO_RCVBUF AND ChannelOption.SO_SNDBUF
,定义接收或者传输的系统缓冲区buf的大小ChannelOption.ALLOCATOR
Netty4使用对象池,重用缓冲区
bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
handler()和childHandler()的主要区别是,handler()是发生在初始化的时候,childHandler()是发生在客户端连接之后
原则:都是先入先出
就是内存数据页与磁盘内存页的内容不一致时的内存页叫做脏页。内存页数据写入磁盘后,数据一致了,就是干净页了。
mvcc主要适用于提交读,可重复读,可以解决幻读的问题。
innodb在解决幻读的问题主要是通MVVC 多版本并发版本控制来实现的
就是每一行数据中额外保存两个隐藏的列,创建时的版本号,删除时的版本号(可能为空),滚动指针(指向undo log中用于事务回滚的日志记录)
事务在对数据修改后,进行保存时,如果数据行的当前版本号与事务开始取得数据的版本号一致就保存成功,否则保存失败。
红黑树等平衡树也可以用来实现索引,但是文件系统及数据库系统普遍采用 B+ Tree 作为索引结构,主要有以下两个原因:
(一)更少的查找次数
平衡树查找操作的时间复杂度和树高 h 相关,O(h)=O(logdN),其中 d 为每个节点的出度。
红黑树的出度为 2,而 B+ Tree 的出度一般都非常大,所以红黑树的树高 h 很明显比 B+ Tree 大非常多,查找的次数也就更多。
(二)利用磁盘预读特性
为了减少磁盘 I/O 操作,磁盘往往不是严格按需读取,而是每次都会预读。而B+数中存储的叶子节点在内存中是相邻的,这样可以读取会快一些。
HashMap是非线程安全的。(例如多个线程插入多个键值对,如果两个键值对的key哈希冲突,可能会使得两个线程在操作同一个链表中的节点,导致一个键值对的value被覆盖)
ConcurrentHashMap是线程安全的,主要是通过CAS操作+synchronized来保证线程安全的。
!=
特定值,查询结果不包含null
spring aop事务调用方式,调用同一类中B方法
((ServiceA ) AopContext.currentProxy()).insert();
k8s快速安装
模式有 select,poll,epoll
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;fileName=" + new String((fileName + ".pdf").getBytes("UTF-8"), "iso-8859-1"));
explain后加show warnings;
一起执行
DELIMITER ;;
CREATE PROCEDURE insertData()
BEGIN
declare i int;
set i = 1 ;
WHILE (i < 1000000) DO
INSERT INTO student(`name`,class,`page`,`status`)
VALUES(CONCAT('class_', i),
CONCAT('class_', i),
i, (SELECT FLOOR(RAND() * 2)));
set i = i + 1;
END WHILE;
commit;
END;;
CALL insertData();
一款超好用的阅读插件,可以帮我们聚焦需要阅读的内容
GitHub地址:https://github.com/Kenshin/simpread
Github地址:https://github.com/qishibo/AnotherRedisDesktopManager