tonglin0325的个人主页

mac环境变量不生效问题

1.在 ~/.zshrc 中添加

1
2
source ~/.bash_profile 

参考:https://blog.csdn.net/qq_18505715/article/details/83276208

 

2.比如mac的git命令补全不生效,可以参考如下文章添加

https://blog.csdn.net/WinWill2012/article/details/71774461

1
2
source ~/.git-completion.bash

 

3.调整mac终端颜色和全路径显示

1
2
3
4
5
export PS1="%n@%m %0~ $ "

export CLICOLOR=1
export LSCOLORS=ExFxBxDxCxegedabagacad
alias ls='ls -GFh'

全文 >>

分屏工具xpanes

参考:https://www.ctolib.com/greymd-tmux-xpanes.html

1
2
brew install tmux-xpanes

 或者

1
2
3
4
5
6
7
# Install `add-apt-repository` command, if necessary.
$ sudo apt install software-properties-common

$ sudo add-apt-repository ppa:greymd/tmux-xpanes
$ sudo apt update
$ sudo apt install tmux-xpanes

使用

1
2
xpanes -c "ssh {}" xxxx-{52..60}

 

MySQL自增id不连续问题

项目中有一张表是记录人员,在每个新用户调用接口认证通过了之后,会有一个往该表插入这个新用户信息的操作。

但是在线上环境中,发现该表的自增id不连续,且间隔都是差了2,比如上一个人的id是10,下一个人的id就是12,而在前端页面中,一个用户认证通过后,会调用3个接口,初步排查是MySQL并发操作导致了自增id不连续的情况

在这篇文章中,列举了导致自增id不连续的几个原因,这次遇到的就是第一种情况,因为个人的信息中我设置了唯一索引,参考:MySQL实战45讲Day38—-自增主键不是连续的原因

<1>、唯一键冲突是导致自增主键id不连续的第一种原因

<2>、事务回滚是导致自增主键id不连续的第二种原因

<3>、批量申请自增id的策略是导致自增主键id不连续的第三种原因

在这篇文章中提到了MySQL默认的innodb_autoinc_lock_mode=1,当innodb_autoinc_lock_mode=1和innodb_autoinc_lock_mode=2的情况下,自增id可能会出现不连续

在innodb_autoinc_lock_mode=0的时候,自增id是连续的,但是会导致锁表,影响并发性能

参考:INNODB自增主键的一些问题

再谈MySQL auto_increment空洞问题

全文 >>

Ubuntu16.04安装zkui

1.git clone

1
2
git clone git@github.com:DeemOpen/zkui.git

2.打包

1
2
mvn clean install

3.复制config.cfg到target目录,并修改zk地址

4.配置 supervisor zkui.conf

1
2
3
4
5
6
7
8
9
[program:zkui]
directory=/home/lintong/software/zkui/target
command = java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar
user = lintong
autostart = false
autoresart = true
stderr_logfile = /var/log/supervisor/zkui.stderr.log
stdout_logfile = /var/log/supervisor/zkui.stdout.log

5.启动zookeeper

6.启动zkui

全文 >>

antlr解析hive语句

hive是使用antlr来解析的

parser要做的事情,是从无结构的字符串里面,解码产生有结构的数据结构(a parser is a function accepting strings as input and returning some structure as output),参考 Parser_combinator wiki

parser分成两种,一种是parser combinator,一种是parser generator,区别可以参考 王垠的文章——对 Parser 的误解

 

1.parser combinator是需要手写parser,a parser combinator is a higher-order function that accepts several parsers as input and returns a new parser as its output,比如Thrift的Parser

1
2
https://github.com/apache/thrift/blob/master/compiler/cpp/src/thrift/main.cc

 

2.parser generator是需要你用某种指定的描述语言来表示出语法,然后自动把他们转换成parser的代码,比如Antlr里面的g4语法文件calciteftl语法文件,hue使用的jison以及flexcup等,缺点是由于代码是生成的,排错比较困难

使用了Antlr的parser有Hive,Presto,Spark SQL

美团点评的文章

1
2
https://tech.meituan.com/2014/02/12/hive-sql-to-mapreduce.html

以及hive源码的测试用例

全文 >>

Elasticsearch学习笔记——索引模板

在索引模板里面,date类型的字段的format支持多种类型,在es中全部会转换成long类型进行存储,参考

1
2
https://zhuanlan.zhihu.com/p/34240906

一个索引模板范例

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
{
"order": 0,
"index_patterns": [
"ssssssssssssssss_test*"
],
"settings": {
"index": {
"codec": "best_compression",
"routing": {
"allocation": {
"require": {
"box_type": "master"
},
"total_shards_per_node": "3"
}
},
"refresh_interval": "60s",
"unassigned": {
"node_left": {
"delayed_timeout": "900m"
}
},
"number_of_shards": "3",
"number_of_replicas": "1"
}
},
"mappings": {
"_default_": {
"_source": {
"enabled": true
},
"dynamic_templates": [
{
"string_template": {
"mapping": {
"type": "keyword"
},
"match_mapping_type": "string",
"match": "*"
}
}
],
"properties": {
"a1": {
"search_analyzer": "ik_max_word",
"analyzer": "ik_max_word",
"type": "text"
},
"a2": {
"type": "float"
},
"a3": {
"type": "integer"
},
"untitled": {
"type": "float"
},
"a4": {
"type": "long"
},
"a5": {
"type": "double"
},
"a6": {
"type": "ip"
},
"a8": {
"type": "keyword"
}
},
"_all": {
"enabled": false
}
}
},
"aliases": {}
}

 

Elasticsearch6.2.1安装elasticsearch-sq插件

参考

1
2
https://github.com/NLPchina/elasticsearch-sql

1.下载插件

1
2
wget https://github.com/NLPchina/elasticsearch-sql/releases/download/6.2.1.0/elasticsearch-sql-6.2.1.0.zip

2.安装

1
2
./bin/elasticsearch-plugin instal file:///home/lintong/下载/elasticsearch-sql-6.2.1.0.zip

如果遇到 Exception in thread “main” java.lang.IllegalArgumentException: Unknown properties in plugin descriptor: [jvm, site]

解压zip文件,然后修改 plugin-descriptor.properties 文件

去掉下面两行后重新压缩成zip,然后再安装

1
2
3
site=
jvm=

全文 >>

MySQL学习笔记——乐观锁和悲观锁

场景:两个用户同时读取了数据库中的一条记录,此时用户A对其中一个字段的值进行了修改操作并进行了提交,后来用户B也对这个字段进行了修改,用户B的提交将会覆盖用户A提交的值

乐观锁悲观锁

悲观锁

每次去取数据,很悲观,都觉得会被别人修改,所以在拿数据的时候都会上锁。

简言之,共享资源每次都只给一个线程使用,其他线程阻塞,等第一个线程用完后再把资源转让给其他线程。

select … for update,synchronized和ReentranLock等都是悲观锁思想的体现。 

乐观锁

每次去取数据,都很乐观,觉得不会被被人修改。

因此每次都不上锁,但是在更新的时候,就会看别人有没有在这期间去更新这个数据,如果有更新就重新获取,再进行判断,一直循环,直到拿到没有被修改过的数据。

CAS(Compare and Swap 比较并交换)就是乐观锁的一种实现方式,比如使用version字段或者修改时间字段来判断数据是否被修改,如果返回的受影响行数为 1,表示更新成功;如果返回的受影响行数为 0,表示更新失败(数据已被其他事务修改),可以选择重试或中断操作。

 

参考:

Mysql 事务及数据的一致性处理

全文 >>