Fork me on GitHub

Docker 部署Confluence15.2

原作者: 小花

原文地址: https://www.cnblogs.com/tchua/p/10727568.html

一、数据库准备

数据库版本:5.7

这里数据库并没有采用docker镜像方式,而是选择已有数据库。至于数据库安装这里不再说明。

注:我这里安装confluence时,需要在下面配置数据库信息时,在数据库地址链接后面加上?sessionVariables=tx_isolation=’READ-COMMITTED’,否则会报错

  1. 创建数据库并授权
1
2
3
create database confluence default character set utf8 collate utf8_bin;
GRANT ALL PRIVILEGES ON confluence.* TO 'confluence'@'%' IDENTIFIED BY 'Confluence#123' WITH GRANT OPTION;
FLUSH PRIVILEGES;

二 、confluence安装

  1. 获取镜像

confluence镜像我们去拉取官方最新镜像atlassian/confluence-server:6.15.2

[root@vanje-dev01 ~]# docker pull atlassian/confluence-server:6.15.2

镜像大小大约800多M,下载速度取决于本地带宽,耐心等待就好

2)启动confluence

1
docker run -d --name confluence -p 7080:8090 -p 7091:8091 atlassian/confluence-server:6.15.2

上面参数挂载宿主机目录进行confluence数据持久化及同步容器时间,7080为容器映射到宿主机端口,后面需要用此端口进行对confluence访问。

启动后,可以通过docker ps 查看是否启动成功,如果看到confluence容器是UP状态,则证明已经启动成功。

3)confluence安装配置

浏览器打开confluence访问页面:http://172.16.11.248:7080,既可以看到confluence安装配置页面

3.1)修改语言(看个人需要)

3.2) 获得插件,这里可以不选择,直接下一步就行

3.3) 获取Server ID到次页面需要输入key才可以进行下一步,这里需要记住服务器ID,为后面破解需要。

三、confluence破解

  3.1)破解包下载

    下载地址: key-Confluence.rar

  3.2)运行破解程序(需要java环境)

  win上打开cmd,进入下面路径,运行破解程序

阅读更多...

是什么让你开始放下手机去读书?

作者:魏华懋

链接:https://www.zhihu.com/question/303137880/answer/591763203

来源:知乎

西安交通大学政治学教授陆卫明在一次授课时讲道:“实际上,我对你们(他的学生)特别是90后一代青年学生还是有一点看法的,什么看法呢?你们把大量的时间花在电脑手机上,如果是要查某些资料就到网上,百度网或者学术期刊找二手的论文,这是害死人的。如果没有读大量的原始经典名著, 就缺乏功底与魅力,不要说是鉴赏能力,就连辨别能力都没有,这个实际上就会导致人云亦云,以讹传讹,不会思考,也没有思想的局面,这恐怕是以后你们发展的最大瓶颈

手机很好玩,但玩手机不会产生价值,而且在浪费价值

手机是真的好玩,一玩就能玩一天,抖音也好玩,一点进去就能开心几个小时。手机在很大程度上真的能度过无聊的时光。

但是,总有很多时刻,当屏幕熄灭的一瞬间,内心时不时会闪现一丝空荡荡的感觉,花了那么多的时间在看空间,看朋友圈,刷贴吧,逛微博。最后却什么都没有换来,没有产生任何的价值。

经济学上有个词叫做“机会成本”,意思是为了得到这种东西所放弃的东西。套用在这里,玩手机也是有成本的,为了玩手机,需要放弃我们的时间、机会等一系列隐形的成本。

打个比方, 本来说好去做一天兼职,然后第二天却起不来床,睡了一上午,点了一份外卖,又玩了一下午的游戏,这里的机会成本是本应该做兼职一天的收入。本来说好要去图书馆学习的,但是却呆在宿舍打了一天游戏,本应该在图书馆学习一天知识的时间的机会成本也同样被浪费掉了。

与其吸收零散碎片化的信息,不如多读书形成系统专业的知识

当然,很多人说他们能够在手机上也能学到很多东西,例如每天看新闻能够了解我们的社会,刷微博经常会发现新奇的事物能够丰富眼界,看b站时不时还能学到新的技能,搜百度也能找到很多问题的答案。

但这些,无疑都是碎片化的信息,在《如何阅读一本书》这本书里,谈到阅读的目标分为两类,一是为获得咨询而读,二是为求得理解而读。显而易见的是绝大多数人属于第一类,为获得娱乐,资讯,消遣时间而玩手机,而这类信息在本质上都是重复的,简单的,不会因为无法理解而伤脑筋 。这类信息很大程度上能增加我们的资讯,却不能增进我们的理解力;

而读书更趋近于第二类,是系统性,理解性的。我们在读书的时候,更多的是去读我们并不怎么知道的东西,这个东西的水平比阅读的人高上一截,在双方水准不齐之下,这个作者想要表达的东西,能增进阅读者的理解力。而且一本书里面的内容往往是一个领域的知识,具有专业性和系统性,能够帮助我们更为深入的了解在该领域的必要知识,在阅读的过程中慢慢理解和思考,可在与作者的沟通中学习到作者建立的知识体系,也能形成自己的认知和思考。

读书这件事可以去辩证的看待,它既有主观的因素,例如读书的意识、方法、态度,动机;也有客观的因素,生活的环境,读书环境,身边人的影响等等。

当然,我们不能只注重主观的因素,两耳不闻窗外事,一心只读圣贤书的方法只会陷入死读书的怪圈;同样也不能只注重客观因素,例如没有良好的学习环境,身边的人都在玩,离不开手机这些原因就认为没那个条件而不去读书。

这也正如矛盾的普遍性和特殊性关系一般,普遍性在于我们所有人都在读书,特殊性在于每个人都有不同的读书方法和经历,都会有自己独特的感受。

一定要去读书而发现读书的感受,又通过对读书的深刻感受认识去更好的读书。

读书是一个渐进式的过程

从不喜欢读书到喜欢读书的过程并不是一蹴而就的,而是一个漫长的、渐进的、启发的过程,这个过程一定要坚持,答主从大一开始看书到大三,用了两年时间开始真正的喜欢上读书,喜欢上学习这件事情。读的书也逐渐从小说渐渐转向政治学、经济学、历史学、哲学、心理学感兴趣的五大专业领域学习。

每天去图书馆读书不再是坚持,而是一种习惯。

总结:我不反对玩手机,我平常也喜欢玩手机。我反对的是每天把大把用于学习,用于活动,用于提升自己的时间拿去玩手机,正如一天精力最好的白天和下午,很多人把这段最好的时间和精力献给了手机。与其吸收零散碎片化的信息,不如多读书形成系统专业的知识。

在琐碎时间玩一会手机是消遣时间,在正经时间玩手机是消遣生命。

**PS:**假期一定利用好时间多学习,多实践。我目前趁假期有大量空闲又纯粹不受打扰的时间学习,到学校后要上课就会断断续续。多去图书馆和书店安静有环境氛围的地方学习。

《麦肯锡决断力》读书笔记

豆瓣地址: https://book.douban.com/subject/33429189/

第一章 我与麦肯锡的不解之缘

邮件中还有附件/002

选择工作的三个标准/007

  1. 选择有利于自己成长的公司;
  2. 选择可以从事国际性工作的公司;
  3. 选择可以充分发挥自身能力,创造出价值,并且可以为社会做出贡献的公司;

出人意料的来自麦肯锡公司的内定录用/010

全力拼搏的日日夜夜/015

速断、速决、速动的习惯/020

最大限度借助他人的力量/023

创造价值者胜/026

保持强势的姿态/028

要么晋升(UP),要么淘汰(OUT)——只有不断进步才能生存/030

不存在“舒适区”的世界/034

无论何时都要保持“PMA”!/036

无论什么情况都要积极努力

缺乏自信是“最差”的/040

充满自信

你在麦肯锡公司也搞笑吗?/043

逐渐变得不明朗的发展前景/046

专题一:如果什么都不做肯定是零,如果行动起来就会有加分,最差的结果也就是零。/050

第二章 我的决定

“结束”的开始/055

废寝忘食的每一天/059

“完美职业规划”的魔咒束缚/063

要是被汽车撞死了就好了……/068

如果人生能重来的话/071

家人、朋友……人生中绝对不希望失去的东西/075

“令人惋惜”的选择/079

人生中的纠结感/082

继续工作的三个条件/086

  • 一是是否喜欢❤️
  • 二是是否比别人更擅长;
  • 三是是否有发展目标。

不能接受碌碌无为的麦肯锡公司/089

打破现实的速断、速决、速动能力/092

所谓的“做决定”是简单的,又是煎熬的/098

从麦肯锡公司员工到笑星/100

成功跨越考验——离职之日/103

将我推向挑战的因素/106

拂去“考试挫折”的阴影奔向东京大学/109

走与众不同的人生道路的勇气/112

如果行动就可能改变未来/115

运用自己的头脑和双手去开辟新世界/119

专题二:我具备了所需要的一切条件……我觉得生命就是上帝馈赠给我们的礼物,因此,不能虚度时光。/122

第三章 决定之后

成为喜剧演员之后/127

永葆初心,坚持勇气/131

必须付出120%的努力/136

充分认识自己只是平凡的一个人/139

我们需要认识到自己只不过是社会中再平凡不过的一员,否则无法脚踏实地地按照正确的方向努力,不要总觉得自己是社会精英。

从抛弃自我开始/141

麦肯锡公司在我人生中的意义/142

麦肯锡公司与我的现在/145

只要自己能接受就好/147

所谓决定就是要学会放弃/148

越是学历高的人就越愿意承担风险做出决定/150

如果不挑挑拣拣的话,工作的选择面反而会更宽/152

自己负100%的责任/154

能够引领自己人生的只有自己。就算进展不顺利遇到挫折,也灭有人会替你承担责任,更不能将失败归咎于任何人,”这就是所谓的自己负100%的责任”

坚持自己的价值标准,不与人争高低/156

应该多和志同道合的人交往/159

远离那些总是对你的决定说“不”的人/161

将事情看得过重的只有你自己/165

将失败看的过重的只有你自己

只有改变自己才能改变未来/169

如果发现自己错了,只要重新考虑假定条件就可以/172

决定本身没有对错之分/173

致无论如何都不能向前迈出一步的人/175

###专题三:最重要的是,要有跟着自己感觉和直觉走的勇气。无论如何,感觉和直觉早就知道你到底想成为什么样的人,其他都是次要的。/179

结语:为了开创属于自己的人生/181

portainer-docker必备可视化工具(原创)

推荐使用 Portainer 作为docker容器的 GUI 管理方案。

Portainer是一个开源、轻量级Docker管理用户界面,基于Docker API,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。

官方地址:https://portainer.io/install.html

安装命令:

1
2
3
docker volume create portainer_data

docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

访问你的 IP:9000 即可进入容器管理页面。如果是本机的话访问地址就是: http:localhost:9000

运行效果:

参考文章: docker:轻量级图形页面管理之Portainer

springboot jpa分页中给对象添加新属性

在springboot开发中,我们经常会使用到Jpa的Page来进行分页操作。

通过Jpa的pageable对象可以获取到Page<>列表,这个对象包含了所需要的数据以及分页信息。但是我们可能会遇到这样的问题:

从数据库中获取到的对象,我们需要给每个对象添加一个属性值,用于在页面中显示。这时就会想到新建一个实体类,用于保存这些数据:

原始类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Test {

private long id;
private String name;

public long getId(){
return id;
}
public void setId (long id) {
this.id = id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}

1.创建新的实体类:

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
public class TestNew {

private long id;
private String name;
private Integer age;

public long getId(){
return id;
}
public void setId (long id) {
this.id = id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public Integer getAge(){
return age;
}
public void setAge(Integer age){
this.age = age;
}
}

2.从原有的page中获取content并修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
List<Test> testList = pageOld.getContent();

List<TestNew> testNewList = new LinkedList<TestNew>();

for (Test test : testList ) {

TestNew testNew = new TestNew();
testNew.setId(test.getId());
testNew.setName(test.getName());
testNew.setAge(18);

testNewList.add(testNew);
}

3.构造新的page:

1
Page<TestNew> pageNew = new PageImpl(testNewList);

4.然而,这样构造的page是有问题的:在页面展示的时候,发现只有第一页。于是经过对比排查,发现新构造的page中有个totalElements字段等和原有的值是不一样的。经过查询page类的api发现其还有另一个构造函数,其中就包含了总条数等属性:

1
Page<TestNew> pageNew = new PageImpl(testNewList, new PageRequest(pageOld.getNumber(), pageOld.getSize()), pageOld.getTotalElements());

5.这样才算大功告成了!

Docker 部署Jira8.1.0

原文地址: https://www.cnblogs.com/tchua/p/10862670.html

Jira与Confluence一样,都需要用到独立的数据库,对于数据库的安装我们不做介绍,主要介绍如何用Docker部署Jira以及对Jira进行破解的操作。

1、数据库准备

关于数据库官方文档说明:https://confluence.atlassian.com/adminjiraserver/connecting-jira-applications-to-mysql-5-7-966063305.html

注意:我使用的数据库版本为mysql5.7,请认真阅读官方文档中给出的不同版本不同的mysql授权命令,以及对应的参数修改,否则下面安装时会失败。

2、Jira安装

1)获取镜像

官方镜像地址:cptactionhank/atlassian-jira-software:8.1.0

1
[root@vanje-dev01 ~]# docker pull cptactionhank/atlassian-jira-software:8.1.0
  1. 启动jira
1
2
3
docker run -d -p 7081:8080 \
--name jira-software \
cptactionhank/atlassian-jira-software:8.1.0

这里并没有对数据持久化(后面会想办法优化),因为jira容器中是daemon启动的jira服务,如果进行数据持久化,需要在宿主机目录授权对应目录让daemon用户有权限访问;7081为jira外部访问端口。

3)配置

浏览器打开http://172.16.11.248:7081

  a) 选择语言(选择适合自己的语言)

  b) 配置数据库信息(信息填好,点击下面的测试连接,显示成功即可,否则根据提示去官网文档查看是否修改对mysql应参数)

注意:点击下一步,需要等待一会因为程序需要往数据库中写数据。

  c) 获取授权码

这里破解跟confluence略有不同,jira破解需要先按照提示去官方获取试用授权码,这样才可以进入系统,然后进行破解包的替换,重启服务即可。

  d) 创建admin用户,然后按照提示点击下一步,即可完成jira的安装

4)破解

a)下载破解包

  地址:atlassian-extras-3.2.jar

1
2
3
4
5
6
7
8
9
10
11
wget https://files.cnblogs.com/files/tchua/atlassian-extras-3.2.rar

安装解压rar的软件,参考网址: https://www.jianshu.com/p/b660f8c7445b
wget http://www.rarsoft.com/rar/rarlinux-x64-5.5.b2.tar.gz
下载之后直接解压 tar -zxvf rarlinux-x64-5.5.b2.tar.gz
切换目录至rar(解压后目录下) cd rar
然后需要借用权限 sudo make
cd ../

解压rar
rar a atlassian-extras-3.2.rar dir

 b)替换破解包

  通过docker ps 获取jira容器id,然后把破解包上传至宿主机通过docker cp 命令复制到容器中,重启jira容器 

1
2
[root@vanje-dev01 tmp]# docker cp atlassian-extras-3.2.jar  cc9cbeac803e0084:/opt/atlassian/jira/atlassian-jira/WEB-INF/lib
[root@vanje-dev01 tmp]# docker restart cc9cbeac803e0084

 c) 查看破解

登陆jira>>右上角设置按钮>>应用程序,即可看到破解已成功

img

  1. jira邮件配置

Spring Data JPA学习

视频地址: https://www.bilibili.com/video/av48767030

day1

  1. 操作繁琐
  2. 占位符赋值麻烦

如何解决?

Jdbc封装工具类

1. orm思想

主要目的: 操作实体类就相当于操作数据库表

建立两个映射关系:

​ 实体类和表的映射关系

​ 实体类中属性和字段的映射关系

不在重点关注: sql语句

实现了 ORM思想的框架: mybatis, hibernate

2. hibernate框架介绍

3. JPA规范

jpa规范,实现jpa规范,内部是由接口和抽象类组成

4. jpa的基本操作

day2

day3

Redis 为什么使用单进程单线程方式也这么快

Redis 采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由 C 语言编写。官方提供的数据是可以达到100000+的 qps。这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcached 差。

Redis 快的主要原因有:

  1. 完全基于内存;
  2. 数据结构简单,对数据操作也简单;
  3. 使用多路 I/O 复用模型;

第一、二点不细讲,主要围绕第三点采用多路 I/O 复用技术来展开。

多路 I/O 复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了 Redis 具有很高的吞吐量。

和 Memcached 不同,Redis 并没有直接使用 Libevent,而是自己完成了一个非常轻量级的对 select、epoll、evport、kqueue 这些通用的接口的实现。在不同的系统调用选用适合的接口,linux 下默认是 epoll。因为 Libevent 比较重,更通用,代码量也就很庞大,拥有很多 Redis 用不上的功能,Redis 为了追求“轻巧”并且去除依赖,就选择自己去封装了一套。

单进程单线程好处

  1. 代码更清晰,处理逻辑更简单
  2. 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
  3. 不存在多进程或者多线程导致的切换而消耗 CPU

单进程单线程弊端

  1. 无法发挥多核 CPU 性能,不过可以通过在单机开多个 Redis 实例来完善;

其他一些优秀的开源软件采用的模型

  • 多进程单线程模型:Nginx
  • 单进程多线程模型:Memcached

参考链接

分布式全局ID生成方案

原文地址: 分布式全局ID生成方案

传统的单体架构的时候,我们基本是单库然后业务单表的结构。每个业务表的ID一般我们都是从1增,通过AUTO_INCREMENT=1设置自增起始值,但是在分布式服务架构模式下分库分表的设计,使得多个库或多个表存储相同的业务数据。这种情况根据数据库的自增ID就会产生相同ID的情况,不能保证主键的唯一性。

如上图,如果第一个订单存储在 DB1 上则订单 ID 为1,当一个新订单又入库了存储在 DB2 上订单 ID 也为1。我们系统的架构虽然是分布式的,但是在用户层应是无感知的,重复的订单主键显而易见是不被允许的。那么针对分布式系统如何做到主键唯一性呢?

UUID

UUID (Universally Unique Identifier),通用唯一识别码的缩写。UUID是由一组32位数的16进制数字所构成,所以UUID理论上的总数为 16^32=2^128,约等于 3.4 x 10^38。也就是说若每纳秒产生1兆个UUID,要花100亿年才会将所有UUID用完。

生成的UUID是由 8-4-4-4-12格式的数据组成,其中32个字符和4个连字符’ - ‘,一般我们使用的时候会将连字符删除 uuid.toString().replaceAll("-","")

目前UUID的产生方式有5种版本,每个版本的算法不同,应用范围也不同。

  • 基于时间的UUID - 版本1: 这个一般是通过当前时间,随机数,和本地Mac地址来计算出来,可以通过 org.apache.logging.log4j.core.util包中的 UuidUtil.getTimeBasedUuid()来使用或者其他包中工具。由于使用了MAC地址,因此能够确保唯一性,但是同时也暴露了MAC地址,私密性不够好。
  • DCE安全的UUID - 版本2 DCE(Distributed Computing Environment)安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。
  • 基于名字的UUID(MD5)- 版本3 基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。
  • 随机UUID - 版本4 根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但是重复的可能性可以忽略不计,因此该版本也是被经常使用的版本。JDK中使用的就是这个版本。
  • 基于名字的UUID(SHA1) - 版本5 和基于名字的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。

我们 Java中 JDK自带的 UUID产生方式就是版本4根据随机数生成的 UUID 和版本3基于名字的 UUID,有兴趣的可以去看看它的源码。

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {

//获取一个版本4根据随机字节数组的UUID。
UUID uuid = UUID.randomUUID();
System.out.println(uuid.toString().replaceAll("-",""));

//获取一个版本3(基于名称)根据指定的字节数组的UUID。
byte[] nbyte = {10, 20, 30};
UUID uuidFromBytes = UUID.nameUUIDFromBytes(nbyte);
System.out.println(uuidFromBytes.toString().replaceAll("-",""));
}

得到的UUID结果,

1
2
59f51e7ea5ca453bbfaf2c1579f09f1d
7f49b84d0bbc38e9a493718013baace6

虽然 UUID 生成方便,本地生成没有网络消耗,但是使用起来也有一些缺点,

  • 不易于存储:UUID太长,16字节128位,通常以36长度的字符串表示,很多场景不适用。
  • 信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,暴露使用者的位置。
  • 对MySQL索引不利:如果作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能,可以查阅 Mysql 索引原理 B+树的知识。

数据库生成

是不是一定要基于外界的条件才能满足分布式唯一ID的需求呢,我们能不能在我们分布式数据库的基础上获取我们需要的ID?

由于分布式数据库的起始自增值一样所以才会有冲突的情况发生,那么我们将分布式系统中数据库的同一个业务表的自增ID设计成不一样的起始值,然后设置固定的步长,步长的值即为分库的数量或分表的数量。

以MySQL举例,利用给字段设置auto_increment_incrementauto_increment_offset来保证ID自增。

  • auto_increment_offset:表示自增长字段从那个数开始,他的取值范围是1 .. 65535。
  • auto_increment_increment:表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535。

假设有三台机器,则DB1中order表的起始ID值为1,DB2中order表的起始值为2,DB3中order表的起始值为3,它们自增的步长都为3,则它们的ID生成范围如下图所示:

通过这种方式明显的优势就是依赖于数据库自身不需要其他资源,并且ID号单调自增,可以实现一些对ID有特殊要求的业务。

但是缺点也很明显,首先它强依赖DB,当DB异常时整个系统不可用。虽然配置主从复制可以尽可能的增加可用性,但是数据一致性在特殊情况下难以保证。主从切换时的不一致可能会导致重复发号。还有就是ID发号性能瓶颈限制在单台MySQL的读写性能。

使用redis实现

Redis实现分布式唯一ID主要是通过提供像 INCRINCRBY 这样的自增原子命令,由于Redis自身的单线程的特点所以能保证生成的 ID 肯定是唯一有序的。

但是单机存在性能瓶颈,无法满足高并发的业务需求,所以可以采用集群的方式来实现。集群的方式又会涉及到和数据库集群同样的问题,所以也需要设置分段和步长来实现。

为了避免长期自增后数字过大可以通过与当前时间戳组合起来使用,另外为了保证并发和业务多线程的问题可以采用 Redis + Lua的方式进行编码,保证安全。

阅读更多...

阅读《代码整洁之道》总结

原文地址: https://www.cnblogs.com/xiaoyangjia/

很早就阅读过《代码整洁之道》(英文版Clean Code),当时博主是个青涩的菜鸟,正在为团队创造着混乱的代码。多年的工作中,屡次被别人的代码坑的苦不堪言,回想起当年我留下的代码,肯定也坑害了后来的同僚。当阅读JDK源码或者其他优秀开源工程时,叹服作者代码构建之精良,他们都有共同的特点:精确的变量名、恰到好处的设计模式、详细而不赘述的注释等等。如今重读本书,总结一下内容并加上自己的一些见解与大家分享。

代码是团队沟通方式

工作的沟通,不只是电子邮件或者面对面语言交流,代码也是沟通方式之一。用代码实现需求,只是万里长征走完了第一步,必须让代码表达自己的设计思想。试想一下,你负责的功能被另外一个同事接手,如果你的代码结构清晰、注释合理,他就不用频繁的询问代码疑点,不用打断你的工作。编写代码的时候,应该考虑到别人的阅读感受,减少阅读障碍,为整个团队创造代码,而不是你自己。

让营地比来时更干净

这是美国童子军规的谚语,美国童子军相当于半军事化管理的青少年夏令营。夏令营结束后孩子们离开营地,要打扫卫生保持整洁,让营地比来时更干净。在软件开发过程中,可以理解为不要破坏规则,不要引入混乱。如果团队已经制定了代码规范,比如类名必须有子系统前缀比如BiOrderService(Bi指BI业务部门),就继续遵循下去;再比如,团队已经提供了公共库比如MD5的加密,那就不要再次引入新的MD5库。很多新手程序员接活儿后,看到不喜欢的规范就另起炉灶,需要某些工具类也不询问老司机公共库有没有,直接引入自己熟悉的库,造成兼容性或者其他问题。

合适的命名

合适的命名是头等大事,正如给新生儿起个好名字那样重要。不合适的命名通常是词不达意、误导观众、过度缩写等,由于英文并非我们的母语,找个合适的单词命名似乎真的很难。我建议是先把业务弄清楚,组织会议定下常用业务领域的单词,禁止组员各自发明。比如代码里使用canteen表示饭堂,那就不要再发明DinnerHall,既啰嗦又误导同僚。

看看反例:

1
2
3
4
5
6
// 手机号
String phone =13421800409”;
// 获取地址
private String getDiZhi();
//修改密码
private void modifyPassword(String password1 ,String password2)
阅读更多...
  • Copyrights © 2015-2023 高行行
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信