- 博客(22)
- 收藏
- 关注
原创 Mysql锁类型
1.1 锁的类型共享锁(读锁),允许事务读一行数据。排他锁(写锁),允许事务删除或更新一行数据。1.2 粒度锁Lock锁根据粒度主要分为表锁、页锁和行锁。MySQL 不同的存储引擎支持不同的锁机制:MyISAM 和 MEMORY 存储引擎采用的是表级锁(table-level locking)BDB 存储引擎采用的是页面锁(page-level locking),但也支持表级锁InnoDB 存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。1
2021-03-25 09:37:31
218
原创 深入理解Kafka(二):rebalance源码剖析
前言我们知道,Kafka有消费者组(Consumer Group)的概念:每个消费者属于一个消费者组 ,一个消费者组有多个消费者发布到topic的消息只能被每个订阅该topic的消费者组中的一个消费者消费不同消费者组中的消费者可以消费同一个topic下的消息但是消费者(Consumer)是如何知道要消费topic下哪个分区(partition)的消息的呢?每个分区和消费者之间的分配关...
2021-01-07 11:46:38
742
原创 深入理解Kafka(四):消费者分区分配策略源码剖析
前言我们知道,Kafka有消费者组(Consumer Group)的概念:每个消费者属于一个消费者组 ,一个消费者组有多个消费者发布到topic的消息只能被每个订阅该topic的消费者组中的一个消费者消费不同消费者组中的消费者可以消费同一个topic下的消息但是消费者(Consumer)是如何知道要消费topic下哪个分区(partition)的消息的呢?每个分区和消费者之间的分配关...
2021-01-06 19:42:00
233
原创 Springboot支持国际化i18n
一、配置参数在application.yml中添加如下参数 spring: messages: basename: i18n/messages # 国际化资源文件二、添加国际化文件在resources目录下添加国际化资源文件默认配置文件messages.propertiesSTATUS_200=OKSTATUS_400=Bad_requestSTATUS_403=Forbidmessages_zn_CN.propertiesSTATUS_200=成功STATUS_4
2021-01-05 10:51:52
193
原创 Netty流量控制之一:高低水位
当Channel write向缓冲区写入数据的时候,如果数据量超过了设置的高水位值,就设置通道Channel不可写状态。当Channel flush将缓冲区中的数据写入到TCP缓冲区之后,如果Netty缓冲区的数据量低于低水位值时,就设置通过Channel可写状态。Netty默认设置的高水位为64KB,低水位为32KB。1. 例子ServerBootstrap sb = new ServerBootstrap();bootstrap.childOption(ChannelOption.WRITE_
2020-12-29 12:09:21
2592
原创 Netty源码剖析之四:服务端处理TCP连接
1. 通道注册SelectionKey.OP_ACCEPT事件我们知道服务端启动过程中在ServerBootstrap.initAndRegister注册通道时给SelectionKey绑定对象NioServerSocketChannel,以及在绑定端口和地址时给Channel通道注册了SelectionKey.OP_ACCEPT事件。查看AbstractNioChannel.doRegister()可知selectionKey = javaChannel().register(eventLoop().u
2020-12-28 15:40:44
246
原创 Netty源码剖析之三:通过ServerBootstrap分析服务端启动流程
ServerBootstrap在Netty中负责引导启动服务端程序,下面给出一个服务端启动的例子: EventLoopGroup bossGroup = new NioEventLoopGroup(); //bossGroup负责处理TCP/IP连接的 EventLoopGroup workerGroup = new NioEventLoopGroup(); //workerGroup是负责处理Channel(通道)的I/O事件 ServerBootstrap sb = new ServerBoot
2020-12-28 12:27:49
194
原创 Netty源码剖析之二:NioEventLoop
1. NioEventLoop简介Netty的线程模型是基于Reactor线程模型的,而NioEventLoop类则是Reactor线程模型的核心,NioEventLoop类的run()方法负责监听IO事件并分发handler进行业务逻辑的处理。2. NioEventLoop类图3. 构造函数NioEventLoop(NioEventLoopGroup parent, Executor executor, SelectorProvider selectorProvider,
2020-12-24 17:03:02
208
2
原创 Netty源码剖析之一:NioEventLoopGroup
1. NioEventLoopGroup介绍Netty启动的时候会构建NioEventLoopGroup实例,NioEventLoopGroup内部维护了一组线程NioEventLoop,用于处理IO事件(OP_ACCEPT、OP_CONNECT、OP_READ、OP_WRITE),每个线程负责处理多个Channel上的事件,而一个Channel只对应于一个线程,这样实现了Netty的串行无锁化。2. NioEventLoopGroup类图3. 构造函数NioEventLoopGroup的构造函数
2020-12-24 14:58:45
232
原创 Kafka入门(一):简介
简介1. 主要功能Kafka作为一个分布式的流平台,有三个主要的功能:发布和订阅消息流,类似于一个消息队列。以容错的方式存储消息流。在消息流发生时处理它们。2. 基本术语及解释Topic和Partitionstopic是一个类别,生产者发送消息的时候发送到指定的topic下,每个topic可以有多个分区( partition ),每一个分区( partition )都是一个...
2020-12-22 10:01:02
405
原创 JAVA源码剖析之HashMap(六):hashCode()方法的作用和equals()方法
hashCode()方法的作用在Java中,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。用HashMap举例说明下,为了判断HashMap中存在不存在key,HashMap不用遍历里面的所有元素进行判断再取值,为什么呢?HashMap类中维护了一个数组(俗称桶或箱子),桶的类型是链表或者红黑树,每次进行put运算时,都会对key的hashCode值进行hash运算,得到的hash值与数组元素的个数进行与运算,
2020-12-21 16:00:22
295
原创 JAVA源码剖析之HashMap(五):get()方法
get()方法get()方法比较简单,首先通过hash值定位指定key的table[]数组索引,其次优先比较第一个元素是否相等,如果不相等则走红黑树的getTreeNode()逻辑或者链表遍历查找比较。public V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value;}final Node<K,V> getNode(int
2020-12-21 15:48:55
178
原创 JAVA源码剖析之HashMap(三):扩容resize()、负载因子、扩容容量
扩容时机当HashMap的键值对KV数量大于扩容阈值threshold(threshold = capacity * loadFactor)或table[]数组未初始化时,会进行扩容操作。resize()方法分析分三步计算新的容量值newCap和扩容阈值newThr。实例化新的table[]数组并初始化大小为新的容量大小newCap。数据迁移,链表的迁移原理:扩容之后,由于新容量capacity为旧容量oldCap的2倍,且它们都为2的整数幂,对于该链表上的元素,如果(hash & o
2020-12-21 13:23:43
157
原创 JAVA源码剖析之HashMap(四):元素插入put()方法
put()方法通过插入元素的hash值找到插入元素对应的桶的索引。桶为NULL直接插入,否则处理红黑树的插入TreeNode.putTreeVal或者链表的插入,链表的插入逻辑比较简单,遍历链表的元素,如果链表元素与插入元素相等则取消插入,否则插入到链表的尾部,同时如果插入后的链表长度大于TREEIFY_THRESHOLD则将链表转换成红黑树。处理是否覆盖旧值。如果容量大于扩容阈值则进行扩容resize()。public V put(K key, V value) { return p
2020-12-21 13:18:28
218
原创 JAVA源码剖析之HashMap(二):hash()和tableSizeFor()方法
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 >>> 16即h右移16位 return (key =
2020-12-15 15:22:23
82
原创 JAVA源码剖析之HashMap(一):成员变量和构造函数
本系列基于JDK8源码进行分析,HashMap类常量定义如下:最大容量static final int MAXIMUM_CAPACITY = 1 << 30 // 所有箱子的最大容量,必须为2^n。默认容量static final int DEFAULT_CAPACITY = 1 << 4 // 所有箱子的默认容量,必须为2^n。负载因子static final float LOAD_FACTOR = 0.75f // 负载因子 = 总键值对数 / 箱子个数,因此初始状
2020-12-15 11:48:48
167
原创 深入理解Kafka(五):Topic分区数和consumer消费者
如何确定分区数Kafka中的消息数据是保存到各个Partition分区中的,Partition分区是Kafka并行化的基础,不同的Partition分区分布到各个Broker中,可以实现机器间的并行处理。同一Broker下的不同Partition分区分布到不同的磁盘驱动上,也可实现磁盘间的并行处理。所以,理论上Partition分区的个数决定了最大并行度。但是,分区数也不是越多越好。如何确认消...
2019-08-27 14:59:57
1416
原创 深入理解Kafka(三):生产者分区策略源码剖析
前言我们都知道Kafka中的topic和分区(partition)的概念,一个topic可以有一个或多个分区(partition),消息数据都是存储在分区(partition)中的,生产者(Producer)发送消息到topic,消费者(Consumer)从指定的topic中消费消息,但是生产者的消息是投递到topic下的哪个分区(partition)的?本文通过解读源码分析生产者(Produ...
2019-08-27 14:18:45
371
原创 深入理解Kafka(一):高性能揭秘
顺序写磁盘人们普遍认为“磁盘速度慢”,但根据《顺序磁盘访问在某些情况下可能比随机内存访问更快》描述,顺序写磁盘比随机写磁盘更快。Kafka采用磁盘的顺序写,实际上partition分区分为多个Segment,每个Segment对应一个物理文件,Kafka通过对Segment的追加写方式来实现磁盘的顺序写,从而避免随机写磁盘带来的寻址开销,提高了磁盘的访问速度。页缓存PageCache磁盘的...
2019-08-21 10:38:53
101
原创 Kafka入门(三):整合spring消息队列
1. Kafka安装Kafka安装请参考我的另一篇博客,本文不再叙述。2. 整合springboot和kafka搭建springboot项目,https://start.spring.io/快速生成maven项目,springboot已经包含kafka的自动化配置,现在只需要添加kafka依赖即可:@Transactional(rollbackFor = Exception.class)...
2019-08-19 15:43:39
93
原创 Kafka入门(二):集群搭建
1. Kafka集群安装官网下载Kafka或者点击这里下载,并解压到/usr/local/kafka/tar -xzf kafka_2.12-2.3.0.tgzKafka使用ZooKeeper,可以使用Kafka下载包中的脚本启动一个单节点zookeeper。bin/zookeeper-server-start.sh config/zookeeper.properties搭建本地集群...
2019-08-19 15:42:47
88
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人