<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[简单用心品质生活]]></title><description><![CDATA[关注高并发、高性能服务器开发]]></description><link>https://blog.csdn.net/xl890727</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; xl890727]]></copyright><item><title><![CDATA[大表加索引方案]]></title><link>https://blog.csdn.net/xl890727/article/details/107011573</link><guid>https://blog.csdn.net/xl890727/article/details/107011573</guid><author>xl890727</author><pubDate>Mon, 29 Jun 2020 01:03:57 +0800</pubDate><description><![CDATA[背景
每个公司针对数据库的设计都有套方案。最近在巡检表的设计，发现之前有张表漏掉了针对更新时间字段updated_at的索引，现在需要加上该索引。
我们都知道，为表增加索引是会对表进行加锁处理的。稍有不慎，可能会导致表被锁后，业务无法进行读写操作而产生事故影响，通常都是报错Waiting for meta data lock。在对表进行修改时，特别是生产上，我们首先要观察对应的表此时是否在高并发读写（选择操作时机）、表的量级信息。
方案
整体思路是：

先创建一张表，结构和原表相同；
在新表上添加索引；
r]]></description><category></category></item><item><title><![CDATA[Ubuntu 18.04修改主机名]]></title><link>https://blog.csdn.net/xl890727/article/details/106752112</link><guid>https://blog.csdn.net/xl890727/article/details/106752112</guid><author>xl890727</author><pubDate>Sun, 14 Jun 2020 21:30:34 +0800</pubDate><description><![CDATA[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


查]]></description><category></category></item><item><title><![CDATA[Ubuntu安装ssh服务]]></title><link>https://blog.csdn.net/xl890727/article/details/106044090</link><guid>https://blog.csdn.net/xl890727/article/details/106044090</guid><author>xl890727</author><pubDate>Sun, 10 May 2020 22:53:53 +0800</pubDate><description><![CDATA[文章目录背景安装ssh确认本机ssh服务安装ssh服务
背景
最近在开始学习HBase。需要安装HBase的集群，首要条件是HMaster能够免密登录到所有的节点。这要借助于ssh服务来实现。结果在安装的虚拟机上并没有发现ssh服务。
安装ssh
确认本机ssh服务
ps -e | grep ssh

以上命令，如果有对应的sshd字样输出，则表明已经启动ssh服务。否则，则需要启动对应服务。
service sshd start

以上命令，表示启动ssh服务。如果出现诸如：failed to start]]></description><category></category></item><item><title><![CDATA[使用 Intellij IDEA 时折叠代码]]></title><link>https://blog.csdn.net/xl890727/article/details/104506296</link><guid>https://blog.csdn.net/xl890727/article/details/104506296</guid><author>xl890727</author><pubDate>Tue, 25 Feb 2020 21:47:29 +0800</pubDate><description><![CDATA[Intellij IDEA中折叠代码的方式，如下：
1. 针对类、方法的折叠
快捷键: ctrl + - ，ctrl + + 适用于扩展
2. 自定义折叠
自定义折叠有两种类型，分别为visual studio style 和netbeans style 。在折叠标识上，可以使用1中的快捷键进行快速折叠或展开。
a. vistual studio style
// region descripti...]]></description><category></category></item><item><title><![CDATA[动态修改注解值]]></title><link>https://blog.csdn.net/xl890727/article/details/102655184</link><guid>https://blog.csdn.net/xl890727/article/details/102655184</guid><author>xl890727</author><pubDate>Sun, 20 Oct 2019 22:45:08 +0800</pubDate><description><![CDATA[背景
平时开发业务时，由于特殊需要，使得一份代码需要部署到4个应用服务中为不同对象进行服务。公司使用的配置中心是自研发的，暂不支持配置中心注解（如：@DynamicPropertyInject(name = "${application.effective.exchanges}")）的值采用properties文件来动态配置。这使得在同套代码的不同应用场景下，表明同个含义的注入就需要声明多次，且有...]]></description><category></category></item><item><title><![CDATA[Redis Lua scripts debugger的使用]]></title><link>https://blog.csdn.net/xl890727/article/details/100746981</link><guid>https://blog.csdn.net/xl890727/article/details/100746981</guid><author>xl890727</author><pubDate>Wed, 11 Sep 2019 19:53:00 +0800</pubDate><description><![CDATA[文章目录背景说明Redis Lua调试器特点Redis Lua调试器快速入门Redis Lua debug命令参考文章
背景说明
使用Redis开发分布式应用时，难免会遇到需要使用分布式锁来确保某一小段逻辑的原子性操作，如：当存在某个key对应的值A大于值B时，则返回false；否则A + 1。试想一下，如果用到分布式锁，是不是有点感觉像是杀鸡用宰牛刀？
由于Redis的操作都是原子性的，所以我们...]]></description><category></category></item><item><title><![CDATA[Sharding-JDBC的SpringBoot使用]]></title><link>https://blog.csdn.net/xl890727/article/details/97674968</link><guid>https://blog.csdn.net/xl890727/article/details/97674968</guid><author>xl890727</author><pubDate>Mon, 29 Jul 2019 20:05:25 +0800</pubDate><description><![CDATA[本文使用的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...]]></description><category></category></item><item><title><![CDATA[浅谈分库分表]]></title><link>https://blog.csdn.net/xl890727/article/details/97674239</link><guid>https://blog.csdn.net/xl890727/article/details/97674239</guid><author>xl890727</author><pubDate>Mon, 29 Jul 2019 20:02:32 +0800</pubDate><description><![CDATA[一、分库分表背景
老调常谈，直接原因是数据量的锅。传统IT/业务量较小的企业里也许很难体现出，而在大型互联网企业里，数据量增长巨快，像我们公司埋点数据的指标拍平后，每天有亿级别的数据。按阿里巴巴给出的开发规范，单表超过500w行就要考虑分表，因为此时单机的性能已经到瓶颈。
所以，后来牛人们提出分布式。一台机器顶不上，那就多台，人多自然力量大，化整为零来解决。
具体到数据的存储上，那就是按照一定的规...]]></description><category></category></item><item><title><![CDATA[Redis批量设置Key过期]]></title><link>https://blog.csdn.net/xl890727/article/details/88869055</link><guid>https://blog.csdn.net/xl890727/article/details/88869055</guid><author>xl890727</author><pubDate>Thu, 28 Mar 2019 14:51:08 +0800</pubDate><description><![CDATA[Redis批量设置Key过期，一般有两种方式：lua脚本和pipeline1。

lua脚本

-- expire_keys.lua 存放在classpath的script目录中
for i=1, ARGV[1], 1
do
    redis.call("PEXPIRE", KEYS[i], ARGV[2]);
end

//过期时间,pexpire的过期时间为ms单位，如果是秒请用expire...]]></description><category></category></item><item><title><![CDATA[JVM4：垃圾收集器和垃圾收集算法]]></title><link>https://blog.csdn.net/xl890727/article/details/88094512</link><guid>https://blog.csdn.net/xl890727/article/details/88094512</guid><author>xl890727</author><pubDate>Sun, 03 Mar 2019 21:35:17 +0800</pubDate><description><![CDATA[前言
垃圾收集器主要考虑的工作是什么内存该回收、什么时候进行回收以及该怎么样进行回收？
通过之前的内容我们都知道，程序计数器、JVM栈及本地方法栈都是线程私有的，执行完毕自动销毁，不需要过多考虑内存回收问题；而堆和方法区是属于共享的区域，运行时创建的对象等信息都存放在这些区域中，垃圾收集器主要也是关注这部分内存的使用情况。
什么内存该回收
垃圾收集器回收的是一些已经无用的对象，判断对象无用的方法主...]]></description><category></category></item><item><title><![CDATA[JVM2：内存溢出及常用命令列表]]></title><link>https://blog.csdn.net/xl890727/article/details/84944437</link><guid>https://blog.csdn.net/xl890727/article/details/84944437</guid><author>xl890727</author><pubDate>Mon, 10 Dec 2018 18:37:01 +0800</pubDate><description><![CDATA[前言
本篇博文主要介绍使用程序触发对应的内存溢出，并附带上JVM常用的命令，供以后查看使用。
堆溢出
堆主要是用来存储对象，我们只要不断的创建对象，并防止虚拟机对对象进行回收则可以触发堆溢出。

-Xms设置堆最小值、-Xmx设置堆最大值。如果两者相同，则可以避免堆自动扩展；
-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快...]]></description><category></category></item><item><title><![CDATA[JVM1：Java内存区域]]></title><link>https://blog.csdn.net/xl890727/article/details/84286204</link><guid>https://blog.csdn.net/xl890727/article/details/84286204</guid><author>xl890727</author><pubDate>Tue, 20 Nov 2018 10:23:53 +0800</pubDate><description><![CDATA[前言
说到Java内存区域，可能很多人第一反应是“堆栈”。堆栈不是一个概念，而是两个概念，堆和栈是两块不同的内存区域。简单理解的话，

堆是用来存放对象而栈是用来执行程序的，堆的使用是需要new并配对delete/free的，在Java中是由JVM进行回收的区域，而栈是用来存储临时变量的。
堆内存和栈内存的这种划分方式比较粗糙，这种划分方式只能说明大多数程序员最关注的、与对象内存分配关系最密切的内...]]></description><category></category></item><item><title><![CDATA[JDK1.8源码：HashMap解读]]></title><link>https://blog.csdn.net/xl890727/article/details/83934232</link><guid>https://blog.csdn.net/xl890727/article/details/83934232</guid><author>xl890727</author><pubDate>Sat, 10 Nov 2018 23:00:17 +0800</pubDate><description><![CDATA[HashMap是我们最常用的集合类型之一了。也由于其高效、使用方便，我们有必要对其内部进行梳理一番。
JDK1.8源码中，关于Map的类图关系如下：

Map家族的对比
从Map的类图关系中，我们可以看出还是蛮丰富的。需要用到顺序的，可以使用TreeMap，需要线程安全的可以使用HashTable和ConcurrentHashMap。其各自特点总结如下：




类
特点




HashMap
...]]></description><category></category></item><item><title><![CDATA[JVM6：虚拟机类加载机制]]></title><link>https://blog.csdn.net/xl890727/article/details/83864899</link><guid>https://blog.csdn.net/xl890727/article/details/83864899</guid><author>xl890727</author><pubDate>Thu, 08 Nov 2018 17:30:27 +0800</pubDate><description><![CDATA[文章目录类加载时机类加载过程加载验证准备解析初始化类加载器双亲委派模型自定义类加载器
类加载时机
类从被加载到虚拟机内存中开始，到卸载出内存为止，整个生命周期包括：加载（Loading）、验证（Verification）、准备（Preparation）、解析（Resolution）、初始化（Initialization）、使用（Using）及卸载（Unloading）。其中，验证、准备和解析3个部...]]></description><category></category></item><item><title><![CDATA[【Effective Java】条41：慎用重载]]></title><link>https://blog.csdn.net/xl890727/article/details/80568648</link><guid>https://blog.csdn.net/xl890727/article/details/80568648</guid><author>xl890727</author><pubDate>Mon, 04 Jun 2018 16:05:02 +0800</pubDate><description><![CDATA[重载（Overload）和重写（Override）

重载是指，同一个类里，方法名相同，方法入参类型不同或者个数不同的方法；重写是指子类重写父类的某个方法。不仅仅是概念上的不同，在运行时调用哪种方法的选择上也不同。如首先看个重载的示例：



public class CollectionClassfier {

  public static String classify(Set&amp;amp;amp;lt;?&amp;amp;amp;g...]]></description><category></category></item><item><title><![CDATA[【Effective Java】条39：必要时使用保护性拷贝]]></title><link>https://blog.csdn.net/xl890727/article/details/80452280</link><guid>https://blog.csdn.net/xl890727/article/details/80452280</guid><author>xl890727</author><pubDate>Fri, 25 May 2018 15:20:16 +0800</pubDate><description><![CDATA[保护性拷贝

大家都知道，相比于C或者C++，Java是一门安全性的语言。但这不意味着在编程时你可以随意为之，相反，你也不得不尽最大考虑客户端代码在尽力破坏你的不可变变量等，你也必须保护性的来设计自己的程序。如：



public final class PeriodV1 {

  private final Date start;
  private final Date end;

  pu...]]></description><category></category></item><item><title><![CDATA[【Effective Java】条34：使用接口模拟扩展枚举]]></title><link>https://blog.csdn.net/xl890727/article/details/80421273</link><guid>https://blog.csdn.net/xl890727/article/details/80421273</guid><author>xl890727</author><pubDate>Wed, 23 May 2018 15:59:38 +0800</pubDate><description><![CDATA[假设某需求，有个计算器实现了加、减、乘、除的算法，但是希望同时也允许客户端自定义某些操作方法。

计算器实现的加、减、乘、除代码如下：



public enum Operation {
  PLUS(&quot;+&quot;) {
    @Override
    double apply(double x, double y) {
      return x + y;
    }
  },

  MINU...]]></description><category></category></item><item><title><![CDATA[【Effective Java】条30：使用枚举代替int常量]]></title><link>https://blog.csdn.net/xl890727/article/details/80414742</link><guid>https://blog.csdn.net/xl890727/article/details/80414742</guid><author>xl890727</author><pubDate>Wed, 23 May 2018 09:14:46 +0800</pubDate><description><![CDATA[在枚举类型出现之前，一般都常常使用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...]]></description><category></category></item><item><title><![CDATA[【Effective Java】条25：列表优先于数组]]></title><link>https://blog.csdn.net/xl890727/article/details/80366006</link><guid>https://blog.csdn.net/xl890727/article/details/80366006</guid><author>xl890727</author><pubDate>Fri, 18 May 2018 16:12:52 +0800</pubDate><description><![CDATA[数组和列表有两个很大的不同： 
1. 数组是协变，列表是不变的。意思是当类A是类B的子类时，则A[]是B[]的子类；而对于列表，对于任何两个不同的类型Type1和Type2，都不会存在List&amp;lt;Type1&amp;gt;是List&amp;lt;Type2&amp;gt;的子类或者父类。


数组类型是具体的，即数组明确知道元素的类型并强制在运行时确定元素的类型；列表是擦除的，所以在编译的时候就会明确要求类型统一。...]]></description><category></category></item><item><title><![CDATA[【Effective Java】条23-24：不要使用原生态类型-消除检测的代码警告]]></title><link>https://blog.csdn.net/xl890727/article/details/80353952</link><guid>https://blog.csdn.net/xl890727/article/details/80353952</guid><author>xl890727</author><pubDate>Thu, 17 May 2018 17:20:14 +0800</pubDate><description><![CDATA[在使用泛型的时候，禁止直接声明为原生态类型。如：



List list = new ArrayList();

而应该直接指定具体的参数类型，如：



List&amp;lt;String&amp;gt; list = new ArrayList();

如果真的不能确定具体的参数类型，那可以使用无限制的通配符类型：



List&amp;lt;?&amp;gt; list = new ArrayList();

主要原...]]></description><category></category></item></channel></rss>