自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

简单用心品质生活

关注高并发、高性能服务器开发

  • 博客(119)
  • 问答 (1)
  • 收藏
  • 关注

原创 大表加索引方案

背景每个公司针对数据库的设计都有套方案。最近在巡检表的设计,发现之前有张表漏掉了针对更新时间字段updated_at的索引,现在需要加上该索引。我们都知道,为表增加索引是会对表进行加锁处理的。稍有不慎,可能会导致表被锁后,业务无法进行读写操作而产生事故影响,通常都是报错Waiting for meta data lock。在对表进行修改时,特别是生产上,我们首先要观察对应的表此时是否在高并发读写(选择操作时机)、表的量级信息。方案整体思路是:先创建一张表,结构和原表相同;在新表上添加索引;r

2020-06-29 01:03:57 1863 2

原创 Ubuntu 18.04修改主机名

Ubuntu 18.04通过文件*/etc/hostname*修改主机名后,重启失败该怎么解决?首先修改*/etc/cloud/cloud.cfg文件中的preserve_hostname*属性,改为true。vim /etc/cloud/cloud.cfg-- 修改属性preserve_hostname: true修改/etc/hostname文件中的文件名vim /etc/hostname-- 修改系统名为你想要的系统名hostname重启系统reboot查

2020-06-14 21:30:34 1444

原创 Ubuntu安装ssh服务

文章目录背景安装ssh确认本机ssh服务安装ssh服务背景最近在开始学习HBase。需要安装HBase的集群,首要条件是HMaster能够免密登录到所有的节点。这要借助于ssh服务来实现。结果在安装的虚拟机上并没有发现ssh服务。安装ssh确认本机ssh服务ps -e | grep ssh以上命令,如果有对应的sshd字样输出,则表明已经启动ssh服务。否则,则需要启动对应服务。service sshd start以上命令,表示启动ssh服务。如果出现诸如:failed to start

2020-05-10 22:53:53 272

原创 使用 Intellij IDEA 时折叠代码

Intellij IDEA中折叠代码的方式,如下:1. 针对类、方法的折叠快捷键: ctrl + - ,ctrl + + 适用于扩展2. 自定义折叠自定义折叠有两种类型,分别为visual studio style 和netbeans style 。在折叠标识上,可以使用1中的快捷键进行快速折叠或展开。a. vistual studio style// region descripti...

2020-02-25 21:47:29 1824

原创 动态修改注解值

背景平时开发业务时,由于特殊需要,使得一份代码需要部署到4个应用服务中为不同对象进行服务。公司使用的配置中心是自研发的,暂不支持配置中心注解(如:@DynamicPropertyInject(name = "${application.effective.exchanges}"))的值采用properties文件来动态配置。这使得在同套代码的不同应用场景下,表明同个含义的注入就需要声明多次,且有...

2019-10-20 22:45:08 4080

原创 Redis Lua scripts debugger的使用

文章目录背景说明Redis Lua调试器特点Redis Lua调试器快速入门Redis Lua debug命令参考文章背景说明使用Redis开发分布式应用时,难免会遇到需要使用分布式锁来确保某一小段逻辑的原子性操作,如:当存在某个key对应的值A大于值B时,则返回false;否则A + 1。试想一下,如果用到分布式锁,是不是有点感觉像是杀鸡用宰牛刀?由于Redis的操作都是原子性的,所以我们...

2019-09-11 19:53:00 938

原创 Sharding-JDBC的SpringBoot使用

本文使用的sharding-jdbc版本为3.1.0,采用springboot的配置。不同的sharding-jdbc版本,会有配置上的差异。请大家注意下版本问题。要求:模拟订单数据库,有两个数据库demo_ds_0、demo_ds_1,依据于uid进行分库。每个库中,将t_order表依据order_id进行拆分为t_order_0,t_order_1两个表。数据库及表创建use...

2019-07-29 20:05:25 2441

原创 浅谈分库分表

一、分库分表背景老调常谈,直接原因是数据量的锅。传统IT/业务量较小的企业里也许很难体现出,而在大型互联网企业里,数据量增长巨快,像我们公司埋点数据的指标拍平后,每天有亿级别的数据。按阿里巴巴给出的开发规范,单表超过500w行就要考虑分表,因为此时单机的性能已经到瓶颈。所以,后来牛人们提出分布式。一台机器顶不上,那就多台,人多自然力量大,化整为零来解决。具体到数据的存储上,那就是按照一定的规...

2019-07-29 20:02:32 346

原创 Redis批量设置Key过期

Redis批量设置Key过期,一般有两种方式:lua脚本和pipeline1。lua脚本-- expire_keys.lua 存放在classpath的script目录中for i=1, ARGV[1], 1do redis.call("PEXPIRE", KEYS[i], ARGV[2]);end//过期时间,pexpire的过期时间为ms单位,如果是秒请用expire...

2019-03-28 14:51:08 6795

原创 JVM4:垃圾收集器和垃圾收集算法

前言垃圾收集器主要考虑的工作是什么内存该回收、什么时候进行回收以及该怎么样进行回收?通过之前的内容我们都知道,程序计数器、JVM栈及本地方法栈都是线程私有的,执行完毕自动销毁,不需要过多考虑内存回收问题;而堆和方法区是属于共享的区域,运行时创建的对象等信息都存放在这些区域中,垃圾收集器主要也是关注这部分内存的使用情况。什么内存该回收垃圾收集器回收的是一些已经无用的对象,判断对象无用的方法主...

2019-03-03 21:35:17 229

原创 JVM2:内存溢出及常用命令列表

前言本篇博文主要介绍使用程序触发对应的内存溢出,并附带上JVM常用的命令,供以后查看使用。堆溢出堆主要是用来存储对象,我们只要不断的创建对象,并防止虚拟机对对象进行回收则可以触发堆溢出。-Xms设置堆最小值、-Xmx设置堆最大值。如果两者相同,则可以避免堆自动扩展;-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快...

2018-12-10 18:37:01 473

原创 JVM1:Java内存区域

前言说到Java内存区域,可能很多人第一反应是“堆栈”。堆栈不是一个概念,而是两个概念,堆和栈是两块不同的内存区域。简单理解的话,堆是用来存放对象而栈是用来执行程序的,堆的使用是需要new并配对delete/free的,在Java中是由JVM进行回收的区域,而栈是用来存储临时变量的。堆内存和栈内存的这种划分方式比较粗糙,这种划分方式只能说明大多数程序员最关注的、与对象内存分配关系最密切的内...

2018-11-20 10:23:53 119

原创 JDK1.8源码:HashMap解读

HashMap是我们最常用的集合类型之一了。也由于其高效、使用方便,我们有必要对其内部进行梳理一番。JDK1.8源码中,关于Map的类图关系如下:Map家族的对比从Map的类图关系中,我们可以看出还是蛮丰富的。需要用到顺序的,可以使用TreeMap,需要线程安全的可以使用HashTable和ConcurrentHashMap。其各自特点总结如下:类特点HashMap...

2018-11-10 23:00:17 173

原创 JVM6:虚拟机类加载机制

文章目录类加载时机类加载过程加载验证准备解析初始化类加载器双亲委派模型自定义类加载器类加载时机类从被加载到虚拟机内存中开始,到卸载出内存为止,整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)及卸载(Unloading)。其中,验证、准备和解析3个部...

2018-11-08 17:30:27 168

原创 【Effective Java】条41:慎用重载

重载(Overload)和重写(Override)重载是指,同一个类里,方法名相同,方法入参类型不同或者个数不同的方法;重写是指子类重写父类的某个方法。不仅仅是概念上的不同,在运行时调用哪种方法的选择上也不同。如首先看个重载的示例:public class CollectionClassfier { public static String classify(Set<?&g...

2018-06-04 16:05:02 466

原创 【Effective Java】条39:必要时使用保护性拷贝

保护性拷贝大家都知道,相比于C或者C++,Java是一门安全性的语言。但这不意味着在编程时你可以随意为之,相反,你也不得不尽最大考虑客户端代码在尽力破坏你的不可变变量等,你也必须保护性的来设计自己的程序。如:public final class PeriodV1 { private final Date start; private final Date end; pu...

2018-05-25 15:20:16 259

原创 【Effective Java】条34:使用接口模拟扩展枚举

假设某需求,有个计算器实现了加、减、乘、除的算法,但是希望同时也允许客户端自定义某些操作方法。计算器实现的加、减、乘、除代码如下:public enum Operation { PLUS("+") { @Override double apply(double x, double y) { return x + y; } }, MINU...

2018-05-23 15:59:38 701 1

原创 【Effective Java】条30:使用枚举代替int常量

在枚举类型出现之前,一般都常常使用int常量或者String常量表示列举相关事物。如:public static final int APPLE_FUJI = 0;public static final int APPLE_PIPPIN = 1;public static final int APPLE_GRANNY_SMITH = 2;public static final in...

2018-05-23 09:14:46 737

原创 【Effective Java】条25:列表优先于数组

数组和列表有两个很大的不同: 1. 数组是协变,列表是不变的。意思是当类A是类B的子类时,则A[]是B[]的子类;而对于列表,对于任何两个不同的类型Type1和Type2,都不会存在List<Type1>是List<Type2>的子类或者父类。数组类型是具体的,即数组明确知道元素的类型并强制在运行时确定元素的类型;列表是擦除的,所以在编译的时候就会明确要求类型统一。...

2018-05-18 16:12:52 356

原创 【Effective Java】条23-24:不要使用原生态类型-消除检测的代码警告

在使用泛型的时候,禁止直接声明为原生态类型。如:List list = new ArrayList();而应该直接指定具体的参数类型,如:List<String> list = new ArrayList();如果真的不能确定具体的参数类型,那可以使用无限制的通配符类型:List<?> list = new ArrayList();主要原...

2018-05-17 17:20:14 194

原创 【Effective Java】条22:静态成员类优于非静态成员类

嵌套类是指定义在其他类里面的类,其旨在为外围类提供服务。嵌套类有四种,分别为静态成员类、非静态成员类、匿名类和局部类,其中非静态成员类、匿名类和局部类又称为内部类。静态成员类静态成员类是最简单的嵌套类。静态成员类是外围类的静态成员,且和其他静态成员一样遵守相同的访问规则。注意静态成员类只能访问外围类的静态成员。使用方法如下Demo所示:public class StaticMe...

2018-05-17 16:47:18 455

原创 【Effective Java】条21:使用函数对象代表策略

一些编程语言通过提供函数指针、委托、lambda表达式或者其他类似的方式,来使得程序拥有存储、并传递特殊函数的能力。Java没有提供函数指针,但是对象引用能提供相同的效果,另Java 1.8开始,提供了lambda表达式。例如,针对字符串的比较,假设我们定义一个比较:class StringLengthCompare { public int compare(String s1...

2018-05-17 10:56:09 267

原创 【Effective Java】条20:类层次优于标签类

标签类,这里指类依据本身的某个属性,来确定类会产生不同的对象。很明显,这不符合类的单一职责原则。如:public class Figure { enum Shape { RECTANGLE, CIRCLE } private Shape shape; /** rectangle fields*/ private double length; priva...

2018-05-16 09:48:19 403

原创 【Effective Java】条18:接口优先于抽象类

Java程序提供两种机制来允许定义多个实现的类型:接口和抽象类。接口和抽象类区别1在于抽象类可以包含某些方法的实现,但是接口却不允许;但最明显的区别还是在于若一旦继承于抽象类,那该类就是抽象类的子类,继承所带来的缺点也就随即而来,譬如Java只允许单继承。接口优先于抽象类优点已存在的类可以通过实现新接口来轻易的改造接口类型相当于行为的抽象,对于一扇门来说打开(open())、关闭...

2018-05-15 17:34:59 432

转载 深入理解Java的接口和抽象类

本文转载自深入理解Java的接口和抽象类抽象类在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:abstract void fun();抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用...

2018-05-15 15:16:04 154

原创 【Effective Java】条17:为继承类专门设计并提供文档说明,否则不使用

在【Effective Java】条16:复合优于继承中我们已经提到过使用继承的缺点。但如果是专为继承设计的,并提供文档说明,那是排除在外的情形。下面看看怎么专为继承设计类,并怎么提供文档说明。该类的文档需明确说明重写任何方法的影响 对于每个public或者protected的方法或者构造器,都需要指明该方法或者构造器调用了哪些可覆盖的方法,以什么顺序,每个调用结果是如何影响后续的处理。最...

2018-05-15 10:27:16 146

原创 【Effective Java】条16:复合优于继承

本文所说的继承都是类和类之间的继承,而非接口和类之间的继承继承是面向对象的三大特性之一。一般情况下,当子类和父类在同一包下且必须继承的时候可以采用继承,毕竟同一包下的代码由同一个人管理;另外当某个类就是被设计成去继承的时候,也可以考虑继承。但是继承如果使用不当的话,会导致随后软件修改很困难。假设我们需要实现Set中曾经加入过多少次元素。实现如下:public class...

2018-05-15 09:23:29 369

原创 【Effective Java】条15:最小化可变性

不可变类从其开始被创建,至其生命周期结束,其状态都是不可变的。Java类库中也提供了许多不可变类,如String、BigInteger、BigDecimal等。创建不可变类为了创建不可变类,可遵循以下5条规则: 1. 为类的域不提供修改对象状态的方法,通常就是setter方法; 2. 类不可被继承类不可被继承有两种实现方式。一为类用`final`修饰,表示不可被继承;二为类不提...

2018-05-09 14:03:53 301

原创 【Effective Java】条14:共有类中使用访问方法而不是公有域

在平时开发中,也会你会定义某些类,没什么作用,仅仅是集中一些实例域的。如:class Point { public float x; public float y;}由于类设计成这样,可以直接通过对象访问,简洁了很多。但是这不符合面向对象的思想,万一x的计算方式有更改,该怎么办?所以最好我们为实例域提供访问方法,如:class Point { pr...

2018-05-08 17:14:10 278

原创 【Effective Java】条13:使类和成员可访问性最小

区分程序设计的好坏之一就是看模块之间实现细节的隐藏。这其实就是信息隐藏或者称之为封装,是软件设计的基本原则之一。成员访问级别在Java程序设计准则中,第一规则就是尽可能地使每个类或者成员不被外界访问,即访问级别尽量小。在Java中,对于成员(域、方法、嵌套类和嵌套接口)有四种可能的访问级别。按可访问性递增排序如下: 1. private只能在声明此成员的类中才能访问2....

2018-05-08 16:46:46 280

原创 【Effective Java】条6:消除过期对象引用

当你从内存需要管理的语言(C、C++),跳转到基于GC管理内存的语言时,你会发现要简单很多。因为GC会自动回收不可用对象,它释放了你的工作。但是GC管理内存一定可靠吗?答案是未必。如:public class Stack { private Object[] elements; private int size = 0; private static final...

2018-05-04 22:06:53 292

原创 【Effective Java】条5:避免创建不必要的对象

在代码Review的时候,也许你老大会告诉你,字符串创建要放到循环之外。for(int i = 0; i < length; i++) { String s = new String(i);}为什么呢?因为在循环的时候,创建了太多的临时对象。每一次循环,都需要new String(),并赋值给新的对象s。我们可以作如下改进:String s;for(int...

2018-05-04 16:57:00 159

原创 【Effective Java】条4:通过私有构造器强化不可实例化

在日常开发中,我们经常会写些工具类(虽然名声不是很好)。为了防止调用者不明白进行了实例化调用,我们可以在工具类中添加私有的构造函数。public class UtilityClass { // Suppress default constructor for noninstantiability private UtilityClass() { } ... ...

2018-05-04 14:58:20 727

原创 【Effective Java】条3:用私有构造器或枚举类型强化singleton属性

Singleton修饰的对象指在系统中是唯一的。Singleton的实现公有域方法public class SingletonTestOne { public static final SingletonTestOne INSTANCE = new SingletonTestOne(); private SingletonTestOne() { ...

2018-05-04 11:35:56 147

原创 【Effective Java】条2:多构造器参数考虑用构造器

构造函数和静态工厂方法1都不能很好的处理多参数问题。譬如有一个类表示包装食品外面显示的营养成分标签,这些标签包含必须的成分:每份的含量,每罐的含量以及每份的卡路里,还有一些其他非必须的显示,譬如总脂肪量、饱和脂肪量、转化脂肪、胆固醇、钠等等。public class NutritionFacts { /** 必须参数*/ private int servingSize; ...

2018-05-04 10:44:04 150

原创 Java必备的Intellij插件推荐(长期更新)

工欲善其事,必先利其器lombok 可以省略需要手写的Getter & Setter方法Builder Generator 快速生成构造器模式代码GsonFormat 快速将JSON字符串转为类Alibaba Java Coding Guidelines 统一组内开发规范FindBugs-IDEA 帮助你发现隐藏BUGSonarLint 帮助你发现隐藏BUG,针...

2018-05-04 10:38:18 3307

原创 【Effective Java】条1:考虑用静态工厂方法代替构造器

在日常编程中,获取类的实例通常采用构造器的方法。还有另一种方法叫作“静态工厂方法(Static Factory Method)”。譬如Boolean类中这段代码:public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE);}使用静态工厂方法优点静态工厂方法有名称构造函数的方法名比较单调...

2018-05-03 18:09:34 145

原创 【Effective Java】条12:考虑实现Comparable

如果自实现的类涉及到内在排序,譬如按字母排序或数字排序或日期排序的,强烈建议实现Comparable接口。实现了Comparable接口的类,可以和许多的泛型算法以及集合进行协作。譬如,列表或数组中的元素实现了Comparable接口,则排序时可以直接调用Collections.sort(list)或Arrays.sort(array)得到结果。通用约定JDK8文档1中这样描述Co...

2018-05-03 11:21:57 130

原创 【Effective Java】条11:谨慎覆盖clone方法

Object文档中指出对象需要被clone,则需要实现Cloneable接口。Cloneable接口只是个标记,没有任何方法。clone约定对于任何对象x, - x.clone() != x返回为true - x.clone().getClass() == x.getClass()返回为true - x.clone().equals(x)返回为true但是约定同时指出,...

2018-05-02 18:03:51 283

原创 【Effective Java】条9:重写equals方法时必须重写hashCode 方法

必须谨记:对于每一个类,重写equals方法时,必须重写hashCode方法。如果没有遵照此规定,则在所有基于hash计算的类中(如:HashMap、HashSet和HashTable)都会出问题。hashCode约定Object规范中有这样的约定:在程序相同执行过程中多次调用同个对象,哈希值必须返回相同。但不是相同调用过程则不必相同; 如果两个对象调用equals()方法相同...

2018-05-02 10:52:55 221

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除