自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

贰拾壹

个人博客www.amoshuang.com

  • 博客(145)
  • 资源 (5)
  • 收藏
  • 关注

原创 Redis 过期键删除策略

Redis 中数据库键的过期时间都保存在过期字典中,当一个键过期了,Redis 存在三种不同的删除策略:定时删除、惰性删除和定期删除定时删除定义在设置键的过期时间的同时创建一个计时器,让定时器在键过期时间来临时,立即执行对键的删除操作。定时删除策略对内存是最友好的:通过使用定时器,定时删除策略可以保证过期键会尽快被删除,并且释放过期键所占用的内存。但是另一方面,它对 CPU 时间是嘴...

2019-02-25 20:29:16 482

原创 int 与 Integer 的区别

int和Integer的区别Integer是int的包装类,int则是java的一种基本数据类型Integer变量必须实例化后才能使用,而int变量不需要Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值Integer的默认值是null,int的默认值是0延伸由于Integer变量实际上是对一个Integer对象...

2019-02-24 22:47:32 298

原创 Java 平台无关性的基石

Java 在刚刚诞生之初就提出过一个非常著名的口号:“一次编写,到处运行”, 这句话充分表达了软件开发人员对冲破平台界限的渴望在竞争激烈的 IT 领域,各种不同的硬件体系结构和不同的操作系统肯定会长期并存发展。“平台无关性” 的理想最终实现在操作系统的应用层上: Sun 公司以及其他虚拟机提供商发布了许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码,从...

2019-02-18 12:00:14 462

原创 Spring 中 IoC 容器简介

IoC 是一种通过描述来生成或者获取对象的技术,可以说 Spring 是一种基于 IoC 容器编程的框架在一个系统中可以生成各种对象,并且这些对象都需要进行管理。为了描述这些对象关系,我们需要一个容器。在 Spring 中把每一个需要管理的对象称为 Spring Bean ,而管理这些 Bean 的容器就被称为 Spring IoC 容器。IoC 容器需要具备两个基本的功能:通过描述管...

2019-02-02 16:29:19 370

原创 HotSpot 虚拟机垃圾回收算法实现

作为使用范围最广的虚拟机之一HotSpot,必须对垃圾回收算法的执行效率有严格的考量,只有这样才能保证虚拟机高效运行枚举根节点从可达性分析中从 GC Roots 节点找引用链这个操作为例,可以作为 GC Roots 的节点主要在全局性的引用(例如常量或者类静态属性)与执行上下文(例如栈帧中的本地变量表)中。但是现在很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,那么必然会消耗很...

2019-02-01 20:18:00 182

原创 多线程死锁的产生原因以及如何避免

多线程以改善了系统资源的利用率并且提高了系统的处理能力。但是,并发执行同时也带来了新的问题——死锁。所谓的死锁就是多个线程因竞争资源而造成的一种互相等待,如果没有外力作用,这些线程都将无法继续执行死锁产生的原因系统资源的竞争通常系统中拥有的不可剥夺资源,其数量不足以满足多个线程运行的需要,使得线程在 运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可剥夺资源的竞争 才可能...

2019-02-01 20:16:04 512

原创 Java异常实战——OutOfMemoryError

在Java虚拟机规范描述中,除了程序计数器外,虚拟机内存的其他几个运行区域都有发生 OOM 异常的可能。在这里,用代码验证各个运行时区域存储的内容并讨论该如何进行处理Java堆溢出Java 堆用于存储对象实例,只要不断创建对象,并且保证 GC Roots 到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么对象数量达到最大堆的容量限制之后就会产生内存溢出异常。异常再现代码采用如下虚...

2019-01-30 11:00:09 147

原创 MySQL数据库中的四种隔离级别

事务的隔离性比想象的要复杂,在 SQL 标准中定义了四种级别的隔离级别。通常而言,较低级别的隔离通常可以执行更高的并发,系统的开销也更低READ UNCOMMITTED该级别为未提交读。在该级别中,事务中的修改即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读。这个级别会导致很多的问题,从性能上来说,它不会比其他级别好太多,但缺乏其他级别的很多好处。除非真的有非...

2019-01-29 16:15:00 194

原创 Java运行时数据区概述

Java 虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,如图所示:程序计数器程序计数器是一块比较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型中(仅是概念模型,各种虚拟机可能会通过一些更加高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、...

2019-01-20 20:00:30 134

原创 MySQL 字符集和校对

字符集是指一种从二进制编码到某类字符符号的映射,校对是一组用于某个字符集的排序规则。每一类编码字符都有其对应的字符集和校对规则

2019-01-20 11:09:48 193

原创 MySQL高级特性——绑定变量

从MySQL 4.1 版本开始,就支持服务器端的绑定变量,这大大提高了客户端和服务器端数据传输的效率介绍当创建一个绑定变量 SQL 时,客户端会向服务器发送一个SQL语句的原型。服务器端收到这个SQL语句框架后,解析并存储这个SQL语句的部分执行计划,返回个客户端一个 SQL 语句处理句柄。以后每次执行这类查询,客户端都指定使用这个句柄。绑定变量的SQL,使用问号标记可以接受参数的位置,...

2019-01-19 14:51:58 779

原创 MySQL高级特性之分区表

对于用户而言,分区表是一个独立的逻辑表,但是在底层由多个物理子表组成。实现分区的代码实际上是对一组底层表的句柄对象的封装,对分区表的请求都会通过句柄对象转化成对存储引擎的接口调用意义MySQL在创建表的时候可以通过使用 PARTITION BY 子句定义每个分区存放的数据。在执行查询的时候,优化器根据分区定义过滤那些没有我们需要的数据的分区,这样查询就可以无需扫描所有分区——只需要查找包含...

2019-01-17 15:03:36 263

原创 MySQL优化特定类型的查询

优化关联查询如果想要优化使用关联的查询,我们需要特别留意以下几点:确保ON或者USING子句中的列上有索引。在创建索引的时候需要考虑到关联的顺序。当表A和表B用列c关联的时候,如果优化器的关联顺序是B、A,那么就不需要在B表的对应列上建索引。除非有其他理由,否则只需要在关联顺序的第二个表的对应列上创建索引,没有用的索引只会带来额外的负担。确保任何的GROUP BY 和 ORDER BY 中...

2019-01-17 10:14:04 115

原创 MySQL优化COUNT()查询

COUNT()聚合函数,以及如何优化使用了该函数的查询,很可能是最容易被人们误解的知识点之一COUNT()的作用COUNT()是一个特殊的函数,有两种非常不同的作用:统计某个列值的数量统计行数统计列值在统计列值时,要求列值是非空的,即不统计NULL。如果在COUNT()的括号中指定了列或者列的表达式,则统计的就是这个表达式有值的结果数。统计结果集的行数当MySQL确认括号内...

2019-01-14 11:57:21 479

原创 设计模式之迭代器模式——Java语言描述

迭代器模式是Java和.NET编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示

2019-01-14 10:27:18 126

原创 设计模式之解释器模式——Java语言描述

解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在SQL解析、符号处理引擎等介绍意图给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。应用实例编译器、运算表达式计算等优点可拓展性比较好,灵活增加了新的解释表达式的方法易于实现简单文法缺点可利用...

2019-01-14 09:56:43 120

原创 设计模式之责任链模式——Java语言描述

责任链模式为请求创建了一个接受者对象的链。这种模式给予请求的类型,对请求的发送者和接受者进行解耦。这种类型的设计模式属于行为模式。在这种模式下,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该对象,那么它会把相同的请求传给下一个接收者,以此类推介绍意图避免请求发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处...

2019-01-13 17:51:38 133

原创 设计模式之外观模式——Java语言描述

外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。它想现有的系统添加了一个接口,以隐藏系统的复杂性介绍意图为子系统中的一组接口提供了一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用应用实例电脑只要按下开机键,就会自动执行开机的程序Java的三层开发模式优点减少系统相互依赖提高灵活性提高安全性缺点不符合开闭原则,...

2019-01-12 14:37:38 107

原创 MySQL查询执行的基础——查询优化处理

查询的生命周期的下一步是将一个SQL转换成一个可执行计划,MySQL再按照这个计划和存储引擎进行交互语法解析器和预处理首先,MySQL通过关键词将SQL语句进行解析,并生成一颗对应的“解析树”。MySQL解析器将使用MySQL语法规则验证和解析查询。比如是否使用了错误的关键字,关键字的顺序是否正确,或者引号是否能够正确的前后匹配。预处理器则会根据一些MySQL规则进一步检查解析树是否合法...

2019-01-11 17:37:19 162

原创 设计模式之组合模式——Java语言描述

组合模式又叫做部分整体模式,适用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次介绍意图将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性优点高层模块调用简单节点自由增加缺点在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口类,违反了依赖导致的原则实现创建一个Em...

2019-01-11 11:20:54 166

原创 设计模式之过滤器模式——Java语言描述

过滤器模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来实现创建一个Person对象、Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表。CriteriaPatternDemo,我们的演示类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Person 对象的列表。创建一个Person类public class...

2019-01-11 10:49:48 112

原创 MySQL查询执行的基础

当我们希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点,很多查询优化工作实际上就是遵循一些原则让优化器能够按照预想的合理方式运行当我们想向MySQL发送了一个请求时,MySQL到底做了什么:客户端首先发送一条查询请求给服务器服务器首先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果,否则进入下一阶段。服务器端...

2019-01-10 17:01:38 381

原创 设计模式之桥接模式——Java语言描述

桥接适用于把抽象化和实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构性模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦这种模式设计到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可以被结构化改变而不互相影响。介绍设计模式意图: 将抽象部分和实现部分分离,使得它们可以独立变化。优点:抽象和实现的分离优秀的拓展能力缺点: 桥接模式的...

2019-01-10 11:53:59 137

原创 让MySQL查询更加高效——对查询进行重构

在优化有问题的查询时,目标应该是找到一个更优的方法获得实际需要的结果,而不是一定总是要求从MySQL获取一模一样的结果集

2019-01-07 21:45:34 261

原创 慢查询基础:优化数据访问

查询性能低下最基本的原因是访问的数据太多。某些查询不可避免的需要筛选大量数据,但这并不常见。大部分性能低下的查询都可以通过减少访问的数据量的方式进行优化对于低效的查询,可以通过下面两个步骤进行分析:确认应用程序是否在检索大量超过需要的数据。这通常意味着访问了太多的行,但有时候也可能是访问了太多的列确认MySQL服务器层是否在分析大量超过需要的数据行是否向数据库请求了不需要的数据有...

2019-01-05 19:12:28 272

原创 设计模式之原型模式——Java语言描述

原型模式是用于创建重复对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的方式这种模式实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则适合采用这种模式。应用实例:细胞分裂Java中的Object.clone()方法优点:性能较高逃避构造函数的约束缺点:配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类...

2019-01-05 10:35:50 115

原创 设计模式之建造者模式简明示例

建造者模式将一个复杂对象的创建和它的表示分离,使用同样的创建过程可以创建不同的表示应用实例在Java中,建造者模式是一种常见的设计模式,StringBuilder以及okhttp3.Request都应用了建造者模式:OkHttpClient client = new OkHttpClient();Request request = new Request.Builder() ...

2019-01-04 11:44:41 276

原创 MyBatis中映射器Mapper概述

MyBatis真正强大之处在于它的映射器。因为它异常强大并且编写相对简单,不仅比传统编写SQL语句做的更好并且能节省将近95%的代码量XML中顶级元素汇总cache: 给定命名空间的缓存配置cache-ref: 其他给定命名空间缓存配置的引用resultMap: 最复杂也是最强大的元素,用来描述如何从数据库结果集中加载对象sql: 可以被其他语句引用的重复语句块insert: 映...

2019-01-03 20:52:56 233

原创 设计模式之工厂模式——Java语言描述

工厂模式是Java中常见的设计模式之一,该设计模式属于创建型模式,提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象介绍应用实例当我们需要购买一辆汽车时,只需要从工厂提货而不需要知道汽车是如何制造出来的以及这个汽车的具体实现。优点调用者只需要知道对象的名称就可以创建一个对象拓展性高屏蔽产品的具体实...

2019-01-03 14:43:32 149

原创 Mybatis入门实例

MyBatis 简介MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。构建项目使用gr...

2019-01-02 19:26:30 122

原创 设计模式简介

设计模式代表了最佳实践,是开发人员在开发过程中面临的一般问题的解决方案。这些解决方案是众多开发人员经过相当长的一段时间的试验和错误总结出来的历史设计模式是一套被反复使用,经过考验的设计经验的总结。使用设计模式是为了重用代码,增强代码的可读性。1994年,由Gang of Four在《设计模式-可复用的面向对象软件元素》中首次提到了软件开发中的设计模式的概念。他们所提出的设计模式主要是基于...

2019-01-02 13:33:54 125

原创 MySQL中冗余和重复索引的区别

MySQL允许在单个列上创建多个索引,无论是有意还是无意,MySQL需要单独维护这些重复索引,优化器在优化查询时也需要逐个考虑这会影响MySQL的性能概念阐述重复索引: 在相同的列上按照相同的顺序创建的相同类型的索引。应该避免创建这样的重复索引,发现之后也应该立即移除。冗余索引: 两个索引按照相同的顺序覆盖了相同的列。创建的原因一般来说,我们有时候会在不经意间创建了重复索引,例如下面...

2019-01-02 12:07:10 1261

原创 MySQL中InnoDB和MyISAM引擎的区别

直到MySQL5.5之前,MySQL的默认殷勤都是MyISAM。随着新版本的发布,InnoDB成功上位,成为MySQL的默认引擎。这两种引擎的使用都非常广泛,那么它们有什么区别和联系简短介绍InnoDB: 默认的事务型引擎,是最重要也是使用最广泛的存储引擎。可以用来处理大量的短期事务,具有优秀的性能以及自动崩溃回复特性。MyISAM: 非事务型引擎,提供了大量的特性,包括全文索引、压缩...

2019-01-01 16:56:46 1078

原创 Java中final修饰符对不同变量的不同影响

final修饰符可以用来修饰类、方法和变量,用于表示它修饰的类、方法和变量不可改变。final修饰变量时,表示该变量一旦获得了初始值就不可被改变。由于final变量获取初始值之后就不能重新赋值,所以final修饰成员变量和局部变量时有一定程度的不同。final成员变量成员变量是随类初始化或者对象初始化而初始化的。在初始化时,系统会为类变量或者实例变量分配内存并分配默认值。对于final...

2018-12-27 14:02:34 286

原创 Java多线程中避免在多生产者和多消费者场景中出现假死

在多线程编程中,如果所有线程全部都经由wait()方法进入等待状态,那么程序就进入了假死状态程序示例考虑这个例子,来自《Java多线程编程核心技术》:生产者类P://生产者public class P { private String lock; public P(String lock) { super(); this.lock = lock; } publi...

2018-12-25 16:54:29 518 2

原创 Git常用命令

来自阮一峰老师的博客文章《常用 Git 命令清单》,感谢仓库# 在当前目录新建一个Git代码库$ git init# 新建一个目录,将其初始化为Git代码库$ git init [project-name]# 下载一个项目和它的整个代码历史$ git clone [url]配置# 显示当前的Git配置$ git config --list# 编辑Git配置文件$...

2018-12-24 21:25:25 101

原创 log4j2结构浅析以及入门示例

log4j2是Java的日志工具log4j的升级版,它继承了log4j的优点的同时对API进行了一些改变结构log4j2的主要类图:logger的层次和普通的System.out.println相比,日志工具的首要优点就在于它能够禁用某些日志语句的同时允许其他日志语句不受阻碍的输出。这在log4j1.x中是通过各个logger之间的关系维持的,而在log4j2.x中则是通过logg...

2018-12-21 22:26:12 306

原创 JVM常用调优案例

在本文中会介绍一些常用的JVM调优思路以及调优方法,这些方法是为了解决某个具体问题,提高某个局部性能而特别设置的。 使用它们可能会对其他性能指标产生不良的影响,应该在实际应用中,根据具体情况进行折中和权衡。总结自《Java程序性能优化》

2018-12-19 12:37:25 912

原创 设计模式之代理模式——Java语言描述

代理模式是一种常见的设计模式,它使用代理对象完成用户请求,屏蔽用户对真实对象的访问

2018-12-16 21:18:31 161

原创 六种主要的垃圾回收算法和思想

Java语言的一大特点就是可以自动进行垃圾回收处理,无需开发人员过于关注系统资源的释放情况。自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担。一个不合适的垃圾回收方法和策略将会对系统性能造成不良影响。

2018-12-13 16:00:06 728

全球城市数据表和json数据

正确的创建和使用索引是实现高性能查询的基础。高效的选择和使用索引有很多方式,其中有些是针对特殊案例的优化方法,有些则是针对特定行为的优化

2018-11-26

MySQL技术内幕(第五版)

关注公众号进击的代码Amos,回复书名免费领 本书是国内目前唯一的一本关于innodb的著作,由资深mysql专家亲自执笔,中外数据库专家联袂推荐,权威性毋庸置疑。 内容深入,从源代码的角度深度解析了innodb的体系结构、实现原理、工作机制,并给出了大量最佳实践,能帮助你系统而深入地掌握innodb,更重要的是,它能为你设计和管理高性能、高可用的数据库系统提供绝佳的指导。注重实战,全书辅有大量的案例,可操作性极强。 全书首先全景式地介绍了mysql独有的插件式存储引擎,分析了mysql的各种存储引擎的优势和应用环境;接着以innodb的内部实现为切入点,逐一详细讲解了innodb存储引擎内部的各个功能模块,包括innodb存储引擎的体系结构、内存中的数据结构、基于innodb存储引擎的表和页的物理存储、索引与算法、文件、锁、事务、备份,以及innodb的性能调优等重要的知识;最后深入解析了innodb存储引擎的源代码结构,对大家阅读和理解 innodb的源代码有重要的指导意义。

2018-10-09

Web性能权威指南

Web性能权威指南

2018-09-21

Java多线程编程核心技术

Java多线程编程核心技术

2018-09-20

图解HTTP彩色版

图解HTTP彩色版

2018-09-19

空空如也

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

TA关注的人

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