<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[MineCodelife的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/MineCodelife</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; MineCodelife]]></copyright><item><title><![CDATA[spring学习之Data Access]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/118731877</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/118731877</guid><author>MineCodelife</author><pubDate>Fri, 16 Jul 2021 14:20:42 +0800</pubDate><description><![CDATA[一图千言之spring模块组成



Transaction Management

全面的事务支持。Spring Framework 为事务管理提供了一致的抽象，具有以下优点


	跨不同事务 API 的一致编程模型，例如 Java 事务 API (JTA)、JDBC、Hibernate 和 Java Persistence API (JPA)。
	
	
	支持声明式事务管理。
	
	
	比复杂的事务 API（例如 JTA）更简单的用于程序化事务管理的 API。
	
	
	与 Spring 的数据访问抽象]]></description><category></category></item><item><title><![CDATA[Git使用]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/118568905</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/118568905</guid><author>MineCodelife</author><pubDate>Thu, 08 Jul 2021 21:23:05 +0800</pubDate><description><![CDATA[https://git-scm.com/

Git是一个免费的、开源的分布式版本控制系统，可以快速高效地处理从小型到大型的各种项目。具有方便的本地分支、方便的临时区域和多个工作流等特性。

https://git-scm.com/docs 文档


工作区（Working Directory）

在电脑里能看到的目录，比如我的learngit文件夹就是一个工作区



版本库（Repository）

工作区有一个隐藏目录.git是Git的版本库，其中最重要的就是称为stage（或者叫index）的暂存区.]]></description><category></category></item><item><title><![CDATA[再看docker系列（一）]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/118162824</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/118162824</guid><author>MineCodelife</author><pubDate>Wed, 30 Jun 2021 21:14:57 +0800</pubDate><description><![CDATA[https://docs.docker.com/get-started/overview/

常见概念


What is Image?

一切皆对象一切皆镜像。一个镜像是用于创建一个容器指令的只读模板。通常，一个镜像基于另一个镜像，并带有一些额外的自定义。要构建您自己的镜像，您需要使用简单的语法创建一个Dockerfile，用于定义创建镜像和运行镜像所需的步骤。Dockerfile 中的每条指令都会在镜像中创建一个层。当您更改 Dockerfile 并重建映像时，只会重建那些已更改的层layer

A..]]></description><category></category></item><item><title><![CDATA[zookeeper]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/117923416</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/117923416</guid><author>MineCodelife</author><pubDate>Wed, 16 Jun 2021 11:24:50 +0800</pubDate><description><![CDATA[http://zookeeper.apache.org/

常见名词

数据模型


zookeeper 的视图结构和标准的文件系统非常类似，每一个节点称之为 ZNode，是 zookeeper 的最小单元。每个 znode 上都可以保存数据以及挂载子节点。构成一个层次化的树形结构

持久节点（PERSISTENT） 创建后会一直存在 zookeeper 服务器上，直到主动删除
	持久有序节点（PERSISTENT_SEQUENTIAL） 每个节点都会为它的一级子节点维护一个顺序
	临时节点(EPHEMER]]></description><category></category></item><item><title><![CDATA[MySQL索引]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/117320405</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/117320405</guid><author>MineCodelife</author><pubDate>Thu, 27 May 2021 15:39:42 +0800</pubDate><description><![CDATA[索引


首先数据是以文件的形式存放在磁盘上面的，每一行数据都有它的磁盘地址。有了索引之后，只需要在索引里面去检索这条数据就行了，因为它是一种特殊 的专门用来快速检索的数据结构，我们找到数据存放的磁盘地址以后，就可以拿到数据了。

在 InnoDB 里面，索引类型有三种，普通索引、唯一索引（主键索引是特殊的唯一 索引）、全文索引


索引数据结构


推理数据结构

二叉查找树

既能够实现快速查找，又能够实现快速插入。但是二叉查找树有一个问题： 就是它的查找耗时是和这棵树的深度相关的，如果我们插入的数据刚]]></description><category></category></item><item><title><![CDATA[MySQL架构与执行SQL流程]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/117281044</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/117281044</guid><author>MineCodelife</author><pubDate>Thu, 27 May 2021 09:21:11 +0800</pubDate><description><![CDATA[MySQL体系结构





连接


通信协议

MySQL 是支持多种通信协议的TCP/IP 协议，Unix Socket等。可以使用同步/异步的方式，支持长连接/短连接。监听默认的 3306 端口。一般来说我们连接数据库都是同步连接

MySQL 既支持短连接，也支持长连接。短连接就是操作完毕以后，马上 close 掉。 长连接可以保持打开，减少服务端创建和释放连接的消耗，后面的程序访问的时候还可 以使用这个连接。一般我们会在连接池中使用长连接。保持长连接会消耗内存。长时间不活动的连接，MySQL .]]></description><category></category></item><item><title><![CDATA[任务调度]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/117196185</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/117196185</guid><author>MineCodelife</author><pubDate>Mon, 24 May 2021 09:41:35 +0800</pubDate><description><![CDATA[Quartz

http://www.quartz-scheduler.org/

体系结构




Job - 你想要调度器执行的任务组件需要实现的接口,一个 job 就是一个实现了 Job 接口的类，该接口只有一个方法execute
	JobDetail - 用于定义作业的实例。。
	Trigger（即触发器） - 定义执行给定作业的计划的组件。job的一个 trigger 被触发后，execute() 方法会被 scheduler 的一个工作线程调用。最常用SimpleTrigger 和 CronTr]]></description><category></category></item><item><title><![CDATA[Redis 集群]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/117019918</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/117019918</guid><author>MineCodelife</author><pubDate>Wed, 19 May 2021 19:25:05 +0800</pubDate><description><![CDATA[Redis 主从复制（replication）


主从复制配置

例如一主多从,203 是主节点，在每个 slave 节点的 redis.conf 配置文件增加一行，slaveof 192.168.8.203 6379
     // 在主从切换的时候，这个配置会被重写成： # Generated by CONFIG REWRITE replicaof 192.168.8.203 6379

或者在启动服务时通过参数指定 master 节点： ./redis-server --slaveof 1...]]></description><category></category></item><item><title><![CDATA[Redis高级特性和原理]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/116979318</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/116979318</guid><author>MineCodelife</author><pubDate>Wed, 19 May 2021 09:59:03 +0800</pubDate><description><![CDATA[发布订阅模式


Redis 提供了一组命令实现发布/订阅模式

订阅者订阅频道：可以一次订阅多个，比如这个客户端订阅了 3 个频道

subscribe channel-1 channel-2 channel-3

发布者可以向指定频道发布消息（并不支持一次向多个频道发送消息）：

publish channel-1 2673

取消订阅（不能在订阅状态下使用）

unsubscribe channel-1

按规则（Pattern）订阅频道

支持?和*占位符。?代表一个字符，*代表 0 个或者多个字符]]></description><category></category></item><item><title><![CDATA[Redis基础篇数据结构]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/116934372</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/116934372</guid><author>MineCodelife</author><pubDate>Mon, 17 May 2021 22:22:50 +0800</pubDate><description><![CDATA[数据类型


https://redis.io/topics/data-types-intro

String:二进制安全字符串。
	Lists列表：根据插入顺序排序的字符串元素的集合。它们基本上是链表。
	Sets集合：唯一，未排序的字符串元素的集合。
	Sorted sets排序集合，类似于集合，但是每个字符串元素都与一个称为score的浮点数字值相关联。元素总是按照它们的分数排序，因此与Sets不同，可以检索一系列元素（例如，您可能会问：给我前10名或后10名）。
	Hashes哈希，是由与值相关联的]]></description><category></category></item><item><title><![CDATA[消息中间件之kafka原理分析]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/116694986</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/116694986</guid><author>MineCodelife</author><pubDate>Wed, 12 May 2021 10:10:40 +0800</pubDate><description><![CDATA[副本数据同步原理

初始状态

leader和follower的HW和LEO都是0，leader副本会保存remote LEO，表示所有follower LEO，也会被初始化为0。这个时候，producer没有发送消息。follower会不断地个leader发送FETCH 请求，但是因为没有数据，这个请求会被leader寄存，当在指定的时间之后会强制完成请求，这个时间 配置是(replica.fetch.wait.max.ms)，如果在指定时间内producer有消息发送过来，那么kafka会唤醒 fetc]]></description><category></category></item><item><title><![CDATA[消息中间件之kafka]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/116569067</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/116569067</guid><author>MineCodelife</author><pubDate>Tue, 11 May 2021 20:08:09 +0800</pubDate><description><![CDATA[消息中间件的场景

如果是在分布式系统中，两个服务之间需要通过这种异步队列（生产消费者模式）的方式来处理任务，那单进程级别的队列就无法解决这个问题了。 因此，引入了消息中间件，也就是把消息处理交给第三方的服务，这个服务能够实现数据的存储以及传输，使得在分布式架构下实现跨进程的远程消息通信。 所以，简单来说： 消息中间件是指利用高效可靠的消息传输机制进行平台无关的数据交流，并且基于数 据通信来进行分布式系统的集成。

可以先从基本的消息中间件需求开始思考

最基本的是要能支持消息的发送和接收
	需要涉及到网络]]></description><category></category></item><item><title><![CDATA[nacos 配置源码初解]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/116268751</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/116268751</guid><author>MineCodelife</author><pubDate>Thu, 29 Apr 2021 17:46:05 +0800</pubDate><description><![CDATA[入口


//NacosConfigService
onfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
configService.addListener(dataId, group, new Listener() {
	@Ov.]]></description><category></category></item><item><title><![CDATA[dubbo 服务引用]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/116194959</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/116194959</guid><author>MineCodelife</author><pubDate>Wed, 28 Apr 2021 09:36:12 +0800</pubDate><description><![CDATA[https://dubbo.apache.org/zh/docs/v2.7/dev/source/refer-service

服务引用原理

引用时机

Spring 容器调用 ReferenceBean 的 afterPropertiesSet 方法时引用服务(默认饿汉式)
	ReferenceBean 对应的服务被注入到其他类中时引用(懒汉式)
源码分析

服务引用的入口方法为 ReferenceBean 的 getObject 方法


public synchronized T get() {
.]]></description><category></category></item><item><title><![CDATA[dubbo 服务导出]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/116157271</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/116157271</guid><author>MineCodelife</author><pubDate>Tue, 27 Apr 2021 10:24:49 +0800</pubDate><description><![CDATA[https://dubbo.apache.org/zh/docs/v2.7/dev/source/export-service

要实现服务发布和注册，需要做哪些事情？

1. 配置文件解析或者注解解析

2. 服务注册

3. 启动 netty 服务实现远程监听


Spring 默认会加载 jar 包下的 META-INF/spring.handlers 文件寻找对应的 NamespaceHandler。



DubboNamespaceHandler把不同的配置分别转化成 spring 容器中的不.]]></description><category></category></item><item><title><![CDATA[dubbo spi]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/116105766</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/116105766</guid><author>MineCodelife</author><pubDate>Sun, 25 Apr 2021 15:17:16 +0800</pubDate><description><![CDATA[https://dubbo.apache.org/zh/docs/v2.7/dev/source/dubbo-spi/

SPI 全称为 Service Provider Interface，是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中，并由服务加载器读取配置文件，加载实现类。这样可以在运行时，动态为接口替换实现类。

Dubbo 就是通过 SPI 机制加载所有的组件。通过指定目录下配置一个对应接口的实现类，然后程序会进行查找和解析，找到对应的扩展点


dubbo spi 的拓展]]></description><category></category></item><item><title><![CDATA[netty]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/115677414</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/115677414</guid><author>MineCodelife</author><pubDate>Wed, 14 Apr 2021 17:09:41 +0800</pubDate><description><![CDATA[netty的强大在于三个方面

IO模型
	线程模型
	数据协议
Pipeline




一个 Channel 包含了一个 ChannelPipeline，而 ChannelPipeline 中又维护了一个由
ChannelHandlerContext 组成的双向链表。这个链表的头是 HeadContext，链表的尾是 TailContext，并且每个ChannelHandlerContext 中又关联着一个 ChannelHandler

protected AbstractChannel(Channe]]></description><category></category></item><item><title><![CDATA[ThreadLocal]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/115579067</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/115579067</guid><author>MineCodelife</author><pubDate>Sat, 10 Apr 2021 18:24:47 +0800</pubDate><description><![CDATA[常见用途


每个线程需要一个对象。工具类。
	每个线程需要保存全局变量。让不同方法使用避免参数的传递


原理


每个线程都有一个 ThreadLocal.ThreadLocalMap threadLocals = null




重要方法


initalValue
该方法会返回当前线程的初始值，这是一个懒加载当调用get方法的时候才会触发
	如果线程已经调用过了set方法，不会调用initalValue
	通常每个线程只执行一次，除非调用了remove方法
	如果不重写方法，默认返回null
s.]]></description><category></category></item><item><title><![CDATA[线程池]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/115572841</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/115572841</guid><author>MineCodelife</author><pubDate>Sat, 10 Apr 2021 15:17:27 +0800</pubDate><description><![CDATA[线程池的目的


固定数量的线程来执行多数的任务，来避免反复创建和销毁线程所带来的的开销问题


线程池的启动


corePoolSize
	maxPoolSize
	keepAliveTime
	workQueue
	threadFactory
	Handler
添加线程的规则

如果线程数小于corePooSize，即使其他线程处于空闲状态也会创建新的线程
	如果线程数大于等于corePooSize小于maxPoolSize，则将任务放入队列
	如果队列已满，并且线程数小于maxPoolSize,则创]]></description><category></category></item><item><title><![CDATA[Java死锁的产生到消除]]></title><link>https://blog.youkuaiyun.com/MineCodelife/article/details/115560161</link><guid>https://blog.youkuaiyun.com/MineCodelife/article/details/115560161</guid><author>MineCodelife</author><pubDate>Sat, 10 Apr 2021 10:28:24 +0800</pubDate><description><![CDATA[首先看一个必然死锁的例子


package com.study.deadlock;

public class MustDeakLock implements Runnable {
    int flag = 1;

    static Object o1 = new Object();
    static Object o2 = new Object();

    public static void main(String[] args) {
        MustDeakLock m1 =]]></description><category></category></item></channel></rss>