Java资源回收
资源回收的时机
- 程序kill -9与kill -15的区别,以及回调函数的作用 - ungoneless的博客 - CSDN博客
1
2
3
4
5
6
7
8
9
10
11
12public class ShutdownHookTest {
private static final void shutdownCallback() {
System.out.println("Shutdown callback is invoked.");
// 在这回收资源
}
public static void main(String[] args) throws InterruptedException {
Runtime.getRuntime().addShutdownHook(new Thread(ShutdownHookTest::shutdownCallback));
Thread.sleep(20000);
}
}
1 | java ShutdownHookTest |
推送
ELK环境部署
软件和环境:
virtual box 6.1
centos 7
java: jdk1.8.0_171
es: 7.3.0
官网地址:https://www.elastic.co/cn/downloads/elasticsearch
下载地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.0-linux-x86_64.tar.gz
Kibana: 7.3.0
官网地址:https://www.elastic.co/cn/downloads/kibana
下载地址:https://artifacts.elastic.co/downloads/kibana/kibana-7.3.0-linux-x86_64.tar.gz
logstash: 7.3.0
官网地址:https://www.elastic.co/cn/downloads/logstash
下载地址:https://artifacts.elastic.co/downloads/logstash/logstash-7.3.0.tar.gz
配置 hosts
1 | # vi /etc/hosts |
关闭防火墙
1 | systemctl stop firewalld.service #停止firewall |
java 环境配置
1 | # vi /etc/profile |
es
- 单机安装请取消注释:node.name: node-1,否则无法正常启动。修改网络和端口,取消注释 master 节点,单机只保留一个 node
1 | node.name: node-1 |
- 按需修改 vim /usr/elasticsearch/config/jvm.options 内存设置
1 | # 根据实际情况修改占用内存,默认都是1G,单机1G内存,启动会占用700m+然后在安装kibana 后,基本上无法运行了,运行了一会就挂了报内存不足。 |
- 添加 es 用户,es 默认 root 用户无法启动,需要改为其他用户
1 | useradd estest |
- 修改/etc/sysctl.conf
1 | vm.max_map_count=655360 |
- 修改/etc/security/limits.conf
1 | * soft nofile 65536 |
- 用 estest 用户启动 es
1 | su estest |
- 测试
1 | curl http://node.com:9200 |
ik 分词器
https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.3.0
- 在 elasticsearch 的 bin 目录下执行以下命令,es 插件管理器会自动帮我们安装,然后等待安装完成:
1 | /usr/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.3.0/elasticsearch-analysis-ik-7.3.0.zip |
- 下载完成后会提示 Continue with installation?输入 y 即可完成安装
- 重启 Elasticsearch 和 Kibana
测试
1 | POST _analyze |
Kibana
最好也用 estest 用户操作
解压,修改配置(端口号、es 地址等)
1 | # vim /usr/kibana/config/kibana.yml |
启动
1 | ./bin/kibana |
按照和运行redis
:
1 | yum install wget -y |
Logstash
配置 shipper-logstash.conf
1 | input { |
配置 indexer-logstash.conf
1 | input { |
运行 jar,指定输出目录
1 | java -jar spring-api.jar & > /log.out |
其他资料
Kotlin疑点难点
with
本书中我们大量讲了这个函数。 with 接收一个对象和一个函数,这个函数会作为
这个对象的扩展函数执行。这表示我们根据推断可以在函数内使用 this 。
1 | inline fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f() |
泛型在这里也是以相同的方式运行: T 代表接收类型, R 代表结果。如你所见,
函数通过 f: T.() -> R 声明被定义成了扩展函数。这就是为什么我们可以调
用 receiver.f() 。
kotlin-for-android-developers-zh p188
构造器
下面 3 种声明都是等效的 (《kotlin 实战》p81)
实现 1
1 | class User constructor(_nickname:String){ |
实现 2
1 | class User(_nickname:String){ |
实现 3
1 | class User(val nickname: String) // “val” 意味着相应的属性会用构造方法的参数来初始化 |
Sql设计
2019-05-28 16:52:57
三范式
- 确保每列保持原子性(维度:单元格)
所有字段都是不可分解的原子值。如【地址】这个属性,如果要经常用到【城市】这个部分,那么要将【地址】分解成【省份】、【城市】、【详细地址】等多个字段存储。 - 确保表中的每列都和主键有关(维度:一行)
在第 1 条的基础上,确保数据库表中的每一列都和主键有关,而不是只与主键的某一部分相关(主要针对联合主键)。
如子订单表中的【子订单 ID】和【商品 ID】构成联合主键。在这个表中,“商品名称,单位,商品价格”等信息不与该联合主键有关,而只是与【商品 ID】有关,不应该存储这些字段。
如果需要这些字段,可以从商品表中获取 - 确保表中的每列都和主键列直接有关,而不是间接相关(维度:表)
在一个表中存储了,在另一个表中存储外键就可以了,不要再重复添加其他字段。
如在订单表中添加【客户 ID】即可,不要再添加客户名称、联系方式等(这些字段已经存在于客户表中)
范式是用来学习和参考的,设计的时候得具体问题具体对待。例如,在访问并发量大的情况下,也会采用反范式来设计提高数据库的响应能力。
用 BTree 还是 HASH
B+树索引和哈希索引的区别——我在想全文搜索引擎为啥不用 hash 索引而非得使用 B+呢? - bonelee - 博客园
MySQL BTree 索引和 hash 索引的区别 - ChangWen 的博客 - CSDN 博客
hash:hash 索引在 mysql 比较少用,他以把数据的索引以 hash 形式组织起来,因此当查找某一条记录的时候,速度非常快.
但是因为是 hash 结构,每个键只对应一个值,而且是散列的方式分布.所以他并不支持范围查找和排序等功能.
B+树:b+tree 是 mysql 使用最频繁的一个索引数据结构,数据结构以平衡树的形式来组织,
因为是树型结构,所以更适合用来处理排序,范围查找等功能.相对 hash 索引,B+树在查找单条记录的速度虽然比不上 hash 索引,但是因为更适合排序等操作,所以他更受用户的欢迎.毕竟不可能只对数据库进行单条记录的操作.
1 | 1. 每列都为保持原子性(地址精确到省、城市) |
索引
Mysql 各种索引区别:
普通索引:最基本的索引,没有任何限制
唯一索引:与”普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引:它 是一种特殊的唯一索引,不允许有空值。
全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
组合索引:为了更多的提高 mysql 效率可建立组合索引,遵循”最左前缀“原则。
分表处理的实现方法
- MySQL 分表处理的实现方法(按月份分的表) - rongwenbin 的专栏 - CSDN 博客
- 数据量大的表的分表方案 以及 跨(同类型的)表查询遇上分组时需要注意的点 - Try My Best 尽力而为 - ITeye 博客
- MySQL 分库分表,写得太好了! - 51CTO.COM
1 | -- 查找 |
Java时间
时间工具
joda-time
判断当前时间是否处在某个区间(用字符串表示的两个时间点)
1 | <dependency> |
1 | /** |
iso 时间转换
1 |
|
定时任务Job
在线 Cron 表达式生成器
QuartZ Cron 表达式 - sunjie - 博客园
CronTrigger
CronTriggers 往往比 SimpleTrigger 更有用,如果您需要基于日历的概念,而非 SimpleTrigger 完全指定的时间间隔,复发的发射工作的时间表。
CronTrigger,你可以指定触发的时间表如“每星期五中午”,或“每个工作日 9:30 时”,甚至“每 5 分钟一班 9:00 和 10:00 逢星期一上午,星期三星期五“。
即便如此,SimpleTrigger 一样,CronTrigger 拥有的 startTime 指定的时间表时生效,指定的时间表时,应停止(可选)结束时间。
Cron Expressions
cron 的表达式被用来配置 CronTrigger 实例。 cron 的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表。这些子表达式是分开的空白,代表:
1. Seconds
2. Minutes
3. Hours
4. Day-of-Month
5. Month
6. Day-of-Week
7. Year (可选字段)
例 “0 0 12 ? * WED” 在每星期三下午 12:00 执行,
个别子表达式可以包含范围, 例如,在前面的例子里(“WED”)可以替换成 “MON-FRI”, “MON, WED, FRI”甚至”MON-WED,SAT”.
“*” 代表整个时间段.
每一个字段都有一套可以指定有效值,如
Seconds (秒) :可以用数字0-59 表示,
Minutes(分) :可以用数字0-59 表示,
Hours(时) :可以用数字0-23表示,
Day-of-Month(天) :可以用数字1-31 中的任一一个值,但要注意一些特别的月份
Month(月) :可以用0-11 或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
Day-of-Week(每周):可以用数字1-7表示(1 = 星期日)或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示
“/”:为特别单位,表示为“每”如“0/15”表示每隔15分钟执行一次,“0”表示为从“0”分开始, “3/20”表示表示每隔20分钟执行一次,“3”表示从第3分钟开始执行
“?”:表示每月的某一天,或第周的某一天
“L”:用于每月,或每周,表示为每月的最后一天,或每个月的最后星期几如“6L”表示“每月的最后一个星期五”
“W”:表示为最近工作日,如“15W”放在每月(day-of-month)字段上表示为“到本月15日最近的工作日”
““#”:是用来指定“的”每月第n个工作日,例 在每周(day-of-week)这个字段中内容为"6#3" or "FRI#3" 则表示“每月第三个星期五”
1)Cron 表达式的格式:秒 分 时 日 月 周 年(可选)。
字段名 | 允许的值 | 允许的特殊字符 |
---|---|---|
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
小时 | 0-23 | , - * / |
日 | 1-31 | , - * ? / L W C |
月 | 1-12 or JAN-DEC | , - * / |
周几 | 1-7 or SUN-SAT | , - * ? / L C # |
年 (可选字段) | empty, 1970-2099 | , - * / |
“?”字符:表示不确定的值
“,”字符:指定数个值
“-”字符:指定一个值的范围
“/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m
“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
“W”字符:指定离给定日期最近的工作日(周一到周五)
“#”字符:表示该月第几个周X。6#3表示该月第3个周五
2)Cron 表达式范例:
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
注: */X
或 M-N/X
,表示匹配范围内能被 X 整除的值,如 1-10/3
就等同于 3, 6, 9
注意事项
跑定时任务时要注意: 整点的情况要考虑周全。
例如:活动的开始时间是 12:00 ,再结合数据库查询的时候, start_at >= 12:00 时,不要漏了“=”号。