<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[IT大白的博客]]></title><description><![CDATA[菜鸟在路上]]></description><link>https://blog.youkuaiyun.com/a4827909</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; a4827909]]></copyright><item><title><![CDATA[1、线程概述]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/157463963</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/157463963</guid><author>a4827909</author><pubDate>Wed, 28 Jan 2026 10:29:45 +0800</pubDate><description><![CDATA[启动一个Java程序，操作系统就会创建一个Java进程。，也叫轻量级进程（Light Weight Process），在一个进程里可以创建多个线程，这些线程都拥有各自的计数器、堆栈和局部变量等属性，并且能够访问共享的内存变量。处理器在这些线程上，让使用者感觉到这些线程在同时执行。随着处理器上的核心数量越来越多，现在大多数计算机都比以往更加擅长并行计算，如何利用好处理器上的多个核心也成了现在的主要问题。一个线程在一个时刻只能运行在一个处理器核心上，如果该程序使用多线程技术，]]></description><category></category></item><item><title><![CDATA[9、分库分表]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/157291635</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/157291635</guid><author>a4827909</author><pubDate>Fri, 23 Jan 2026 14:39:12 +0800</pubDate><description><![CDATA[分表治大表，分库治单机；先分表，再分库，能不分最好别分。将一张大表的数据，按照某种规则拆分成多张结构相同的小表，以解决单表数据量过大带来的性能、维护或扩展性问题。核心目的：让“大表变小”，提升查询效率、降低锁竞争、便于维护。]]></description><category></category></item><item><title><![CDATA[8、MySQL相关问题补充]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/157287222</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/157287222</guid><author>a4827909</author><pubDate>Fri, 23 Jan 2026 11:38:34 +0800</pubDate><description><![CDATA[1、最左匹配原则在建立联合索引后，，才能使用到索引。2、相关问题：user表包含主键ID，A，B，C列，创建(A,B,C)联合索引会用到联合索引吗？会。优化器会将查询条件为 where A=3 and B=2 and C=4；会用到联合索引吗？部分使用。自动重排，先使用 A 做范围查询，在使用B筛选（索引下推），C无法使用索引联合索引的使用遵循，并且BETWEENLIKE 'xx%'会用到联合索引吗？会。A等值匹配精准定位，B在A=2的范围内进行范围扫描，C会使用索引下推。]]></description><category></category></item><item><title><![CDATA[7、MGR（MySQL Group Replication）]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/157260769</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/157260769</guid><author>a4827909</author><pubDate>Thu, 22 Jan 2026 21:02:35 +0800</pubDate><description><![CDATA[单主模式（Single-Primary Mode）：只有master节点可读可写（称为 PRIMARY），其余slave节点只读（称为SECONDARY）多主模式（Multi-Primary Mode）：所有节点都可读可写。]]></description><category></category></item><item><title><![CDATA[6、数据库优化]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/157222058</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/157222058</guid><author>a4827909</author><pubDate>Wed, 21 Jan 2026 21:08:15 +0800</pubDate><description><![CDATA[整数类型：INT有6种类型，不同的类型的最大存储范围不同，占用的存储空间也不同。字符类型：变长情况下，varchar更节省空间，但varchar字段需要一个字节来记录长度。比如：联系地址。固定长度用char，不要用varchar，比如：行政区划编码。非空：非空字段尽量定义成 NOT NULL，提供默认值，或者使用特殊值、空串代替null。NULL类型的存储、优化、使用都存在问题。不要用外键、触发器、视图。]]></description><category></category></item><item><title><![CDATA[5、InnoDB锁机制]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/157220970</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/157220970</guid><author>a4827909</author><pubDate>Wed, 21 Jan 2026 19:45:36 +0800</pubDate><description><![CDATA[共享锁是一种读锁，允许其他事务添加共享锁或读取数据，不允许其他事务修改数据。不要在加上读锁以后去写数据，可能出现死锁。可以用 select … lock in share mode 的方式手工加上一把读锁。]]></description><category></category></item><item><title><![CDATA[4、数据库的事务]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/157216325</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/157216325</guid><author>a4827909</author><pubDate>Wed, 21 Jan 2026 16:43:39 +0800</pubDate><description><![CDATA[一组数据库操作，执行后要么都成功，要么都失败。]]></description><category></category></item><item><title><![CDATA[3、InnoDB索引]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/157202298</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/157202298</guid><author>a4827909</author><pubDate>Wed, 21 Jan 2026 11:22:09 +0800</pubDate><description><![CDATA[比如左子树的深度是2，右子树的深度只能是1或者3。如何保证深度差不能超过1呢？通过左旋/右旋重新调整树的结构。如下图：平衡二叉树作为索引怎么査询数据？平衡二叉树的节点是一个大小固定的单位，作为索引应该存储什么内容？索引必须要存建立索引的字段的值，叫做键值（比如id）。还要存完整记录在磁盘上的地址。由于AVL树是二叉树，所以还要额外地存储左右子树的指针。问题是，索引的数据在磁盘上，用树状结构存储索引时，访问一个节点需要跟磁盘发生一次I/O操作。]]></description><category></category></item><item><title><![CDATA[2、InnoDB总体架构]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/157169942</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/157169942</guid><author>a4827909</author><pubDate>Tue, 20 Jan 2026 16:49:58 +0800</pubDate><description><![CDATA[InnoDB 中每张表必须有一个聚簇索引。如果用户显式定义了主键，则用主键作为；否则 InnoDB 会自动选择一个合适的列或隐式创建一个 6 字节的 row_id 作为聚簇索引，这个列的内容必须满足 UNIQUE + NOT NULL。聚簇索引以B+树的形式存储在磁盘中，B+树的，每个页中包含了表中的多条数据，页中的数据以有序单链表的形式存储。当访问数据的时候，InnoDB 会以页为最小单位，将页数据从磁盘加载到 Buffer Pool。表的数据就是存储在聚簇索引的叶子节点中。]]></description><category></category></item><item><title><![CDATA[1、一条SQL是如何执行的]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/157137829</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/157137829</guid><author>a4827909</author><pubDate>Mon, 19 Jan 2026 16:48:39 +0800</pubDate><description><![CDATA[一条SQL的执行流程。]]></description><category></category></item><item><title><![CDATA[5、Redis分布式锁]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/157021290</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/157021290</guid><author>a4827909</author><pubDate>Fri, 16 Jan 2026 11:29:10 +0800</pubDate><description><![CDATA[假设Redis服务是主从结构的，应用1获取到了分布式锁，但master还没将信息同步至slave就宕机了，slave升级为新的master，此时应用2同样可以获取到相同的分布式锁。Redis单线程执行命令，且会把Lua脚本看作一个完整的命令来执行，一次保证了操作命令的原子性。设置值和给值设定过期时间需要进行两次操作，如果 setnx 成功了，但是在设定过期时间之前，进程崩溃，那么这个锁就永远不会失效，除非手动删除对应kv。尽管可以原子性的设置锁和过期时间，但是如果业务执行时间超过过期时间，锁就失效了。]]></description><category></category></item><item><title><![CDATA[4、Redis核心原理]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/156987429</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/156987429</guid><author>a4827909</author><pubDate>Thu, 15 Jan 2026 16:41:20 +0800</pubDate><description><![CDATA[kv结构的内存数据库，时间复杂度0(1)。]]></description><category></category></item><item><title><![CDATA[3、Redis数据结构]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/156979785</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/156979785</guid><author>a4827909</author><pubDate>Thu, 15 Jan 2026 15:13:08 +0800</pubDate><description><![CDATA[当存入kv时，对key进行hash运算，得到的结果作为dictEntry[]数组的下标，这个kv就存储在这个下标对应的dictEntry *table(存储kv的哈希桶)中。如果不同的key进行hash运算后得到相同的结果，即发生hash冲突，dictEntry[]数组这个位置，就会以dictEntry *table链表的形式，存储所有的kv值。Hyperloglogs提供了一种不太精确的基数统计方法，用来统计一个集合中不重复的元素个数，比如统计网站的UV，或者应用的日活、月活，存在一定的误差。]]></description><category></category></item><item><title><![CDATA[HashMap源码分析]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/156902771</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/156902771</guid><author>a4827909</author><pubDate>Tue, 13 Jan 2026 15:13:21 +0800</pubDate><description><![CDATA[初始化加载因子loadFactor = 0.75，如果不设置容量，初始化容量默认16。容量指的是底层，而不是HashMap中的元素个数。当HashMap中的已使用容量超过【】时，如果本次插入数据后，已占用【初始化容量*0.75】这么多的容量，那么下次插入数据时触发扩容。扩容后的容量=初始化容量*2。如代码，如果创建时指定了初始化容量12，并不是指HashMap能容纳的键值对数量，而是底层数据的长度。]]></description><category></category></item><item><title><![CDATA[2、Redis集群]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/156864418</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/156864418</guid><author>a4827909</author><pubDate>Mon, 12 Jan 2026 16:50:30 +0800</pubDate><description><![CDATA[自动故障迁移：master节点宕机后，会将一个slave节点升级为新的master节点，并将新master节点信息同步给客户端。slave加载完rdb文件后，master将缓存的指令发送给slave。一个哨兵进程对Redis服务器进行监控，可能会出现问题一般是使用多个哨兵进行监控，各个哨兵之间还会进行监控，形成多哨兵模式。如果是yes，则支持无磁盘复制，master子进程直接将rdb文件通过网络发送给slave，不存储到master磁盘。主节点故障，可将从节点升级为主节点，实现。，分担主节点读压力。]]></description><category></category></item><item><title><![CDATA[1、Redis基础]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/156861201</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/156861201</guid><author>a4827909</author><pubDate>Mon, 12 Jan 2026 15:16:47 +0800</pubDate><description><![CDATA[hash 是一个 string 类型的 field（字段） 和 value（值） 的映射表，hash 特别适合用于存储对象。GET、SET、GETSET(设置新值、返回旧值)、MGET、MSET、SETNX(指定key不存在则设置新值，若存在则返回0，无法覆盖)、INCR(设置value+1)、、ZSet 是 String 类型的有序Set集合，很多地方也被称为SortedSet，Set集合成员是唯一的。Set集合是通过哈希表实现的，添加、删除、查找的复杂度都是 O(1)，对Set操作的执行效率极高。]]></description><category></category></item><item><title><![CDATA[性能优化篇]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/156732596</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/156732596</guid><author>a4827909</author><pubDate>Fri, 09 Jan 2026 21:28:15 +0800</pubDate><description><![CDATA[按行对数据进行拆分，根据某个分片算法（范围法、Hash法）将记录分别存放在不同表中，通过大表拆小表的方式缩小数据查询范围、提高处理效率，所有分表的表结构完全相同。将一张大表分成若干小表，小表表结构不同，通过主键进行关联，如将一张商品信息表分为基本信息表和详情信息表，通过商品id做关联。]]></description><category></category></item><item><title><![CDATA[5、Kafka面试相关问题]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/156726562</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/156726562</guid><author>a4827909</author><pubDate>Thu, 08 Jan 2026 16:47:38 +0800</pubDate><description><![CDATA[顺序I/O、索引、批量读写和文件压缩、零拷贝        磁盘的构造如图。磁盘的盘片不停地旋转，磁头会在磁盘表面画出一个圆形轨迹，叫磁道。从内到外半径不同有很多磁道。然后又用半径线，把磁道分割成了扇区（两根射线之内的扇区组成扇面）。如果要读写数据, 必须找到数据对应的扇区，这个过程就叫寻址。        Kafka的message是不断追加到本地磁盘文件末尾的，而不是随机的写入，这使得 Kafka写入吞吐量得到了显著提升。
  顺序IO到底有多快呢？下图显示，在一定条件下测试，磁盘的顺序读写可以达到53]]></description><category></category></item><item><title><![CDATA[4、Kafka原理-Consumer]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/156716502</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/156716502</guid><author>a4827909</author><pubDate>Thu, 08 Jan 2026 15:41:03 +0800</pubDate><description><![CDATA[正常情况下，我们希望消费没有被消费过的数据，而且是从最先发送（序号小的） 的开始消费（这样才是有序和公平的）。为了保证系统最大的利用率，Kafka的分配策略一定会遵循一个最基本的原则——平均分配，简单理解，不会有任意两个消费者消费的分区数差大于1。注意：这不是表示一个消费者和一个Topic的关系，而是一个consumer group和topic中的一个partition的关系（offset在partition中连续编号而不是全局连续编号）。所以当消费者数量大于分区数量时，多余的消费者是无法消费消息的。]]></description><category></category></item><item><title><![CDATA[3、Kafka原理-消息存储]]></title><link>https://blog.youkuaiyun.com/a4827909/article/details/156712922</link><guid>https://blog.youkuaiyun.com/a4827909/article/details/156712922</guid><author>a4827909</author><pubDate>Thu, 08 Jan 2026 11:03:15 +0800</pubDate><description><![CDATA[若B重启期间发生过leader选举（假设存在副本C、D），则leader-epoch-checkpoint文件存在多条记录(0 0)，(1 10)，(2 50)（又发生两次选举），此时B的epoch小于2，会将B的LEO与10比较（大于epoch(B)的最小epoch是1），同样不会丢弃数据。若B重启期间未发生leader选举，则A的leader-epoch-checkpoint文件与B一致，都是(0 0)，即epoch(A)=epoch(B),此时LEO(B)=LEO(A)=1，无需截取。]]></description><category></category></item></channel></rss>