<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[MiniLuLu的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/linux_one_piece</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; linux_one_piece]]></copyright><item><title><![CDATA[Mysql锁类型]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/112688435</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/112688435</guid><author>linux_one_piece</author><pubDate>Thu, 25 Mar 2021 09:37:31 +0800</pubDate><description><![CDATA[1.1 锁的类型
共享锁（读锁），允许事务读一行数据。
排他锁（写锁），允许事务删除或更新一行数据。
1.2 粒度锁
Lock锁根据粒度主要分为表锁、页锁和行锁。MySQL 不同的存储引擎支持不同的锁机制：
MyISAM 和 MEMORY 存储引擎采用的是表级锁（table-level locking）
BDB 存储引擎采用的是页面锁（page-level locking），但也支持表级锁
InnoDB 存储引擎既支持行级锁（row-level locking），也支持表级锁，但默认情况下是采用行级锁。
1]]></description><category></category></item><item><title><![CDATA[深入理解Kafka（二）：rebalance源码剖析]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/99943275</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/99943275</guid><author>linux_one_piece</author><pubDate>Thu, 07 Jan 2021 11:46:38 +0800</pubDate><description><![CDATA[前言
我们知道，Kafka有消费者组（Consumer Group）的概念：

每个消费者属于一个消费者组 ，一个消费者组有多个消费者
发布到topic的消息只能被每个订阅该topic的消费者组中的一个消费者消费
不同消费者组中的消费者可以消费同一个topic下的消息

但是消费者（Consumer）是如何知道要消费topic下哪个分区（partition）的消息的呢？每个分区和消费者之间的分配关...]]></description><category></category></item><item><title><![CDATA[深入理解Kafka（四）：消费者分区分配策略源码剖析]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/99847064</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/99847064</guid><author>linux_one_piece</author><pubDate>Wed, 06 Jan 2021 19:42:00 +0800</pubDate><description><![CDATA[前言
我们知道，Kafka有消费者组（Consumer Group）的概念：

每个消费者属于一个消费者组 ，一个消费者组有多个消费者
发布到topic的消息只能被每个订阅该topic的消费者组中的一个消费者消费
不同消费者组中的消费者可以消费同一个topic下的消息

但是消费者（Consumer）是如何知道要消费topic下哪个分区（partition）的消息的呢？每个分区和消费者之间的分配关...]]></description><category></category></item><item><title><![CDATA[Springboot支持国际化i18n]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/107913979</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/107913979</guid><author>linux_one_piece</author><pubDate>Tue, 05 Jan 2021 10:51:52 +0800</pubDate><description><![CDATA[一、配置参数
在application.yml中添加如下参数
 spring:
 	messages:
    	basename: i18n/messages # 国际化资源文件

二、添加国际化文件
在resources目录下添加国际化资源文件

默认配置文件messages.properties
STATUS_200=OK
STATUS_400=Bad_request
STATUS_403=Forbid

messages_zn_CN.properties
STATUS_200=成功
STATUS_4]]></description><category></category></item><item><title><![CDATA[Netty流量控制之一：高低水位]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/111885929</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/111885929</guid><author>linux_one_piece</author><pubDate>Tue, 29 Dec 2020 12:09:21 +0800</pubDate><description><![CDATA[当Channel write向缓冲区写入数据的时候，如果数据量超过了设置的高水位值，就设置通道Channel不可写状态。
当Channel flush将缓冲区中的数据写入到TCP缓冲区之后，如果Netty缓冲区的数据量低于低水位值时，就设置通过Channel可写状态。
Netty默认设置的高水位为64KB，低水位为32KB。
1. 例子
ServerBootstrap sb = new ServerBootstrap();
bootstrap.childOption(ChannelOption.WRITE_]]></description><category></category></item><item><title><![CDATA[Netty源码剖析之四：服务端处理TCP连接]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/111849456</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/111849456</guid><author>linux_one_piece</author><pubDate>Mon, 28 Dec 2020 15:40:44 +0800</pubDate><description><![CDATA[1. 通道注册SelectionKey.OP_ACCEPT事件
我们知道服务端启动过程中在ServerBootstrap.initAndRegister注册通道时给SelectionKey绑定对象NioServerSocketChannel，以及在绑定端口和地址时给Channel通道注册了SelectionKey.OP_ACCEPT事件。查看AbstractNioChannel.doRegister()可知selectionKey = javaChannel().register(eventLoop().u]]></description><category></category></item><item><title><![CDATA[Netty源码剖析之三：通过ServerBootstrap分析服务端启动流程]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/111664753</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/111664753</guid><author>linux_one_piece</author><pubDate>Mon, 28 Dec 2020 12:27:49 +0800</pubDate><description><![CDATA[ServerBootstrap在Netty中负责引导启动服务端程序，下面给出一个服务端启动的例子：
	EventLoopGroup bossGroup = new NioEventLoopGroup(); //bossGroup负责处理TCP/IP连接的
	EventLoopGroup workerGroup = new NioEventLoopGroup(); //workerGroup是负责处理Channel(通道)的I/O事件
 	ServerBootstrap sb = new ServerBoot]]></description><category></category></item><item><title><![CDATA[Netty源码剖析之二：NioEventLoop]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/111638856</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/111638856</guid><author>linux_one_piece</author><pubDate>Thu, 24 Dec 2020 17:03:02 +0800</pubDate><description><![CDATA[1. NioEventLoop简介
Netty的线程模型是基于Reactor线程模型的，而NioEventLoop类则是Reactor线程模型的核心，NioEventLoop类的run()方法负责监听IO事件并分发handler进行业务逻辑的处理。
2. NioEventLoop类图

3. 构造函数
NioEventLoop(NioEventLoopGroup parent, Executor executor, SelectorProvider selectorProvider,
           ]]></description><category></category></item><item><title><![CDATA[Netty源码剖析之一：NioEventLoopGroup]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/111614804</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/111614804</guid><author>linux_one_piece</author><pubDate>Thu, 24 Dec 2020 14:58:45 +0800</pubDate><description><![CDATA[1. NioEventLoopGroup介绍
Netty启动的时候会构建NioEventLoopGroup实例，NioEventLoopGroup内部维护了一组线程NioEventLoop，用于处理IO事件（OP_ACCEPT、OP_CONNECT、OP_READ、OP_WRITE），每个线程负责处理多个Channel上的事件，而一个Channel只对应于一个线程，这样实现了Netty的串行无锁化。
2. NioEventLoopGroup类图

3. 构造函数
NioEventLoopGroup的构造函数]]></description><category></category></item><item><title><![CDATA[JAVA数据结构与算法之延迟队列（二）：HashedWheelTimer]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/108345809</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/108345809</guid><author>linux_one_piece</author><pubDate>Tue, 22 Dec 2020 15:02:57 +0800</pubDate><description><![CDATA[HashedWheelTimer

]]></description><category></category></item><item><title><![CDATA[Kafka入门（一）：简介]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/99644218</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/99644218</guid><author>linux_one_piece</author><pubDate>Tue, 22 Dec 2020 10:01:02 +0800</pubDate><description><![CDATA[简介
1. 主要功能
Kafka作为一个分布式的流平台，有三个主要的功能：

发布和订阅消息流，类似于一个消息队列。
以容错的方式存储消息流。
在消息流发生时处理它们。

2. 基本术语及解释


Topic和Partitions
topic是一个类别，生产者发送消息的时候发送到指定的topic下，每个topic可以有多个分区( partition )，每一个分区( partition )都是一个...]]></description><category></category></item><item><title><![CDATA[JAVA源码剖析之HashMap（六）：hashCode()方法的作用和equals()方法]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/111476727</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/111476727</guid><author>linux_one_piece</author><pubDate>Mon, 21 Dec 2020 16:00:22 +0800</pubDate><description><![CDATA[hashCode()方法的作用
在Java中，hashCode方法的主要作用是为了配合基于散列的集合一起正常运行，这样的散列集合包括HashSet、HashMap以及HashTable。
用HashMap举例说明下，为了判断HashMap中存在不存在key，HashMap不用遍历里面的所有元素进行判断再取值，为什么呢？HashMap类中维护了一个数组（俗称桶或箱子），桶的类型是链表或者红黑树，每次进行put运算时，都会对key的hashCode值进行hash运算，得到的hash值与数组元素的个数进行与运算，]]></description><category></category></item><item><title><![CDATA[JAVA源码剖析之HashMap（五）：get()方法]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/111475414</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/111475414</guid><author>linux_one_piece</author><pubDate>Mon, 21 Dec 2020 15:48:55 +0800</pubDate><description><![CDATA[get()方法
get()方法比较简单，首先通过hash值定位指定key的table[]数组索引，其次优先比较第一个元素是否相等，如果不相等则走红黑树的getTreeNode()逻辑或者链表遍历查找比较。
public V get(Object key) {
    Node&lt;K,V&gt; e;
    return (e = getNode(hash(key), key)) == null ? null : e.value;
}

final Node&lt;K,V&gt; getNode(int]]></description><category></category></item><item><title><![CDATA[JAVA源码剖析之HashMap（三）：扩容resize()、负载因子、扩容容量]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/111218127</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/111218127</guid><author>linux_one_piece</author><pubDate>Mon, 21 Dec 2020 13:23:43 +0800</pubDate><description><![CDATA[扩容时机
当HashMap的键值对KV数量大于扩容阈值threshold（threshold = capacity * loadFactor）或table[]数组未初始化时，会进行扩容操作。
resize()方法分析
分三步

计算新的容量值newCap和扩容阈值newThr。
实例化新的table[]数组并初始化大小为新的容量大小newCap。
数据迁移，链表的迁移原理：扩容之后，由于新容量capacity为旧容量oldCap的2倍，且它们都为2的整数幂，对于该链表上的元素，如果(hash &amp; o]]></description><category></category></item><item><title><![CDATA[JAVA源码剖析之HashMap（四）：元素插入put()方法]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/111469282</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/111469282</guid><author>linux_one_piece</author><pubDate>Mon, 21 Dec 2020 13:18:28 +0800</pubDate><description><![CDATA[put()方法

通过插入元素的hash值找到插入元素对应的桶的索引。
桶为NULL直接插入，否则处理红黑树的插入TreeNode.putTreeVal或者链表的插入，链表的插入逻辑比较简单，遍历链表的元素，如果链表元素与插入元素相等则取消插入，否则插入到链表的尾部，同时如果插入后的链表长度大于TREEIFY_THRESHOLD则将链表转换成红黑树。
处理是否覆盖旧值。
如果容量大于扩容阈值则进行扩容resize()。

public V put(K key, V value) {
    return p]]></description><category></category></item><item><title><![CDATA[JAVA源码剖析之HashMap（二）：hash()和tableSizeFor()方法]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/111196489</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/111196489</guid><author>linux_one_piece</author><pubDate>Tue, 15 Dec 2020 15:22:23 +0800</pubDate><description><![CDATA[hash()方法
hash函数的作用是使元素hash值更加发散，经过hash()处理之后，hash值的高16位没变，低16为原来的低16与高16异或的结果，即用16位来综合了高16位和低16位的影响，这样能提高key的发散性的主要原因是table的长度通常小于216 ，通过hash%table.length就能更发散
static final int hash(Object key) {
    int h;
    // h &gt;&gt;&gt; 16即h右移16位
    return (key =]]></description><category></category></item><item><title><![CDATA[JAVA源码剖析之HashMap（一）：成员变量和构造函数]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/111194718</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/111194718</guid><author>linux_one_piece</author><pubDate>Tue, 15 Dec 2020 11:48:48 +0800</pubDate><description><![CDATA[本系列基于JDK8源码进行分析，HashMap类常量定义如下：

最大容量
static final int MAXIMUM_CAPACITY = 1 &lt;&lt; 30 // 所有箱子的最大容量，必须为2^n。
默认容量
static final int DEFAULT_CAPACITY = 1 &lt;&lt; 4 // 所有箱子的默认容量，必须为2^n。
负载因子
static final float LOAD_FACTOR = 0.75f // 负载因子 = 总键值对数 / 箱子个数，因此初始状]]></description><category></category></item><item><title><![CDATA[深入理解Kafka（五）：Topic分区数和consumer消费者]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/99732477</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/99732477</guid><author>linux_one_piece</author><pubDate>Tue, 27 Aug 2019 14:59:57 +0800</pubDate><description><![CDATA[如何确定分区数
Kafka中的消息数据是保存到各个Partition分区中的，Partition分区是Kafka并行化的基础，不同的Partition分区分布到各个Broker中，可以实现机器间的并行处理。同一Broker下的不同Partition分区分布到不同的磁盘驱动上，也可实现磁盘间的并行处理。所以，理论上Partition分区的个数决定了最大并行度。但是，分区数也不是越多越好。
如何确认消...]]></description><category></category></item><item><title><![CDATA[深入理解Kafka（三）：生产者分区策略源码剖析]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/99732179</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/99732179</guid><author>linux_one_piece</author><pubDate>Tue, 27 Aug 2019 14:18:45 +0800</pubDate><description><![CDATA[前言
我们都知道Kafka中的topic和分区（partition）的概念，一个topic可以有一个或多个分区（partition），消息数据都是存储在分区（partition）中的，生产者（Producer）发送消息到topic，消费者（Consumer）从指定的topic中消费消息，但是生产者的消息是投递到topic下的哪个分区（partition）的？
本文通过解读源码分析生产者（Produ...]]></description><category></category></item><item><title><![CDATA[深入理解Kafka（一）：高性能揭秘]]></title><link>https://blog.youkuaiyun.com/linux_one_piece/article/details/99644510</link><guid>https://blog.youkuaiyun.com/linux_one_piece/article/details/99644510</guid><author>linux_one_piece</author><pubDate>Wed, 21 Aug 2019 10:38:53 +0800</pubDate><description><![CDATA[顺序写磁盘
人们普遍认为“磁盘速度慢”，但根据《顺序磁盘访问在某些情况下可能比随机内存访问更快》描述，顺序写磁盘比随机写磁盘更快。
Kafka采用磁盘的顺序写，实际上partition分区分为多个Segment，每个Segment对应一个物理文件，Kafka通过对Segment的追加写方式来实现磁盘的顺序写，从而避免随机写磁盘带来的寻址开销，提高了磁盘的访问速度。
页缓存PageCache
磁盘的...]]></description><category></category></item></channel></rss>