- 博客(70)
- 收藏
- 关注
原创 【LeetCode】二叉树相关算法题
LeetCode第34题,题目如下:给一个按照非递减顺序排列的整数数组nums,和一个目标值target。请找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1, -1]。设计并实现时间复杂度为O(log n)的算法来解决问题。
2025-06-10 20:45:10
569
原创 【Kafka】kafka架构
这种架构设计使kafka能够支持高吞吐量(百万级消息/秒)、低延迟(毫秒级)的消息处理,同时保证高可用性和水平扩展能力,成为现代分布式系统中广泛采用的消息中间件解决方案。3、每个段包含两个文件:.log文件存储实际消息、.index文件存储消息偏移量索引。1、生产者(Producer):负责创建并发布消息到kafka集群的客户端应用程序。2、消费者(Consumer):订阅主题并处理消息的客户端应用程序。2、日志管理器(Log Manager):负责消息的物理存储和检索。
2025-06-08 00:33:18
479
原创 【Kafka】消息队列
1、生产者(Producer):创建并发送消息的应用程序。2、消费者(Consumer):接收并处理消息的应用程序。5、代理(Broker):管理队列的中间件服务。3、消息(Message):传输的数据单元。1、异步通信:生产者和消费者不需要同时在线。4、队列(Queue):存储消息的缓冲区。1、消息顺序:保证消息处理的顺序性。1、合理设置消息TTL(生存时间)1、一个消息只能被一个消费者消费。1、异步处理(如发送邮件、短信)3、消息堆积:消费者处理能力不足。5、监控管理:消息跟踪和监控。
2025-06-08 00:25:06
328
原创 【Redis】缓存雪崩、缓存击穿、缓存穿透
大量缓存数据在同一时间失效,导致所有请求直接打到数据库,引发数据库瞬时高负载甚至崩溃某个热点key突然失效,大量并发请求直接穿透到数据库,导致数据库压力激增查询不存在的数据(如非法ID、恶意攻击),导致请求绕过缓存直接访问数据库问题触发条件核心解决方案缓存雪崩大量key同时失效差异化TTL、多级缓存、熔断降级缓存击穿单个热点key失效互斥锁、逻辑过期、预加载缓存穿透查询不存在的数据布隆过滤器、控制缓存、参数校验。
2025-06-07 10:14:52
487
原创 【Redis】数据库与缓存一致性
数据库与缓存一致性是指当数据同存在于数据库和缓存中时,如何确保两者数据保持同步,避免出现数据不一致的情况。1、缓存击穿后并发重建:使用互斥锁防止多个请求同时重建缓存。2、主从延迟:主库更新后从库可能还未同步,导致读取到旧数据。2、设置合理的缓存过期时间:即使不一致也有自动恢复机制。2、读请求可能在删除后、更新前将旧数据加载到缓存。2、并发操作问题:多个请求同时操作数据库和缓存。1、写入顺序问题:先更新数据库还是先更新缓存。2、未命中则查数据库,写入缓存后返回。2、但删除缓存失败会导致不一致。
2025-06-07 10:14:24
586
原创 【Redis】哨兵模式
Redis哨兵模式(Sentinel)是Redis官方提供的高可用性(HA)解决方案,用于监控和管理Redis主从架构,实现自动故障检测、主从切换和配置更新。2、Redis主从集群:至少包含1个主节点和若干个从节点(建议至少2个从节点)1、监控:持续检测主节点(master)和从节点(replica)的运行状态。3、仲裁机制:通常部署3个或以上哨兵节点(避免单节点故障,基于多数投票决策)2、自动故障转移:当主节点不可用时,哨兵会选举一个从节点晋升为新主节点。2、监控哨兵进程本身(避免哨兵单节点故障)
2025-06-06 11:15:40
811
原创 【Redis】Cluster集群
2、若不在,且该槽的迁移未在进行中时,返回MOVED [slot] [target-node:port]错误,客户端需缓存槽与节点的映射关系。1、主节点故障检测:其它节点通过心跳检测超时标记节点为PFAIL,超过半数主节点确认后标记为FAIL。每个主节点可以配置多个从节点,主节点故障时,从节点通过选举晋升为新主节点(基于Raft协议)2、从节点晋升:从节点发起选举,获取多数主节点投票后晋升为新主节点。2、从节点:复制主节点数据,故障时替换主节点。1、主节点:处理读写请求,管理分配的哈希槽。
2025-06-06 11:15:10
593
原创 【Redis】内存淘汰策略
2、无过期键的影响:volatile-*策略在无键设置TTL时会退化为noeviction。适用于对数据一致性要求极高的场景,确保不会因淘汰策略丢失数据。仅从设置了过期时间(TTL)的键中淘汰最近最少使用的键。适用于需要缓存热点数据的场景,优先保留最近访问频繁的键。适用于部分数据有TTL的场景,优先淘汰不常用的过期键。仅从设置了过期时间的键中淘汰访问频率最低的键。从所有键中淘汰最近最少使用(LRU)的键。仅从设置了过期时间的键中随机淘汰。从所有键中淘汰访问频率最低的键。从所有键中随机淘汰键。
2025-06-05 10:27:30
515
原创 【Golang】使用gin框架导入excel和csv文件
批量导入数据是项目中很常见的一个功能,通常大量的数据以表格的形式存储再导入,本篇文件就讲一下通过go库导入excel和csv文件功能。
2025-06-04 09:43:13
201
原创 【Redis】过期删除策略
策略触发条件优点缺点惰性删除键被访问时检查cpu友好,简单高效可能内存泄漏定期删除周期性随机检查减少内存泄漏非实时,依赖配置。
2025-06-04 09:42:30
329
原创 【Redis】大key对持久化的影响
2、fork延迟:BGSAVE需要fork子进程,大key会导致fork操作耗时增加(尤其在虚拟内存较大的实例中)4、版本选择:使用redis 4.0+版本,其改进的lazy-free机制可降低大key删除对持久化的影响。2、内存消耗:重写期间会创建子进程,大key导致内存占用翻倍(Copy-on-Write机制)1、追加延迟:每次修改大key都会生成较大的AOF记录,导致AOF文件膨胀。1、混合文件体积大:RDB部分包含大key会导致整个AOF文件头部膨胀。
2025-06-03 11:59:01
407
原创 【Golang】使用gin框架导出excel和csv文件
项目中可能会遇到导入导出一批数据的功能,对于批量大数据可能用表格的方式直观性更好,所以本篇文件来讲一下go中导出excel和csv文件的方式。下载excel文件,浏览器上输入。
2025-06-03 11:57:42
563
原创 【Redis】RDB和AOF混合使用
在Redis中,RDB(Redis Database)和AOF(Append-Only File)是两种不同的持久化机制,可以单独使用,也可以混合使用以结合两者的优势。1、AOF文件中包含RDB数据:定期生成RDB快照并写入AOF文件头部,后续操作仍以AOF格式追加。3、重启恢复:先加载RDB部分快速恢复基础数据,再重放AOF增量命令保证数据完整性。生成某个时间点的数据快照,文件紧凑、恢复速度快,但可能丢失最后一次快照后的数据。1、触发RDB快照:通过BGSAVE生成RDB数据,写入AOF文件头部。
2025-05-29 16:22:28
443
原创 【Redis】大key问题详解
在redis中,大key通常指以下三种情况之一:1、value过大:单个key的value体积过大(如字符串值超过10KB,集合/列表/哈希/有序集合元素过多)2、元素过多:集合类型(hash/list/set/zset)中包含大量元素(如超过5000个元素)3、结构复杂:key对应的数据结构嵌套过深或过于复杂。
2025-05-29 16:22:03
658
原创 【Redis】AOF重写策略与后台重写机制
2、(当前AOF大小 - 上次重写AOF大小) / 上次重写后AOF大小 ≥ auto-aof-rewrite-min-size。1、当前AOF文件大小 > auto-aof-rewrite-percentage。5、子进程完成时,主进程将重写缓冲区内容追加到新文件,原子性替换旧AOF文件。1、创建临时文件temp-rewriteaof-bg-[pid].aof。4、主进程继续服务,将新命令写入常规AOF缓冲区,同时写入重写缓冲区。1、重写后的AOF文件前半部分是RDB格式的快照。
2025-05-22 11:24:23
726
原创 【Redis】RDB快照
RDB(Redis Database)是redis默认的持久化方式,它通过创建内存数据的快照来实现持久化。RDB文件是个经过压缩的二进制文件,包含了redis在某个时间点的完整数据状态。同步保存(阻塞式,不推荐在生产环境使用,会导致redis阻塞直到RDB文件创建完成)异步保存(后台保存,推荐使用方式,redis会fork子进程进行保存)3、子进程将内存数据写入临时RDB文件,完成后替换旧RDB文件。2、主从复制时,从库首次同步会触发主库执行BGSAVE。2、fork()创建子进程(使用写时复制技术)
2025-05-22 11:23:49
800
原创 【Redis】AOF日志
AOF(Append Only File)是redis提供的持久化机制之一,它通过记录所有修改数据库状态的写命令来实现数据库持久化。1、命令记录:当AOF开启时,redis会将每个写命令追加到AOF缓冲区。2、everysec(默认):每秒同步一次,平衡安全性和性能。1、always:每个写命令都同步到磁盘,最安全但性能最低。3、no:由操作系统决定同步时机,性能最好但是可能丢失数据。2、文件同步:根据配置策略将缓冲去内容写入AOF文件。3、文件重写:定期执行AOF重写以压缩文件大小。
2025-05-21 14:58:39
583
1
原创 【Redis】AOF日志的三种写回机制
redis的AOF(Append Only File)持久化提供了三种不同的写回策略,通过appendfsync配置项来控制,这三种策略在数据安全性和性能之间提供了不同的权衡选择。3、主线程不阻塞,后台线程每秒检查一次缓冲区,缓冲区有数据就执行fsync()同步到磁盘。1、每次写入命令后立即执行fsync,将数据同步到磁盘。2、确保每个写命令都持久化到磁盘后才返回成功响应。3、立即调用fsync()将缓冲区内容写入磁盘。2、命令追加到AOF缓冲区。2、命令追加到AOF缓冲区。2、命令追加到AOF缓冲区。
2025-05-21 14:58:22
579
原创 【Redis】哈希表结构
redis中的hashtable(哈希表)是一种高效的键值对存储结构,主要用于实现redis的字典类型,接下来就来讲解一下hashtable(redis版本6.2.18)的底层实现。在redis的hashtable实现中,哈希冲突发生在两个或多个不同的键(key)被哈希函数映射到同一个哈希桶(bucket)的情况。1、扩容条件:当负载因子(哈希表已使用的节点数量/哈希表大小)> 1时,且服务器没有执行RDB快照或AOF重写。1、哈希函数的输出空间(哈希值范围)通常小于输入空间(可能的键数量)
2025-05-20 18:24:14
1047
原创 【Redis】跳表结构
redis中的跳表是一种有序数据结构,主要用于实现有序集合(zset)。跳表通过多级索引实现高效查找(平均O(logN)时间复杂度),同时保持插入和删除的高效性,下面就来讲解一下跳表(redis版本6.2.18)的底层结构。2、性能:与红黑树的查找/插入均为O(logN),但跳表更适合并发场景(Redis6.0后支持多线程)1、查找:从高层开始向右遍历,若下一节点分值大于目标值,则下降一层。1、平衡性:相比红黑树,跳表实现更简单,且支持范围查询。2、插入:随机生成节点层数,更新前后指针和跨度。
2025-05-20 18:23:53
548
原创 【Redis】整数集合结构
1、encoding属性值为INTSET_ENC_INT16,那么contents就是一个int16_t类型的数组,数组中每一个元素的类型都是int16_t。2、encoding属性值为INTSET_ENC_INT32,那么contents就是一个int32_t类型的数组,数组中每一个元素的类型都是int32_t。3、encoding属性值为INTSET_ENC_INT64,那么contents就是一个int64_t类型的数组,数组中每一个元素的类型都是int64_t。
2025-05-19 11:28:08
519
原创 【Redis】快速列表结构
向quicklist添加一个元素的时候,不会像普通的链表那样直接新建一个链表节点,而是会检查插入位置的压缩列表是否能够容纳该元素,如果能容纳就直接保存到quicklistNode结构里的压缩列表里,如果不能容纳,才会建一个新的quicklistNode结构。redis的quicklist(快速列表)是一个双向链表,其中每个节点都是一个ziplist(压缩列表)。这中结构结合了双向链表和压缩列表的优点,在内存使用和性能之间取得了平衡,接下来就来熟悉一下redis(6.2.18版本)的底层结构实现。
2025-05-19 11:26:24
325
原创 【Redis】双向链表结构
新版本使用快速列表,接下来就来讲一下redis(6.2.18版本)双向链表的底层结构。redis的list类型在旧版本数据量小的时候用的压缩列表,数据量大的时候用。
2025-05-15 18:13:03
334
原创 【Redis】压缩列表结构
ziplist(压缩列表)是redis中一种特殊编码的双向链表数据结构,主要用于存储小型列表和哈希表。ziplist并不是一个显式的c结构体,而是通过紧凑的字节数组来实现的。2、如果前一个entry的长度 >= 254字节,则prevlen占用5字节(第一个字节是0xFE,后4字节存储实际长度)。1、如果前一个entry的长度 < 254字节,则prevlen占用1字节(直接存储长度值)。2、如果数据类型为字符串,就根据字符串长度大小使用1、2、5字节编码。1、如果数据类型为整数,就使用1字节编码。
2025-05-15 18:12:23
590
原创 【Redis】键值对数据库实现
redis是一个(key-value)键值对数据库,其中value可以是五大基本数据类型:string、list、hash、set、zset,这五大基本数据类型对应着不同的底层结构,接下来就来讲解一下redis如何存储这些数据类型的。旧版本:大列表用LinkedList(内存碎片多),小列表用Ziplist(节省内存但修改效率低)。新版本:统一用Quicklist(双向链表节点内嵌Ziplist),兼顾内存和操作效率。新版本通过配置参数优化了Ziplist和Intset的转换条件,减少内存浪费。
2025-05-12 17:04:34
832
原创 【Redis】SDS结构
redis作为高性能的内存数据库,对字符串操作(如键、值的存储)有极高的要求。c语言原生字符串(以\0结尾的字符串数据)有一些缺点:长度计算需要遍历(O(n)时间复杂度)、频繁内存重分配、二进制不安全、无缓冲区管理。为了解决这些问题,redis使用了SDS(Simple Dynamic String),在兼容c字符串的同时,提供了更高效、更安全的能力。
2025-05-12 17:04:17
410
原创 【Golang】gin框架动态更新路由
/用于动态更新回调函数handler http.Handler //http处理器lock sync.RWMutex //保证更新http处理器接口时的并发安全//处理http请求d.handler.ServeHTTP(w, r) //真正处理http请求的地方d.handler = h //更新http处理器//初始化的回调函数})//更新之后的回调函数})
2025-05-09 14:56:44
441
原创 【Go底层】http标准库服务端实现原理
http协议的交互框架是C-S架构,C对应客户端模块,S对应服务端模块,接下来我们就基于Go1.23源码来熟悉http标准库中服务端的实现。,其中服务启用内部实现了。逻辑,接下来再深究内部。
2025-05-09 11:30:37
625
原创 【Redis】5种基本类型对应的底层结构
Redis的基本类型有5种:string、list、hash、set、zset,不同类型对应的底层结构不同,接下来就简单介绍一下其采用的什么底层结构。
2025-04-28 11:17:52
518
原创 【Redis】hash类型
Redis的hash是一种键值对集合类型,用于存储对象或结构化数据。其核心特点就是将多个字段(field)与值(value)映射到同一个键(key)下,适用于存储具有多个属性的实体。
2025-04-25 10:18:44
450
原创 【Redis】list类型
Redis的list是一种有序、可重复且支持双向操作的数据结构,常用于实现消息队列等场景,支持在头部和尾部高效插入/删除元素,同时具备灵活的操作能力。
2025-04-14 14:15:35
355
原创 【Redis】string类型
string是redis中最简单的键值对形式,它的value除了可以是字符串,还可以是数字、二进制数据,value的最大长度为521M,其底层主要通过int和SDS(简单动态字符串)组成。
2025-04-11 12:04:57
654
原创 【MySQL】InnoDB中的锁
InnoDB锁机制的背景是在保护事务隔离性的前提下最大化并发性,通过MVCC、行锁、表锁的协同,满足高并发场景需求。
2025-04-07 16:16:34
783
原创 【MySQL】InnoDB中的MVCC
MVCC是一种数据库并发控制技术,通过维护数据的多个历史版本实现读写操作的并行化,从而提升性能并解决事务隔离性问题。
2025-03-28 18:26:49
628
原创 【MySQL】undo日志页结构
通过undo日志能保证事务回滚,也就是原子性,上面讲过insert操作对应的undo日志可以直接删除,update和delete操作的不能,就是为了MVCC,多版本并发控制,后面再来讲解MVCC。
2025-03-21 17:59:41
1134
原创 【MySQL】undo日志类型
本文主要讲解了插入、删除、更新分别对应的undo日志结构,根据产生的这些undo日志就能进行事务回滚,具体的回滚方式后面再进行讲解。
2025-03-12 15:00:35
840
原创 【MySQL】redo日志写入磁盘的过程
redo日志是InnoDB使用崩溃恢复的核心机制,通过物理日志、顺序写入和checkpoint机制,保证事务的持久性并且提高了数据库的性能。
2025-03-10 15:26:16
1060
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人