字段类型

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html

解决 ElasticSearch ClusterBlockException[blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];

  1. 查看硬盘是否足够:df -h
  2. 如果不够的话:可以调整 es 设置:
1
2
3
4
5
# 控制洪水阶段水印。它默认为95%
cluster.routing.allocation.disk.watermark.flood_stage: 99%

或者
cluster.routing.allocation.disk.threshold_enabled: false

磁盘够了之后需要手动释放 3.

1
curl -XPUT -H "Content-Type: application/json" http://node.com:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

或者

1
2
3
4
PUT /all/_settings
{
"index.blocks.read_only_allow_delete":null
}

HTTP 服务

1
ruby -run -e httpd . -p 5000

Q: [2019-07-23 17:21:43] ERROR Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8
A: 参考Jekyll 本地预览时路径中有中文不能编码无法预览 - Jhutha Sach

1
2
3
4
5
6
7
8
9
# vi /usr/lib/ruby/2.3.0/webrick/httpservlet/filehandler.rb
520 s = "<TR><TD class=\"name\"><A HREF=\"#{HTTPUtils::escape(name)}#{query if name.end_with?('/')}\">#{HTMLUtils::escape(dname)}</A></TD>"
521 s << "<TD class=\"mtime\">" << (time ? time.strftime("%Y/%m/%d %H:%M") : "") << "</TD>"
522 s << "<TD class=\"size\">" << (size >= 0 ? size.to_s : "-") << "</TD></TR>\n"
523 res.body.force_encoding("UTF-8") # ============> add this line
524 res.body << s
525 }
526 res.body << "</TBODY></TABLE>"
527 res.body << "<HR>"

tip: 快速重启脚本

1
2
3
# vi .bashrc
# add below line
alias xapk='/usr/local/src/apk-server/restart.sh'
1
2
3
4
5
6
7
# restart.sh
echo kill service ...
ps -aux | grep ruby | grep 9090 | cut -c 9-15 | xargs kill -15
echo start service ...
# cd /usr/local/src/apk-server/smbshare && nohup python -m SimpleHTTPServer 9090 > /dev/null 2>&1 &
cd /usr/local/src/apk-server/smbshare && nohup ruby -run -e httpd . -p 9090 > /dev/null 2>&1 &
echo oked

参考资料

雪花生成器

根据不同业务配置成多个生成器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.lyloou.demo.config;

import com.lyloou.common.util.SnowflakeIdWorker;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SnowflakeConfig {

@Value("${snowflake.workerId}")
private Long workerId;

public enum Type {
ORDER("ORD", 0),
REFUND("REF", 1),
RETURN("RET", 2);

private String prefix;
private long datacenterId;

Type(String prefix, long datacenterId) {
this.prefix = prefix;
this.datacenterId = datacenterId;
}

public String getPrefix() {
return prefix;
}
}

@Bean
SnowflakeIdWorker orderWorker() {
return new SnowflakeIdWorker(workerId, Type.ORDER.datacenterId);
}

@Bean
SnowflakeIdWorker refundWorker() {
return new SnowflakeIdWorker(workerId, Type.REFUND.datacenterId);

}

@Bean
SnowflakeIdWorker returnWorker() {
return new SnowflakeIdWorker(workerId, Type.RETURN.datacenterId);

}
}

生成器的生成逻辑

依据类型来生成(如,订单流水 ID、退款流水 ID、退货流水 ID)
这里,将 dataCenterId 当做类型来使用(还可以再拆分下,适用不同场景);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.lyloou.demo.util;

import com.lyloou.common.exception.CommonException;
import com.lyloou.common.util.SnowflakeIdWorker;
import com.lyloou.demo.config.SnowflakeConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class SnowflakeIdGenerator {
@Autowired
SnowflakeIdWorker orderWorker;
@Autowired
SnowflakeIdWorker refundWorker;
@Autowired
SnowflakeIdWorker returnWorker;

public String genId(SnowflakeConfig.Type type) {
return type.getPrefix() + getId(type);
}

private long getId(SnowflakeConfig.Type type) {
switch (type) {
case ORDER:
return orderWorker.nextId();
case REFUND:
return refundWorker.nextId();
case RETURN:
return returnWorker.nextId();
default:
throw new CommonException("无效的类型");
}
}
}

配置 workerId

1
2
3
# application.yml
snowflake:
workerId: 1

或者配置成启动参数: -Dsnowflake.workerId=3

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// 测试
package com.lyloou.demo;

import cn.hutool.core.util.RandomUtil;
import com.lyloou.demo.config.SnowflakeConfig;
import com.lyloou.demo.util.SnowflakeIdGenerator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ConfigTest {

@Autowired
SnowflakeIdGenerator generator;

@Test
public void testSnowflake() {
for (int i = 0; i < 1000; i++) {
System.out.println(generator.genId(SnowflakeConfig.Type.values()[RandomUtil.randomInt(0, 3)]));
}
}
}
/**
REF722513947651084288
ORD722513947650953217
ORD722513947650953218
RET722513947651215361
REF722513947651084289
ORD722513947650953219
REF722513947651084290
RET722513947651215362
ORD722513947650953220
REF722513947651084291
ORD722513947650953221
RET722513947651215363
REF722513947651084292
*/

雪花算法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
package com.lyloou.common.util;

import cn.hutool.json.JSONObject;

/**
* Twitter_Snowflake<br>
* SnowFlake的结构如下(每部分用-分开):<br>
* 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 <br>
* 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0<br>
* 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
* 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69<br>
* 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId<br>
* 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号<br>
* 加起来刚好64位,为一个Long型。<br>
* SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。
*/
public class SnowflakeIdWorker {

// ==============================Fields===========================================
/**
* 开始时间截 (2015-01-01)
*/
private final long twepoch = 1420041600000L;

/**
* 机器id所占的位数
*/
private final long workerIdBits = 5L;

/**
* 数据标识id所占的位数
*/
private final long datacenterIdBits = 5L;

/**
* 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
*/
private final long maxWorkerId = -1L ^ (-1L << workerIdBits);

/**
* 支持的最大数据标识id,结果是31
*/
private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);

/**
* 序列在id中占的位数
*/
private final long sequenceBits = 12L;

/**
* 机器ID向左移12位
*/
private final long workerIdShift = sequenceBits;

/**
* 数据标识id向左移17位(12+5)
*/
private final long datacenterIdShift = sequenceBits + workerIdBits;

/**
* 时间截向左移22位(5+5+12)
*/
private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;

/**
* 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095)
*/
private final long sequenceMask = -1L ^ (-1L << sequenceBits);

/**
* 工作机器ID(0~31)
*/
private long workerId;

/**
* 数据中心ID(0~31)
*/
private long datacenterId;

/**
* 毫秒内序列(0~4095)
*/
private long sequence = 0L;

/**
* 上次生成ID的时间截
*/
private long lastTimestamp = -1L;

//==============================Constructors=====================================

/**
* 构造函数
*
* @param workerId 工作ID (0~31)
* @param datacenterId 数据中心ID (0~31)
*/
public SnowflakeIdWorker(long workerId, long datacenterId) {
if (workerId > maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
}
if (datacenterId > maxDatacenterId || datacenterId < 0) {
throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
}
this.workerId = workerId;
this.datacenterId = datacenterId;
}

// ==============================Methods==========================================

/**
* 获得下一个ID (该方法是线程安全的)
*
* @return SnowflakeId
*/
public synchronized long nextId() {
long timestamp = timeGen();

//如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
if (timestamp < lastTimestamp) {
throw new RuntimeException(
String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
}

//如果是同一时间生成的,则进行毫秒内序列
if (lastTimestamp == timestamp) {
sequence = (sequence + 1) & sequenceMask;
//毫秒内序列溢出
if (sequence == 0) {
//阻塞到下一个毫秒,获得新的时间戳
timestamp = tilNextMillis(lastTimestamp);
}
}
//时间戳改变,毫秒内序列重置
else {
sequence = 0L;
}

//上次生成ID的时间截
lastTimestamp = timestamp;

//移位并通过或运算拼到一起组成64位的ID
return ((timestamp - twepoch) << timestampLeftShift) //
| (datacenterId << datacenterIdShift) //
| (workerId << workerIdShift) //
| sequence;
}

/**
* 阻塞到下一个毫秒,直到获得新的时间戳
*
* @param lastTimestamp 上次生成ID的时间截
* @return 当前时间戳
*/
protected long tilNextMillis(long lastTimestamp) {
long timestamp = timeGen();
while (timestamp <= lastTimestamp) {
timestamp = timeGen();
}
return timestamp;
}

/**
* 返回以毫秒为单位的当前时间
*
* @return 当前时间(毫秒)
*/
protected long timeGen() {
return System.currentTimeMillis();
}

// 原文链接:https://blog.csdn.net/jiangzeyin_/article/details/80784979
// SELECT (1146667501642584065>>12)&0x1f as workerId,(1146667501642584065>>17)&0x1f as datacenterId;
public JSONObject parseInfo(String id) {
id = Long.toBinaryString(Long.parseLong(id));
int len = id.length();
JSONObject jsonObject = new JSONObject();
int sequenceStart = len < workerIdShift ? 0 : (int) (len - workerIdShift);
int workerStart = len < datacenterIdShift ? 0 : (int) (len - datacenterIdShift);
int timeStart = len < timestampLeftShift ? 0 : (int) (len - timestampLeftShift);
String sequence = id.substring(sequenceStart, len);
String workerId = sequenceStart == 0 ? "0" : id.substring(workerStart, sequenceStart);
String dataCenterId = workerStart == 0 ? "0" : id.substring(timeStart, workerStart);
String time = timeStart == 0 ? "0" : id.substring(0, timeStart);
int sequenceInt = Integer.valueOf(sequence, 2);
jsonObject.put("sequence", sequenceInt);
int workerIdInt = Integer.valueOf(workerId, 2);
jsonObject.put("workerId", workerIdInt);
int dataCenterIdInt = Integer.valueOf(dataCenterId, 2);
jsonObject.put("dataCenter", dataCenterIdInt);
long diffTime = Long.parseLong(time, 2);
long timeLong = diffTime + timeStart;

jsonObject.put("date", timeLong);
return jsonObject;
}


//==============================Test=============================================

/**
* 测试
*/
public static void main(String[] args) {
SnowflakeIdWorker idWorker = new SnowflakeIdWorker(10, 20);
long start = System.currentTimeMillis();
int count = 0;
for (; System.currentTimeMillis() - start < 1000; ) {
idWorker.nextId();
count++;
}
System.out.println(count);
long nextId = idWorker.nextId();
System.out.println(nextId);
System.out.println(idWorker.parseInfo(nextId + ""));
}
}

常用

数值类型 范围(signed) 范围(unsigned) 字节数
int -2147493648 到 2147493647 0 到 4294967295 (2^(4*8)) 4
bigint -9223372036854775808 到 9223372036854775807 0 到 18446744073709551615 (2^(8*8)) 8
float 见下方 见下方 4
double 见下方 见下方 -
decimal DECIMAL[(M[,D])] M<=65 && D<=30 不能为负值 -

mysql 官方说明文档: MySQL :: MySQL 5.6 Reference Manual :: 11.1 Data Type Overview

mysql 字段类型范围说明:int、bigint、smallint、tinyint,char、varchar、nvarchar - 幻星宇 - 博客园

MySQL 的列类型主要有三种:数字、字串和日期。

下面来详细的说明,不一定准确不一定完整,请多包含或者提出您的建议,我很乐意倾听,呵呵.

数字列类型 int、bigint、smallint、tinyint
  数字列类型用于储存各种数字数据,如价格、年龄或者数量。数字列类型主要分为两种:整数型和浮点型。所有的数字列类型都允许有两个选 项:UNSIGNED 和 ZEROFILL。选择 UNSIGNED 的列不允许有负数,选择了 ZEROFILL 的列会为数值添加零。下面是 MySQL 中可用的 数字列类型
• TINYINT——一个微小的整数,支持 -128 到 127(SIGNED),0 到 255(UNSIGNED),需要 1 个字节存储
• BIT——同 TINYINT(1)
• BOOL——同 TINYINT(1)
• SMALLINT——一个小整数,支持 -32768 到 32767(SIGNED),0 到 65535(UNSIGNED),需要 2 个字节存储 MEDIUMINT——一个中等整数,支持 -8388608 到 8388607(SIGNED),0 到 16777215(UNSIGNED),需要 3 个字节存储
• INT——一个整数,支持 -2147493648 到 2147493647(SIGNED),0 到 4294967295(UNSIGNED),需要 4 个字节存储
• INTEGER——同 INT
• BIGINT——一个大整数,支持 -9223372036854775808 到 9223372036854775807(SIGNED),0 到 18446744073709551615(UNSIGNED),需要 8 个字节存储
• FLOAT(precision)——一个浮点数。precision<=24 用于单精度浮点数;precision 在 25 和 53 之间,用于又精度 浮点数。FLOAT(X)与相诮的 FLOAT 和 DOUBLE 类型有差相同的范围,但是没有定义显示尺寸和小数位数。在 MySQL3.23 之前,这不是一个 真的浮点值,且总是有两位小数。MySQL 中的所有计算都用双精度,所以这会带来一些意想不到的问题。
• FLOAT——一个小的菜单精度浮点数。支持 -3.402823466E+38 到-1.175494351E-38,0 和 1.175494351E-38 to 3.402823466E+38,需要 4 个字节存储。如果是 UNSIGNED,正数的范围保持不变,但负数是不允许的。
• DOUBLE——一个双精度浮点数。支持 -1.7976931348623157E+308 到-2.2250738585072014E-308,0 和 2.2250738585072014E- 308 到 1.7976931348623157E+308。如果是 FLOAT,UNSIGNED 不会改变正数范围,但负数是不允许的。
• DOUBLE PRECISION——同 DOUBLE
• REAL——同 DOUBLE
• DECIMAL——将一个数像字符串那样存储,每个字符占一个字节
• DEC——同 DECIMAL
• NUMERIC——同 DECIMAL

字符串列类型:char、varchar、nvarchar
  字符串列类型用于存储任何类型的字符数据,如名字、地址或者报纸文章。下面是 MySQL 中可用的字符串列类型
• CHAR——字符。固定长度的字串,在右边补齐空格,达到指定的长度。支持从 0 到 155 个字符。搜索值时,后缀的空格将被删除。
• VARCHAR——可变长的字符。一个可变长度的字串,其中的后缀空格在存储值时被删除。支持从 0 到 255 字符
• TINYBLOB——微小的二进制对象。支持 255 个字符。需要长度+1 字节的存储。与 TINYTEXT 一样,只不过搜索时是区分大小写的。(0.25KB)
• TINYTEXT——支持 255 个字符。要求长度+1 字节的存储。与 TINYBLOB 一样,只不过搜索时会忽略大小写。(0.25KB)
• BLOB——二进制对象。支持 65535 个字符。需要长度+2 字节的存储。 (64KB)
• TEXT——支持 65535 个字符。要求长度+2 字节的存储。 (64KB)
• MEDIUMBLOB——中等大小的二进制对象。支持 16777215 个字符。需要长度+3 字节的存储。 (16M)
• MEDIUMTEXT——支持 16777215 个字符。需要长度+3 字节的存储。 (16M)
• LONGBLOB——大的的二进制对象。支持 4294967295 个字符。需要长度+4 字节的存储。 (4G)
• LONGTEXT——支持 4294967295 个字符。需要长度+4 字节的存储。(4G)
• ENUM——枚举。只能有一个指定的值,即 NULL 或””,最大有 65535 个值
• SET——一个集合。可以有 0 到 64 个值,均来自于指定清单.

日期和时间列类型
  日期和时间列类型用于处理时间数据,可以存储当日的时间或出生日期这样的数据。格式的规定:Y 表示年、M(前 M)表示月、D 表示日、H 表示小时、M(后 M)表示分钟、S 表示秒。下面是 MySQL 中可用的日期和时间列类型
• DATETIME——格式:’YYYY-MM-DD HH:MM:SS’,范围:’1000-01-01 00:00:00’到’9999-12-31 23:59:59’
• DATE——格式:’YYYY-MM-DD’,范围:’1000-01-01’到’9999-12-31’
• TIMESTAMP——格式:’YYYYMMDDHHMMSS’、’YYMMDDHHMMSS’、’YYYYMMDD’、’YYMMDD’,范围:’1970-01-01 00:00:00’到’2037-01-01 00:00:00’
• TIME——格式:’HH:MM:SS’
• YEAR——格式:’YYYY,范围:’1901’到’2155’

MySQL 中 int(5)最大长度是多少?

  • 无论是 int(3)、int(10),内存存储的是 4 个字节;
  • 最大长度取决于类型是 int 还是 bigint ;
  • int(5)的 5 表示默认显示字符的宽度: 如果输入的是10默认给你显示为00010(加上 zerofill后可以看到);
1
2
3
4
5
6
CREATE TABLE `test1` (
`id` int(5) NOT NULL AUTO_INCREMENT COMMENT 'id',
`id2` int(5) unsigned DEFAULT NULL,
`id3` int(5) unsigned zerofill DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=latin1;

参考: MySQL 中 int(11)最大长度是多少? - 养码青年 - CSDN 博客

在 SQL 语句中 int 代表你要创建字段的类型,int 代表整型,11 代表字段的长度。
 这个 11 代表显示宽度,整数列的显示宽度与 mysql 需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,比如,不管设定了显示宽度是多少个字符,bigint 都要占用 8 个 字节。

int 是整型,(11)是指显示字符的长度,但要加参数的,最大为 255,比如它是记录行数的 id,插入 10 笔资料,它就显示 00000000001 ~~~00000000010,当字符的位数超过 11,它也只显示 11 位,如果你没有加那个让它未满 11 位就前面加 0 的参数,它不会在前面加 0

声明整型数据列时,我们可以为它指定个显示宽度 M(1~255),如 INT(5),指定显示宽度为 5 个字符,如果没有给它指定显示宽度,MySQL 会为它指定一个默认值。显示宽度只用于显示,并不能 限制取值范围和占用空间,如:INT(3)会占用 4 个字节的存储空间,并且允许的最大值也不会是 999,而是 INT 整型所允许的最大值。

MySQL 有五种整型数据列类型,即 TINYINT,SMALLINT,MEDIUMINT,INT 和 BIGINT。它们之间的区别是取值范围不同,存储空间也各不相同。
在整型数据列后加上 UNSIGNED 属性可以禁止负数,取值从 0 开始。

varchar(5)中的 5 又代表什么?

这里的5就真的是字符串的长度了

1
2
3
4
5
6
7
CREATE TABLE `test1` (
`id` int(5) NOT NULL AUTO_INCREMENT COMMENT 'id',
`id2` int(5) unsigned DEFAULT NULL,
`id3` int(5) unsigned zerofill DEFAULT NULL,
`name1` varchar(5) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=latin1;

数据库数据保存后,随即用id作其他更新操作,导致无法更新成功问题

原因:因为是刚保存的,如果没有取回id,其id肯定还是默认的0;
解决办法:回传ID

1
2
3
4
5
6
7
Record record = RecordUtils.toRecord(ps);
record.set("id", null);

ps.setCreated(Timestamp.from(Instant.now()));
boolean ret = Db.save(TABLE.PROXY_STOCKS, "id", record);
// 回传ID
ps.setId(record.getNumber("id").longValue());

Jfinal quartz动态的增、删、暂停、恢复job | 易踪网

jfinal使用QuartzPlugin(定时任务插件)(上)

1
2
3
# 禁用以下服务 (win+r --> services.msc)
Diagnostic Policy Service
Diagnostic Service Host

2.右键点开”这台电脑”,点”管理”,点”服务和应用程序”点”服务”,在右边框里把”superfetch”、”windows search”、”windows search”、”HomeGroupProvider”的启动类型设置成”禁用”
3.from 知乎:通过注册表(regedit)定位并修改了 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UnistoreSvc 等类似项的 start 值为 4,unistack 服务就不会开机运行,空闲时的硬盘占用下来了。

1
2
3
# config/test.properties
key1=2018
key2=2019
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// TestProperties.java
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;

import java.io.IOException;
import java.util.Arrays;
import java.util.Properties;
import java.util.stream.Collectors;

public final class TestProperties {
private static final Properties prop = new Properties();

static {
try {
prop.load(new java.io.FileInputStream(System.getProperty("user.dir").concat("/config/test.properties")));
} catch (IOException e) {
e.printStackTrace();
}
}

private TestProperties() {
}


public static void main(String args[]) {

// value
System.out.println(getValue("key1"));
System.out.println(getValue("key2"));

// array
System.out.println(Arrays
.stream(getValues(ImmutableList.of(
"key1",
"key2"
).toArray()))
.collect(Collectors.toList()));

// map
ImmutableMap<String, String> map = Maps.fromProperties(prop);
System.out.println(map);
}

public static String getValue(String key) {
return prop.getProperty(key).trim();
}

public static Object[] getValues(Object[] key) {
int length = key.length;
Object[] objects = new Object[length];
for (int i = 0; i < length; i++) {
objects[i] = prop.getProperty(key[i].toString()).trim();
}
return objects;
}
}

进程管理

supervisor 进程管理工具

磁盘管理

空间

1
2
df -a #  显示目前在Linux系统上的文件系统的磁盘使用情况统计
du -sh * # 显示当前目录或文件所占用的磁盘空间. -s表示总计,-h是以K,M,G为单位,提高信息的可读性
1
2
3
4
/var/log/journal/
journalctl --vacuum-size=10M
journalctl --disk-usage
# https://blog.csdn.net/ithomer/article/details/89530790
1
2
# 查看某个目录的文件大小并排序(单位为MB)
du -hm --max-depth=1 /var/ | sort -n

自动挂载 E 盘

  • vi /etc/fstab & add below line
1
2
#Windows-Partition
UUID=0004D1FE0007434B /home/lou/e ntfs rw,auto,users,exec,nls=utf8,umask=003,gid=46,uid=1000 0 0
  • Finding which disk you will set
1
sudo fdisk -l
  • Finding the UUID
1
sudo blkid
  • Check it
1
sudo mount -a

设置 image:

1
http://mirros.aliyun.com/ubuntu

pm2

权限管理

  • 修改文件的所有者和所属组:
1
sudo chown -R OWNER:GROUP /www
1
2
3
4
usermod -g 用户组 用户名
强制修改用户所在组
usermod -a -G 用户组 用户名
把某个用户添加进某个组

数据结构

定义

  • 数据结构是相互之间存在一种或多种特定关系的数据元素的集合

分类

数据结构和算法的关系

数据结构就是一组数据的存储结构,
算法就是操作数据的一组方法。

数据结构和算法是相辅相成的。
数据结构是为算法服务的,算法要作用在特定的数据结构之上。

时间复杂度

得到算法的时间复杂度,并不是简单的数有多少个循环;因为,循环的步数是可能很少的或者很多的。
循环的时间复杂度等于循环体的复杂度乘以该循环运行的次数。

如下图:

常见时间复杂度

最坏情况运行时间是一种保证,那就是运行时间将不会再坏了。在应用中,这是一种最重要的需求
通常,除非特别指定 我们提到的运行时间都是最坏情况的运行时间

推导大 O 阶:

单链表结构与顺序存储结构优缺点

参考资料

  • 《大话数据结构》
0%