<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[matrixZCL的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/matrixZCL</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; matrixZCL]]></copyright><item><title><![CDATA[Java服务和Gradle禁用代理]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/136908805</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/136908805</guid><author>matrixZCL</author><pubDate>Thu, 21 Mar 2024 14:52:11 +0800</pubDate><description><![CDATA[开启了VPN的情况下，Java服务进行http请求，以及Gradle下载依赖会走代理，某些场景会导致网络问题。]]></description><category></category></item><item><title><![CDATA[HashMap源码解析]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/112743230</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/112743230</guid><author>matrixZCL</author><pubDate>Sun, 17 Jan 2021 14:18:16 +0800</pubDate><description><![CDATA[前言


本篇文章来介绍我们常用的集合类 HashMap，它通过散列函数将数据映射到表中的某个位置，以提升查询速度。其底层用于存放数据的数组也叫散列表


所谓散列函数，简单来说就是将一个无限大的集合（在 HashMap 中，key值是一个无限大集合），经过 hash 运算取模，均匀的分布在一个有限的集合（我们定义的哈希表容量，比如长度 16 的数组）


我们知道 Java 中的 HashMap 底层是一个数组，数组的每个元素是一个链表或者红黑树。我们也知道它的一些特性，比如允许key、value 可以为]]></description><category></category></item><item><title><![CDATA[Redis源码解析-skiplist跳跃表]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/111877519</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/111877519</guid><author>matrixZCL</author><pubDate>Mon, 28 Dec 2020 23:48:21 +0800</pubDate><description><![CDATA[前言

跳跃表是一种有序数据结构，查找和插入操作的平均时间复杂度都是O(log n)。与常用的自平衡搜索树相比，例如红黑树，跳跃表通过多层链表实现，其结构简单易于实现，其查询删除效率通常堪比红黑树。本篇文章会对跳跃表简要说明，并重点分析Redis跳跃表核心源码
其他文章：Redis简单动态字符串SDS源码解析
正文

1. 跳跃表
跳跃表是通过多层有序链表实现的。如下图的有序链表，假设需要查找等于7的元素，必须从头结点（元素为1）依次遍历链表，共经过7次查询比较，找出目标结点。也就是其查询时间复杂度为O(1]]></description><category></category></item><item><title><![CDATA[ArrayList源码解析]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/110943732</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/110943732</guid><author>matrixZCL</author><pubDate>Thu, 10 Dec 2020 00:00:29 +0800</pubDate><description><![CDATA[前言

在业务场景以及日常开发中，ArrayList往往是最频繁使用的List实现类，这由它的结构以及特性决定。ArrayList顾名思义，其底层是由数组实现，因此查询时间复杂度是常数级别的，再加之有一些小优化，查询速度会更快。由于其底层是数组实现，插入和删除都是O（n）级别的。业务场景往往是多读少写的，因此ArrayList就很适合。下面就来解析ArrayList的源码以及常见方法的实现

本篇文章基于JDK8

正文

1. 成员变量
首先看一下它的成员变量

DEFAULT_CAPACITY = 10]]></description><category></category></item><item><title><![CDATA[Visual Studio Code debug Redis]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/110211515</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/110211515</guid><author>matrixZCL</author><pubDate>Fri, 27 Nov 2020 00:12:26 +0800</pubDate><description><![CDATA[前言
阅读Redis源码避免不了debug，直接使用GDB调试很不方便。本文分享使用Visual Studio Code调试Redis的方式。
环境：MacOSX，Redis5.0
正文

1. 插件市场安装所需编译器
我这里导入源码后到目录结构如下图。首次下载记得进入根目录编译
cd redis-5.0.0
make


2.  添加debug所需配置


注意 上图选中redis-server是可执行文件路径，编译后才会有
贴出我的配置
{
    "version": "0.2.0",
    "co]]></description><category></category></item><item><title><![CDATA[一分钟彻底掌握Java位运算]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/109960197</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/109960197</guid><author>matrixZCL</author><pubDate>Sun, 22 Nov 2020 18:37:49 +0800</pubDate><description><![CDATA[前言
在阅读源码的时候，经常会碰到位运算，例如Java8中的HashMap部分源码。不同语言有各自的位运算方式，又大同小异。本篇文章带你一分钟彻底掌握Java中的位运算
    /**
     * 这段代码是计算hashcode的，其中的位运算和异或运算是为了降低hash碰撞概率
     */
    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCod]]></description><category></category></item><item><title><![CDATA[Redis源码解析-SDS简单动态字符串]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/109877167</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/109877167</guid><author>matrixZCL</author><pubDate>Fri, 20 Nov 2020 22:34:02 +0800</pubDate><description><![CDATA[前言

SDS是Redis基础数据结构之一，不同于C字符串（以/0结尾，无法保证二进制安全），SDS为Redis定义的一种抽象类型，该类型有诸多优点如

获取字符串长度时间复杂度O(1)
高效的扩容机制，还能杜绝缓冲区溢出
惰性释放空间，减少内存重分配次数以提高性能
二进制安全
兼容部分C字符串函数

正文

1. 获取源码
自行官网获取，SDS字符串源码主要在sds.c中如下图

2. SDS数据结构
以下代码是数据结构的定义，可以看到字符串有五种定义。只有第一种结构不一样，下面四种结构类似
//sds数]]></description><category></category></item><item><title><![CDATA[mac彻底卸载IDEA等Intellij家族软件]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/109813912</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/109813912</guid><author>matrixZCL</author><pubDate>Thu, 19 Nov 2020 15:34:41 +0800</pubDate><description><![CDATA[这里我以卸载Clion为例。其他Intellij家族的软件例如idea卸载方式相同

1.首先前往application把应用移动到废纸篓
2.彻底删除残留文件

如果是其他软件，例如idea，只需要把最后的目录CLion2019.3改为idea的以同样方式删除

rm -rf ~/Library/Preferences/CLion2019.3
rm -rf ~/Library/Caches/CLion2019.3
rm -rf ~/Library/ApplicationSupport/CLion2019.]]></description><category></category></item><item><title><![CDATA[【Docker】Tomcat镜像构建与应用集成]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/109438787</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/109438787</guid><author>matrixZCL</author><pubDate>Sun, 01 Nov 2020 22:01:57 +0800</pubDate><description><![CDATA[前言
本篇文章需要了解Docker基础知识，以及Dockerfile的使用
参考文章：Dockerfile构建镜像与命令详解
正文
1. 拉取tomcat镜像
docker search tomcat      //查询可用的tomcat镜像
docker pull tomcat        //这里我选择了star数（人气）最高的版本


2. 启动容器
启动后通过docker ps命令查看已启动的容器，发现容器正在运行，但是访问页面404
docker run -d -p 8080:8080 tomc]]></description><category></category></item><item><title><![CDATA[【Docker】Docker集成Nginx部署静态网站]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/109438652</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/109438652</guid><author>matrixZCL</author><pubDate>Sun, 01 Nov 2020 21:55:28 +0800</pubDate><description><![CDATA[前言
本片文章讲解如何通过nginx容器搭建一个静态网站
前置条件

了解nginx基础配置
Docker基础，以及会使用Dockerfile构建镜像，可参考这篇文章Dockerfile构建镜像与命令详解


正文
我这里已经安装好Docker环境，并拉取centos基础镜像，还是基于centos基础镜像来构建，不了解相关概念参考以上文章
1. 创建目录编写Dockerfile
我的目录结构如下，文件位置要和Dockerfile指定位置对的上


基于centos基础镜像安装nginx

FROM cent]]></description><category></category></item><item><title><![CDATA[【Docker】Dockerfile构建镜像与命令详解]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/109438430</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/109438430</guid><author>matrixZCL</author><pubDate>Sun, 01 Nov 2020 21:51:42 +0800</pubDate><description><![CDATA[前言
传统方式部署集群，你需要在每台机器搭建环境，配置各种中间件，这样不但效率低下，而且很难保证环境的一致性，而且配置如果有改动，需要挨个机器修改。
有了Docker，上述问题都能解决。但是官方镜像大多时候并不能满足需求，因此需要自己构建适用于应用的镜像。构建镜像可以以交互式方式启动并进入容器，对容器修改后退出容器并通过commit命令提交一个新的镜像，但是这种方式构建的镜像不利于后期维护。我们通常是通过编辑Dockerfile，再通过build命令来构建镜像，后面只需要看Dockerfile，镜像信息便一]]></description><category></category></item><item><title><![CDATA[【Redis运维篇】Redis高可用之哨兵模式]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/109123671</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/109123671</guid><author>matrixZCL</author><pubDate>Fri, 16 Oct 2020 19:41:44 +0800</pubDate><description><![CDATA[前言
Redis主从复制模式下，一旦主节点发生故障，需要人工干预进行故障转移，故障转移的实时性与准确性都无法保障。Redis2.6版本以上提供了Redis Sentinel（哨兵）来自动发现和转移故障，实现高可用

相关文章
启动多个Redis实例
Redis搭建主从复制

Redis Sentinel配置文件
包含一个主结点，两个从结点，三个Sentinel结点的配置文件，已上传至GitHub


正文
1.Redis Sentinel概述
Redis Sentinel包含若干个Sentinel节点和Re]]></description><category></category></item><item><title><![CDATA[【Redis运维篇】Redis结点间的主从复制]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/109100851</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/109100851</guid><author>matrixZCL</author><pubDate>Thu, 15 Oct 2020 16:59:31 +0800</pubDate><description><![CDATA[前置条件
在生产环境，Redis结点通常是单独部署在不同的物理机器上。想要在一台机器上模拟多节点，可以参考这篇文章同一台机器上启动多个Redis实例

Redis结点的主从复制

Redis实例可划分为主结点（master）和从结点（slave）
一个主结点可以有多个从结点，一个从结点只能有一个主结点
默认

1.启动redis实例
这里我启动两个实例，端口分别是6379和6380


2.建立主从关系
1.指定端口连接实例
redis-cli -p 6380

2.在6380示例执行以下命令，代表6380]]></description><category></category></item><item><title><![CDATA[【Redis运维篇】同一台机器上启动多个Redis实例]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/109083293</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/109083293</guid><author>matrixZCL</author><pubDate>Wed, 14 Oct 2020 20:46:58 +0800</pubDate><description><![CDATA[启动多个Redis实例
如果不了解redis的基本配置，可以参考这篇文章Redis的基本配置
首先拷贝并修改redis配置文件
找到redis.conf所在目录，可通过find命令查找
find / -name redis.conf

进入该目录并拷贝一份redis.conf，并编辑
cp redis.conf redis2.conf
vim redis2.conf

端口port，不要跟其他端口冲突，这里我改成6380

进程文件pidfile，redis启动时会自动分配进程号并写入文件，以下配置为了指定]]></description><category></category></item><item><title><![CDATA[【Redis运维篇】Redis的安装与配置]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/109083029</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/109083029</guid><author>matrixZCL</author><pubDate>Wed, 14 Oct 2020 20:40:14 +0800</pubDate><description><![CDATA[Redis的几种安装方式（Linux）
yum和rpm
yum本质上是下载rpm包到当前机器，并安装。因此两种安装方式有相同的特点：

都会自动添加环境变量，也就是如redis-server，redis-cli之类的命令直接可以执行

yum install redis
rpm -ivh redis.rpm    //进入到rpm包所在目录，指定包名执行

源码编译安装
需下载源码编译，它的特点是：

不会自动添加环境变量，执行redis-server，redis-cli需要到该命令下（命令就是可执行文件呢]]></description><category></category></item><item><title><![CDATA[MySQL快速生成测试数据（存储过程）]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/108758127</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/108758127</guid><author>matrixZCL</author><pubDate>Wed, 23 Sep 2020 18:06:24 +0800</pubDate><description><![CDATA[Mysql快速创建测试数据（存储过程）
1.创建测试数据库
CREATE TABLE `test_user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(11) DEFAULT NULL,
  `age` int(4) DEFAULT NULL,
  `address` varchar(256) DEFAULT NULL,
  `create_time` date DEFAULT NULL,
  PRIMARY KE]]></description><category></category></item><item><title><![CDATA[抓包分析TCP的连接与断开过程（三次握手四次挥手）]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/108182306</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/108182306</guid><author>matrixZCL</author><pubDate>Sun, 23 Aug 2020 13:48:46 +0800</pubDate><description><![CDATA[首先熟悉一下TCP头部


抓包分析三次握手过程

wireshark如何抓取指定IP的数据包？（这里的IP为我的服务器IP）

可以通过过滤框通过表达式过滤：例如ip.src47.101.210.40 抓取源主机IP的数据包，ip.dst47.101.210.40代表目标主机的数据包
因此抓取一个机器三次握手的数据包，可以用表达式ip.dst47.101.210.40 or ip.src47.101.210.40


本案例我使用个人电脑（客户端），请求个人服务器，来分析三次握手（下图前三个数据包）

客]]></description><category></category></item><item><title><![CDATA[图解什么是防火墙]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/108177313</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/108177313</guid><author>matrixZCL</author><pubDate>Sat, 22 Aug 2020 23:55:32 +0800</pubDate><description><![CDATA[防火墙的作用：用来过滤一些流量（例如有害的网络数据包）

过滤规则：是通过访问控制表 (Access-control list)对特定数据包进行过滤
例如可以通过

IP地址
协议类型
目标主机IP
端口号


防火墙的种类

网络防火墙：通常用于过滤局域网的流量，一般是在代理机上配置过滤规则，再经路由器转发到局域网的机器上。有的路由器也具有防火墙功能
主机防火墙：直接安装在个人电脑上或者服务器上。例如Linux服务器通过 systemctl status firewalld可以查看防火墙的状态



..]]></description><category></category></item><item><title><![CDATA[IDEA生成序列号插件GenerateSerialVersionUID的使用]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/107947147</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/107947147</guid><author>matrixZCL</author><pubDate>Tue, 11 Aug 2020 23:31:41 +0800</pubDate><description><![CDATA[一 到插件市场下载插件并安装，重启IDEA

二 实现了Serializable接口的类可以用这个工具生成序列号


三 也可以配置快捷键


]]></description><category></category></item><item><title><![CDATA[单例模式的Java代码实现]]></title><link>https://blog.youkuaiyun.com/matrixZCL/article/details/107752243</link><guid>https://blog.youkuaiyun.com/matrixZCL/article/details/107752243</guid><author>matrixZCL</author><pubDate>Sun, 02 Aug 2020 22:02:51 +0800</pubDate><description><![CDATA[一 饿汉式

类加载到内存后，只能在内存中有一个实例，JVM保证线程
缺点：不管是否用到，类加载时就会实例化

public class Singleton {
    private static final Singleton INSTANCE=new Singleton();

    //私有构造方法
    private Singleton(){
    }
    public static Singleton getInstance(){
        return INSTANCE;
 ]]></description><category></category></item></channel></rss>