- 博客(51)
- 收藏
- 关注
原创 手写 LRU Cache:基于 map + 双向链表 + 哨兵节点
这篇文章记录我在 Go 里实现 LRU(Least Recently Used)缓存的思路与细节。Lru.go。
2025-12-21 17:26:15
724
原创 Kafka Queue: 完成 alterShareGroupOffsets Api
请求来实现的,并没有所为顶层错误码的概念;但是后在AlterShareGroupOffsetsResponse的响应体存在顶层的异常ErrorCode与ErrorMessage,但是实做过程中没有处理并封装到各个分区的响应中。3、因为写API的过程中参考了ConsumerGroup的实现,没有注意到错误码的处理过程,实际上对于经典消费组重置偏移量的过程,是通过提交一个新的。的概念,可以理解为当前第一个被客户端拉走,但是未被提交的record batches,这个功能主要就是对SPSO进行操作。
2025-10-16 16:50:28
823
原创 RabbitMQ 消息持久化/镜像队列/lazy对时延影响
如上测试场景,开启消息持久化/开启镜像队列/配置惰性队列 并不会对消息生产时延造成较大影响,对生产时延造成较大影响的主要因素为开启生产确认或使用事务机制。消息大小 4k,消息条数为1000条,时延取值为平均时延。
2024-12-16 16:30:39
589
原创 RabbitMQ高可用队列最佳实践
队列持久化 消息持久化 delivery_mode = 2 镜像队列/quorum queue 生产者确认/开启事务 客户端手动ack
2024-12-12 15:42:26
221
原创 VRRP协议实战
可以发现发现备节点多了一个虚拟ip(vip)keepalived启动后会有三个进程。子进程healthchecker子进程。在mater节点执行命令reboot。父进程内存管理子进程管理等等。子进程VRRP子进程。
2024-05-10 17:49:55
691
原创 Kafka分级存储概念(一)
Kafka社区在3.6版本引入了一个十分重要的特性:分级存储,本系列文章主要旨在介绍Kafka分级存储的设计理念、设计细节以及具体的代码实现。
2024-05-06 02:21:28
1113
1
原创 Kafka 生产者缓存
按照上面的使用方式,如果在多线程的环境下,可能会出现一个producer单个sender线程会有性能瓶颈(单发送线程),可能导致,导致入大于出,最终缓存堆积。每次调用produce函数时,都会新建一个producer,每次都需要进行新建与broker连接->获取分区元数据->生产消息的过程,存在性能瓶颈。上述示例中,producerLru的key可以是topic名称,如果是多个用户场景下,也可以以用户名作为key,可以根据实际业务场景进行调整。
2024-01-31 09:56:11
764
原创 Kafka常见参数
参数名 含义 默认值 解释 max.request.size 生产端:最大请求字节大小 1MB 如果生产请求消息体大小大于该值,客户端生产时会报错 max.poll.records 消费端:一次poll()请求最大拉取消息条数 500条 如果单条消息处理时间长,需要减少该参数值,反之增加 fetch.min.bytes 消费端:一次poll()请求最小返回字节大小 1 增加该值可以提高吞吐量,同时也会产生一定延迟 fetch.max.bytes 消费端:一次poll()请求最大返
2024-01-30 17:20:24
1495
原创 Kafka request.log中RequestQueueTimeMs、LocalTimeMs、RemoteTimeMs、ThrottleTimeMs、含义
要理解各个延时项的含义,必须从Kafka收到TCP请求、处理请求到返回TCP包整个流程开始梳理。
2023-07-10 01:19:37
1684
转载 深入理解Kafka内部存储机制:段、滚动及老化
理解broker如何在磁盘上存储分区和相应的记录是非常重要的。配置参数可能对你的数据保留多长时间有着令人惊讶的大影响。了解这些参数以及你如何调整它们,将使你在处理数据时有更多的控制权。
2023-06-24 21:37:47
1338
原创 Kafka源码解析之索引
Kafka有两种类型的索引:构建索引时机由log.index.interval.bytes 参数控制,默认4KB构建一条索引为什么默认值是4kb呢?这里认为与基于磁盘的读写单位是 block(一般大小为 4KB)还有内存管理与分配的最小单位是4kb有关 在源码的LogSegment.append方法中,会对当前segement写入大小与上次构建索引时大小差值进行判断,如果超过log.index.interval.bytes,会构建timeIndex以及offsetIndex索引AbstractIndexAb
2023-06-19 00:29:32
2097
原创 Kafka重平衡rebalance是什么
Kafka的心跳线程是consumer与broker之间的心跳检查,如果消费者发现和broker之间的心跳超过了session.timeout.ms,那么消费者会阻塞并且进行重试。如果两次拉取消息的时间超过了max.poll.interval.ms , 那么即使消费者与客户端的心跳线程仍在保持,但是broker会认为客户端处于livelock状态,也会触发rebalance。原先的三项工作被细化成了九项工作,这样每个人就都有活干了,但是可能有的人要承担额外的工作(平均分配不了)
2023-06-04 13:57:20
837
转载 进程和线程的概念、区别及进程线程间通信
进程与线程的概念,以及为什么要有进程线程,其中有什么区别,他们各自又是怎么同步的? 基本概念: 进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发; 线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。每个线程完成不同的任务,但是共享同一地址空间(也就是同样的动态内存,映射文件,目标代码等等),打开的文件队列和其他内
2022-01-18 15:56:31
321
1
原创 多线程交替打印的四种方法
多线程交替打印的四种方法 方法一: Wait/Notify public class Print { boolean currentA = false; public synchronized void printA() { if (!currentA) { try { System.out.println("wait here"); this.wait(); }
2022-01-12 16:47:00
5366
3
原创 联合索引笔记
联合索引与最左匹配原则 最左前缀匹配原则:在MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。 要想理解联合索引的最左匹配原则,先来理解下索引的底层原理。索引的底层是一颗B+树,那么联合索引的底层也就是一颗B+树,只不过联合索引的B+树节点中存储的是键值。由于构建一棵B+树只能根据一个值来确定索引关系,所以数据库依赖联合索引最左的字段来构建。 举例:创建一个(a,b)的联合索引,那么它的索引树就是下图的样子。 可以看到a的值是有顺序的,1,1,2,2,3
2021-08-17 16:31:30
333
原创 操作系统之什么是中断?
什么是中断? 在学习操作系统中,经常性的会看到中断这个概念,最典型的就是汇编代码中的int命令。 用一个比较通俗的概念来说,就是计算机会连接许多外接设备,包括磁盘、显示器、键盘鼠标等等,而如何处理这些输入呢?对于一个处理器来讲,程序运行的过程是一个不断取指执行的过程。如何响应设备也就是常说的I/O输入呢?一种简单的办法就是当我们有数据输入时,想处理器提出请求,处理器过来处理我们的输入,在回去执行原来的程序代码,这样的一个过程就叫做中断(Interrupt)。 如果同时有多个设备提出请求,那么CP
2021-08-07 15:53:22
2360
原创 JVM常用参数
JVM参数笔记 常用JDK参数表 含义解释 java -Xss128k -Xmx3550m -Xms3550m -Xmn2g -Xmx3550m:设置JVM最大可用内存3550M -Xms3550m:设置JVM最小内存为3550m 这里有个问题,为什么一般将最大可用内存与最小可用内存设置为一样呢?因为可以防止GC后内存伸缩引起的性能问题 -Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代+年老代+持久代(JDK8以后)。持久代固定大小64m,增大年轻代=减少年轻代 -Xss128k:设
2021-08-06 18:15:18
375
原创 AQS源码阅读与理解
什么是AQS Provides a framework for implementing blocking locks and related synchronizers (semaphores, events, etc) that rely on first-in-first-out (FIFO) wait queues. This class is designed to be a useful basis for most kinds of synchronizers that rely on a
2021-08-06 15:24:36
259
原创 Java与Redis中的位图(BitSet)
Java与Redis中的位图(BitSet) 什么是位图? 位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用 位图使用字节来存储数据。在java中一个Long占8个字节,一个字节(Byte)占用8个bit,因此一个Long型数据占用64个bit长度。如果让每一个0/1比特位都作为代表一个数据是否存在的boolean值,那么一个long整形数据就可以存储64个数据,存储的效率非常高。 首先来看一下Java源码中位图实现(bitset)对于位图数据结构的描述 This class
2021-07-23 14:47:28
1331
原创 二叉树题目归纳:首个共同祖先与后继者
二叉树题目归纳 后继者 思路: 思路比较简单,二叉树中序遍历的一道题 首先知道二叉树左子树值小于根结点值,右子树值大于根结点值。如果后继结点值大于根结点值,那么在右子树中递归查找。否则在左子树中,那么此时后继结点即为根结点。如果在右子树中,那么后继结点则为递归查找到的结点。注意第一个if包含了等于的情况,即找到了改结点后继续在右子树中查找。 代码 class Solution { public TreeNode inorderSuccessor(TreeNode root, TreeNode p)
2021-07-19 00:25:00
158
原创 Explain用法笔记
Explain用法笔记 在官方文档中,对于explain的作用是这么解释的: explain语句提供了MYSQL如何执行语句的信息。explain可以与select、delete、insert、replace与update语句共同使用。它返回 explain select count(*) from equity_stock 对于显示的结果列进行解释 字段名称 作用 table 表名称 type 连接类型 key 使用到的索引名称 key_len 索引长度 ref 索引的
2021-06-23 14:31:10
414
原创 字节跳动java后端一面面经(头条/西瓜视频)
字节跳动java后端一面面经 面试时间:4月25日 时长:1小时 面试官人挺不错的,感觉挺有经验的,但是感觉技术栈应该不是java tcp连接如何保证高可用 回答:三次握手四次挥手、校验和、滑动窗口、消息重传、阻塞控制 Spring的aop怎么实现的 设计模式中的代理模式,两种实现方法JDK反射以及动态代理 Spring的aop怎么实现的 hashmap并发情况下有什么问题 回答循环链表 redis sortedset底层实现 答跳表 linux 如果删除正在写入的文件会出现什么?没回答出来 怎么做?使
2021-04-25 21:32:07
592
转载 线程池的基本原理,看完就懂了
线程池的基本原理,看完就懂了 在网上看到一篇不错的线程池记录文章,在这里转载记录一下 原博客 为什么要用线程池 降低资源消耗。通过重复利用已创建的线程降低线程创建、销毁线程造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控 ThreadPoolExecutor线程池类参数详解 参数 说明 corePoolSize 核
2021-04-22 19:08:43
203
原创 以Integer为例分析装箱拆箱
以Integer为例分析装箱拆箱 拆箱与装箱是java面试题中常见题型,今天来分析一下拆箱与装箱以及对java基本数据类型进行复习 八大基本数据类型 基本类型 包装类 short Short int Integer float Float char Character byte Byte long Long double Double bool Boolean 装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型
2021-04-16 16:05:50
263
1
原创 StringBuilder与StringBuffer 这么答一定没错
StringBuilder与StringBuffer 引言 Stringbuffer与StringBuider一直是面试中经常考察的一道题目,之前也经常复习但是常常搞混,但是个人经验通过阅读源码的方式来加深对于题目的理解往往会让你对这两个类记忆更加深刻,同时也可以让你在回答面试问题的时候让面试官对你刮目相看 首先看到两个类图的结构 可以看到两个类都实现了Comparable、Serializable接口、AbstractStringBuilder接口 首先看到AbstractStringBuil.
2021-04-16 15:09:23
140
1
原创 Java文件输入输出流及标准I/O流类知识总结
Java文件输入输出流及标准I/O流类知识总结 前几天参加了某企业的笔试,最后一道笔试题的题目大概是这样: 给定文件名filename以及一个字符串str,要求从文件中搜索该字符串,并且输出该字符串所在文件中的行数 背景 这道题考察的是对于文件输入输出流以及字符串的一道基本题目,可以算是比较基本的题目,但是由于太久没有复习,结果写的不是特别好,所以今天对文件输入输出流做一个复习和总结。 这是一张网上找的一张关于IO流操作的图片,这里我们可以看到I/O流分为字节流和字符流,从更加细致的划分,我们应该
2021-04-16 00:03:41
322
原创 一篇文章让你搞懂数据库索引
一篇文章让你搞懂数据库索引 文章目录一篇文章让你搞懂数据库索引数据在磁盘的存储结构什么是索引?索引的优点动态索引B树B树的操作B+树B+树的操作使用B+树与B树相比有什么好处Mysql的索引ISAM(Index Sequential Access Method)(**不是MyIsam**)myISAMInnodb索引索引的分类聚集索引非聚集索引覆盖索引主键索引二级索引全文索引哈希索引联合索引(多列索引)最左匹配规则InnoDb索引结构注意点 索引往往是数据库面试题当中会提到的重点问题,这里对数据库索引的
2021-04-14 18:17:06
633
原创 SpringSecurity问题分析之AccessDeniedException: Access is denied 源码分析
问题描述 org.springframework.security.access.AccessDeniedException: Access is denied 2021-04-10 16:17:01.950 DEBUG [authorization-server,8c5f48650de0f659,83580d93d6acb342,false] 7328 — [nio-8000-exec-1] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking matc
2021-04-10 17:36:37
22101
1
原创 从零开始实现交友网站+推荐系统之聊天模块
从零开始实现交友网站+推荐系统之聊天模块 需求分析 我们需要实现的功能主要有两大部分,第一部分是在线的用户可以实时的发送消息,第二部分是如果用户不在线,我们需要将消息离线存储起来。当用户上线时,我们需要向用户推送消息。 系统架构 ...
2021-04-08 16:43:52
210
2
原创 netty+websocket实现给指定用户发消息(指定id)+源码分析
Introduction 在使用netty向指定客户端发送消息的时候,应该需要怎么做呢? 方案 首先我们需要认识Netty的主要构件: Channel 回调 Future 事件和ChannelHandle 在不考虑分布式netty的情况下,我们知道 netty的处理模型是存在一组IO线程,去处理IO事件,如read,connect,write等等,对于服务端接收到的每个channel,都会将该channel映射到一条IO线程。当一个channel被建立之后,需要将其初始化,包含给他创建pipleli
2021-04-08 13:58:27
4449
5
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅