自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(217)
  • 资源 (2)
  • 收藏
  • 关注

原创 欢迎大家访问我的个人博客,请多多关照

GeneXu’s Blog很早之前就有搭建自己博客的想法了,但平常工作、生活、学习占据了大部分时间,导致没有什么时间来搭建博客 ,其实主要是自己太懒了(¬_¬),这次过年疫情期间宅在家里,终于有时间搭建自己的博客了一开始的想法是用 Hexo + GitHub Pages 来搭建,此外 Hexo 的主题众多,挑选一款自己喜欢的就可以了,省时又省力。不过用下来的过程我发现,Hexo 的语法真的不...

2020-04-17 22:59:38 307

转载 Spring -- 06 -- JDK动态代理和CGLIB动态代理的区别

一、相关概念1、JDK 动态代理原理使用拦截器 (需要实现 InvocationHandler 接口) 加上反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用 invoke() 方法来进行处理2、CGLIB 动态代理原理使用 ASM 字节码框架 (需要实现 MethodInterceptor 接口),加载代理对象类的 Class 文件,通过修改其字节码生成子类来进行处理3、什么时候使用 JDK 动态代理、CGLIB 动态代理?如果目标对象实现了接口,默认情况下会使用 JDK

2020-12-25 14:03:26 417

原创 Spring -- 05 -- @Configuration和@Component注解的区别

在日常的开发过程中,想必大家都使用过 @Configuration 和 @Component 这两个注解吧,两者都可以将标记的类注册成为 Spring 容器中的 Bean 对象,而它们之间又有什么区别呢?让我们一起来看看一、@Configuration 注解1、源码解析@Configuration 注解内部引用了 @Component 注解@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Com

2020-12-25 13:59:07 843 1

原创 Spring -- 04 -- ApplicationEvent和Listener的使用

ApplicationEvent 和 Listener 是 Spring 为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者模式,设计初衷在于对系统业务逻辑进行解耦,提高系统的可扩展性以及可维护性一、Spring 常见内置事件ApplicationContextEventApplicationContext 事件发布基类ContextStartedEventApplicationContext 启动时发布该事件ContextStoppedEventApplica

2020-12-25 13:55:36 754 1

原创 Spring -- 03 -- @AliasFor注解的使用

一、源码解析@AliasFor 注解主要用于为注解属性声明别名@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)@Documentedpublic @interface AliasFor { @AliasFor("attribute") String value() default ""; @AliasFor("value") String attribute() default ""; Class&lt

2020-12-06 20:34:51 744

原创 SpringBoot – 06 – SpringBoot 2.x 启动流程源码解析

本文基于 SpringBoot 2.3.4.RELEASE 版本进行分析1、启动类@SpringBootApplicationpublic class SpringbootTestApplication { public static void main(String[] args) { SpringApplication.run(SpringbootTestApplication.class, args); }}该类主要为项目启动提供入口,通过 main()

2020-11-13 13:45:48 185

原创 SpringBoot – 05 – SpringBoot自动配置原理解析

本文基于 SpringBoot 2.3.4.RELEASE 版本进行分析1、启动类@SpringBootApplicationpublic class SpringbootTestApplication { public static void main(String[] args) { SpringApplication.run(SpringbootTestApplication.class, args); }}该类主要为项目启动提供入口,通过 main()

2020-10-30 16:26:16 172

原创 Tool -- 02 -- byte[]与hex互相转换

import java.util.Arrays;import java.util.stream.IntStream;/** * @title: BytesHexUtils.java * @description: bytes与hex互相转换 * @author: xj * @date: 2020/9/15 */public class BytesHexUtils { /** * @method: hexToBytes * @description: 16进制字

2020-09-15 17:03:18 441

原创 Redis -- 14 -- Redis哨兵模式搭建

官方文档:Redis Sentinel Documentation之前我们通过不同的方式搭建了 Redis 集群,但是这样的 Redis 集群有个很大的弊端,就是不具备高可用性,因为一旦 Master 挂掉之后,整个 Redis 集群将不能对外提供写入操作,因此 Sentinel (Redis 哨兵) 应运而生Redis Sentinel 是 Redis 官方提供的集群管理工具,其本身也是一个独立运行的 Redis 进程,它可以监控多个 Master-Slave 集群,当发现 Master 故障.

2020-09-07 09:59:54 316

原创 Redis -- 13 -- Redis主从同步搭建

官方文档:ReplicationRedis 主从同步是指将一台 Redis 服务器上的数据,同步到另一台或多台 Redis 服务器上,前者称为主节点 (Master),后者称为从节点 (Slave);一个主节点可以有多个从节点 (也可以没有),而一个从节点只能有一个主节点一、Redis 主从同步介绍Redis 默认使用异步复制,其特点是低延迟和高性能,是绝大多数 Redis 实例的自然复制模式,也就是说 Slave 会异步地确认从 Master 周期性接收到的数据主从同步的运行依靠以.

2020-09-07 09:17:23 423

原创 Redis -- 12 -- Redis集群搭建

官方文档:Redis cluster tutorial在搭建 Redis 集群之前,我们先来了解下相关的概念集群将多台服务器连接起来共同工作,在某种程度上,可以被看作是一台服务器,集群中单台服务器通常被称为节点负载均衡将一台服务器上要处理的请求,根据负载均衡算法分配到其他服务器上去处理,从而减少该台服务器的负载,防止因为负载过大而造成响应超时或宕机等意外情况的发生分布式将不同的业务模块部署在不同的服务器上和集群的区别在于集群是将同一个业务部署在多台服务.

2020-09-07 09:08:11 291

转载 Redis -- 11 -- 一致性哈希算法

一致性哈希算在 1997 年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题一、一致性哈希算法一致性哈希算法将哈希值空间组织成一个虚拟的圆环假设将某个哈希函数 H 的值空间为 0-2^32-1 (因为哈希值通常是一个 32 位的无符号整形)我们将这个由 2^32 个点组成的圆环称为哈希环接着对 key 进行哈希运算得到哈希值 (可以选择服务器的 IP 或主机名作为关键值进行哈希运算),这样每台服务器就可以确定其在哈希环上的位置假设有 NodeA、N

2020-09-06 22:16:31 401

原创 Redis -- 10 -- IO多路复用模型

Redis 的性能十分高效,根据官方文档 (How fast is Redis?),当客户端连接较少时,Redis 的查询效率能高达 110000 QPS;当客户端连接较多时 (如:60000 个连接),Redis 仍能够维持 50000 QPSRedis 的性能之所以如此高效,主要是因为以下几点完全基于内存,绝大部分请求是纯粹的内存操作,效率高效数据结构简单,对数据的操作也简单采用单线程,避免了不必要的上下文切换和竞争条件所谓单线程,是指 Redis 在处理客户端请求时,只有一

2020-09-06 22:12:07 516

原创 Redis -- 09 -- Redis持久化方式之RDB-AOF混合模式

RDB 和 AOF 各有其优缺点,那么有没有一种能够结合两种的混合模式,即以 RDB 作为全量备份,AOF 作为增量备份,来提高备份效率,答案是肯定的,这就是 Redis 4.0 之后推出的 RDB-AOF 混合持久化模式,其作为默认配置来使用一、RDB-AOF 相关配置aof-use-rdb-preamble# When rewriting the AOF file, Redis is able to use an RDB preamble in the# AOF file for fast

2020-08-26 21:15:19 1456 1

原创 Redis -- 08 -- Redis数据恢复

在了解完 RDB 和 AOF 的相关知识后,我们可能会存在个疑惑:如果同时存在 RDB 和 AOF 文件,那么 Redis 会通过加载谁来恢复数据呢?现在就让我们一起来看看 Redis 的数据恢复过程一、数据恢复流程如上所示,Redis 在启动时会先检查 AOF 文件是否存在,如果存在,则会直接加载 AOF 文件,而忽略 RDB 文件如果不存在,则再检查 RDB 文件是否存在,如果存在则会加载 RDB 文件,如果不存在,则会直接启动服务二、两种持久化方式的优缺点RDB优

2020-08-26 21:14:22 304

原创 Redis -- 07 -- Redis持久化方式之AOF

了解完 RDB 之后,我们再来了解下另外一种持久化方式 AOF一、AOFAOF (Append Only File)以日志的形式记录 Redis 的每一个写操作,将 Redis 执行过的所有写指令保存下来,以追加的形式保存到 AOF 文件 (默认为 appendonly.aof) 中当需要恢复数据时,Redis 会重新执行 AOF 文件中的写指令,来达到恢复数据的目的优势具有更高的数据安全性,AOF 默认同步策略为每秒同步,一次即使 Redis 服务出现问题,那么最多也

2020-08-26 21:12:48 271

原创 Redis -- 06 -- Redis持久化方式之RDB

众所周知,Redis 的数据都是存放在内存当中的,如果没有配置持久化,当 Redis 重启后数据就会全部丢失,因此我们需要开启 Redis 的持久化功能,在这里我们先来了解下其中的一种方式:RDB一、RDBRDB (Redis DataBase)在指定时间间隔内,将内存中的数据保存到磁盘中,对应产生的数据文件默认为 dump.rdb当需要恢复数据时,可以直接将快照文件加载进内存中,来达到恢复数据的目的如何持久化Redis 会单独创建 (fork) 一个子进程来进行持久化

2020-08-26 21:09:43 256

原创 Redis -- 05 -- Redis常用数据类型

在这里,我们来了解下 Redis 中常用的数据类型,它们分别是:String (字符串)、Hash (哈希)、List (列表)、Set (集合)、Sorted Set (有序集合)官方文档:An introduction to Redis data types and abstractions一、String (字符串)String 是 Redis 最基本的数据类型,一个 key 对应一个 valueString 类型是二进制安全的,也就是说 Redis 的 String 可以包含任

2020-08-26 09:34:45 219

原创 Redis -- 04 -- 配置Redis开机自启

一、编辑 redis.service 文件vim /lib/systemd/system/redis.service[Unit]Description=RedisAfter=network.target[Service]Type=forkingExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.confPrivateTmp=true[Install]WantedBy=multi-user.t

2020-08-26 09:33:20 241

原创 Redis -- 03 -- 安装Redis可能出现的问题

正常情况下,在 Redis 根目录下执行 make && make install 指令后就可以安装成功了,但是由于服务器的配置不同,因此安装过程中可能会出现些其他问题一、未安装 gcc,导致执行 make 失败解决方案:这时候我们只需要安装 GCC 即可:yum -y install gcc二、执行 make 后报错zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory

2020-08-26 09:30:10 381

原创 Redis -- 01 -- 什么是Redis

Redis (Remote Dictionary Server) 是一个开源的,高性能的 key-value 数据库,其使用 C 语言进行编写,遵守 BSD 协议,并提供了多种语言的 API,默认端口为 6379,默认有 16 个数据库,默认使用数据库 0一、特点性能高效读的速度是 110000 次/s,写的速度是 81000 次/s支持数据持久化可以将内存中的数据保存在磁盘中,重启的时候可以再次加载到内存中使用支持多种数据结构String (字符串)Hash

2020-08-26 09:25:59 213

原创 MySQL -- 14 -- MySQL(InnoDB)当前读和快照读

官方文档:Gap Locks官方文档:Next-Key Locks一、当前读当前读,会对读取的记录加锁,保证其他并发事务不会修改当前记录,读取的是记录的最新版本简单来说,当前读就是加了锁的增删改查语句,不管上的共享锁还是排他锁,均为当前读相关 SQL:select ... lock in share mode、select ... for update、update、delete、insert实现方式行锁是对单行记录上的锁行锁 + Gap 锁的组合称为.

2020-08-21 15:17:00 430

原创 MySQL -- 13 -- MySQL事务的四个特性以及四个隔离级别

事务是指作为单个逻辑工作单元执行的一系列操作,要么全部执行,要么全部不执行一、事务的四个特性 (ACID)原子性 (Atomic)事务包含的所有操作,要么全部执行,要么全部不执行一致性 (Consistency)事务应确保数据库的状态从一个一致状态转换到另一个一致状态如:拿转账来说,假设用户 A 和用户 B,两者的钱加起来一共是 2000 元,那么不管 A 和 B 之间如何转账,转几次账,事务结束后,两个用户的钱相加起来应该还为 2000 元,这就是事务的一致性隔

2020-08-20 21:54:22 196

原创 MySQL -- 12 -- MySQL存储引擎MyISAM和InnoDB在锁方面的区别(8.0)

我们知道 MyISAM 默认使用表级锁,不支持行级锁;InnoDB 默认使用行级锁,同时也支持表级锁,这里让我们来看看 MyISAM 和 InnoDB 在锁方面的具体区别一、创建测试数据生成思路利用 MySQL 内存表插入快的特点,可以先利用函数和存储过程在内存表中生成数据,然后再从内存表插入普通表中这里我们来生成两张具有 100w 条数据的学生信息表,两张表除了存储引擎不一样 (一张为 InnoDB,一张为 MyISAM),其余都一样如果要生成大量数据,需要提前在 MySQ

2020-08-20 17:31:24 195

原创 MySQL -- 11 -- MySQL存储引擎MyISAM和InnoDB之间的区别(8.0)

在 MySQL5.5 版本之前,MyISAM 是 MySQL 的默认存储引擎;从 MySQL5.5 版本开始,InnoDB 是 MySQL 的默认存储引擎官方文档:Introduction to InnoDB官方文档:The MyISAM Storage Engine一、MyISAM 存储引擎特性如上所示,共有以下特性支持 B 树索引支持备份或时间点恢复需要在服务器中实现,而不是在存储引擎中实现不支持集群数据库不支持聚集索引支持压缩数据仅当使

2020-08-20 15:50:24 359

原创 MySQL -- 10 -- MySQL联合索引最左匹配原则

一、联合索引联合索引又称复合索引,是指由多个字段组成的索引二、最左匹配原则最左匹配原则,MySQL 会一直向右匹配,如果遇到范围查询 (>、<、between、and) 就会停止匹配,如:a = 1 and b = 2 and c > 3 and d = 4,如果建立 (a, b, c, d) 顺序的联合索引,那么 d 就使用不了联合索引了;如果建立 (a, b, d, c) 顺序的联合索引,则都可以用的到,a、b、d 的顺序可以任意调整= 和 in 可以乱序,比如:

2020-08-20 15:42:07 212

原创 MySQL -- 09 -- MySQL调优之explain工具(8.0)

官方文档:EXPLAIN Output Format使用 explain 可以模拟优化器执行 SQL 语句,从而知道 MySQL 是如何处理 SQL 语句、如何分析查询语句、如何分析表结构的性能瓶颈表的读取顺序数据读取操作的操作类型哪些索引可以使用哪些索引被实际使用表之间的引用每张表有多少行数据被优化器查询此外,除了 select 语句,其他如:insert、update、delete、replace 等语句也可以使用 explain 来查询执行计划一、.

2020-08-20 13:17:26 340

原创 MySQL -- 08 -- MySQL调优之慢查询日志(8.0)

官方文档:The Slow Query Log官方文档:mysqldumpslow慢查询日志是 MySQL 提供的一种日志记录,用于记录查询时间超过 long_query_time 的 SQL,并且还要对 min_examined_row_limit 进行校验 (若扫描行数小于该参数,则不会记录到慢查询日志中)慢查询日志可用于查找执行时间较长的查询,用于 SQL 优化,默认不开启,需要我们通过 slow_query_log 来手动设置此外慢查询日志不仅支持将日志记录写入文件中,也支持将日志.

2020-08-20 09:45:58 1064

原创 MySQL -- 07 -- MySQL聚集索引和非聚集索引的区别

官方文档:Clustered and Secondary Indexes一、聚集索引聚集索引,又称聚簇索引,该索引中键值的逻辑顺序与数据行的物理顺序相同,每个表 (InnoDB) 只能有一个聚集索引聚集索引的选取规则如下如果存在主键,则选取该主键索引作为聚集索引如果不存在主键,则选取该表的第一个唯一非空索引作为聚集索引如果既不存在主键,也不存在合适的唯一键,则 InnoDB 会在内部生成一个隐藏的主键,并选取该主键索引作为聚集索引在 InnoDB 中,聚集索引.

2020-08-20 09:45:11 547

原创 MySQL -- 06 -- MySQL索引优化

一、运用二叉查找树二叉查找树 (Binary Search Tree),又称二叉排序树 (Binary Sort Tree),亦称二叉搜索树,是数据结构中的一类,在一般情况下,查询效率要比链表结构要高二叉查找树定义1、二叉查找树的每个节点最多有两个子树,称为左子树和右子树2、若左子树不为空,则左子树上所有节点的值均小于它的根节点的值3、若右子树不为空,则右子树上所有节点的值均大于它的根节点的值二叉查找树使用二分法进行查找,因为是对半搜索,所以其时间复杂度为 O(log

2020-08-19 09:50:33 234

原创 MySQL -- 05 -- 如何设计一个关系型数据库

关系数据库管理系统 (Relational Database Management System:RDBMS) 是指包括相互联系的逻辑组织和存取这些数据的一套程序 (数据库管理系统软件)。关系数据库管理系统就是管理关系数据库,并将数据逻辑组织起来的系统一、模块划分数据库最主要的功能就是存储我们的数据,因此它会有一个存储模块来存储我们的数据,存储模块就类似于我们的 OS 文件系统,将数据最终持久化存入磁盘中,如:机械硬盘、SSD 固态硬盘可是光有存储是不行的,我们还需要组织并用到这些数据,

2020-08-18 16:46:26 411

原创 Collection -- 02 -- BlockingQueue源码解析

BlockingQueue,即阻塞队列,其继承于 Queue,用于提供可阻塞的入队和出队操作BlockingQueue 主要用于生产者 - 消费者模式,在多线程场景时,生产者线程在队列尾部添加元素,而消费者线程则在队列头部消费元素,通过这种方式能够达到将任务的生产和消费进行隔离的目的一、队列实现ArrayBlockingQueue一个由数组结构组成的有界阻塞队列该队列容量是有有限的,在初始化时,必须指定容量大小,容量大小一旦指定,就无法改变该队列以先进先出 (FIFO) 的方法

2020-07-26 21:11:05 178

原创 Concurrent -- 08 -- Exchanger用法解析

Exchanger,即交换器,是一个同步工具类,用于控制两个线程在同步点处的数据交换Exchanger 提供了一个同步点 (调用 exchange() 方法的地方即为同步点),当一个线程先执行到达同步点后,会被阻塞,直到另一个线程也进入到同步点为止,当两个线程都到达该同步点后,就会进行数据交换举例说明 1ExchangerTest.javapublic class ExchangerTest { public static void main(String[] args) {

2020-07-26 15:48:50 147

原创 Concurrent -- 07 -- Semaphore源码解析

Semaphore,即信号量,是一个同步工具类,用于控制某个资源可被同时访问的线程个数一、内部类解析Syncabstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 1192457210091910933L; // Sync 构造方法,初始化许可数目 Sync(int permits) { set

2020-07-26 15:44:23 114

原创 Concurrent -- 06 -- CyclicBarrier源码解析

CyclicBarrier,即循环栅栏,是一个同步工具类,用于阻塞当前线程,等待其他线程,所有线程都必须同时到达栅栏位置后,才可以继续执行当所有线程都达到栅栏位置后,可以触发执行一个预先设置好的任务一、内部类解析Generationprivate static class Generation { // 标记当前代是否损坏 boolean broken = false;}Generation 是 CyclicBarrier 的内部类,用于帮助 CyclicBarrie

2020-07-26 15:27:23 154

原创 Concurrent -- 05 -- CountDownLatch源码解析

CountDownLatch,即倒计时器,是一个同步工具类,用于协调多个线程之间的同步,常用来控制线程等待,它可以让某个线程一直处于等待状态直到倒计时结束后再开始执行一、内部类解析Syncprivate static final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 4982264981922014374L; // Sync 构造方

2020-07-25 23:57:50 127

原创 Concurrent -- 04 -- HashMap源码解析(JDK8)

HashMap 是我们日常开发过程中使用的最多的集合类之一,最早出现在 JDK2 中,以 key、value 的形式保存具有映射关系的两个数据 (由 key、value 两个值组成的键值对),其中 key 是不可重复的,value 是可重复的,key 和 value 都可以存放 null,但 key 只能存在一个 null,value 可以存在一个或多个 null简单地了解了 HashMap 后,让我们来深入了解下它的底层实现原理一、数据结构在 JDK8 之前的版本中,HashMap 底层采用.

2020-07-25 17:21:27 286

原创 Official Account -- 03 -- Java微信公众号模板消息

模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等官方文档:模板消息接口一、公共类WXConstants.java/** * 获取access_token接口 * 此处的ACCESS_TOKEN与授权登陆获得的ACCESS_TOKEN不同,有效期为7200s */public static final String GET_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bi

2020-07-23 18:17:56 471

原创 Official Account -- 02 -- Java微信公众号获取access_token

access_token 是微信公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用 access_tokenaccess_token 的存储至少要保留 512 个字符空间,有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效官方文档:获取Access token一、配置 IP 白名单首先我们需要在微信公众平台上设置 IP 白名单,也就是本机的外网 IP 地址,否则将无法获取 access_token路径:开发 --> 基本配置 -

2020-07-23 18:06:43 659

原创 ThreadLocal -- 03 -- ThreadLocal源码解析

ThreadLocal,用于提供线程局部变量,常用于多线程环境下对非线程安全资源的并发访问,如果我们不想加锁,就可以使用 ThreadLocal 来使得每个线程都持有一个该资源的副本,各个线程之间互不干扰ThreadLocal 与各种锁机制相比,侧重于以空间换时间,来提高并发效率一、内部类解析SuppliedThreadLocal<T>static final class SuppliedThreadLocal<T> extends ThreadLocal<T&g

2020-07-22 11:46:43 179

微信公众号开发微信支付工具类

微信支付工具类,我自己的博客也用到了https://blog.csdn.net/goodbye_youth/article/details/80552265

2018-06-11

微信公众号开发消息加解密工具类

该工具类主要用于微信公众号消息的加解密,我自己的博客也用到了https://blog.csdn.net/goodbye_youth/article/details/80653132

2018-06-11

空空如也

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

TA关注的人

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