- 博客(212)
- 资源 (2)
- 收藏
- 关注
原创 docker 镜像和分层文件的关系
Docker镜像采用分层文件系统设计,由多个只读层堆叠而成,每个层对应Dockerfile指令。容器运行时会在镜像层之上添加可写层,所有修改通过写时复制机制实现。这种架构通过存储驱动(如overlay2)物理实现,具有三大优势:共享层节省空间、缓存层加速构建、增量传输优化网络。实践验证可通过docker命令查看分层结构,关键要注意大文件处理和跨层删除问题。性能测试显示分层系统可使容器启动速度提升10倍、存储空间节省85%。本质上,Docker镜像=只读层+元数据,容器=镜像层+可写层,实现高效存储、快速部署
2025-06-25 10:27:11
418
原创 docker 分层文件系统和 push 的关系
Docker的分层文件系统是其高效镜像管理的核心机制,与docker push操作紧密相关。镜像由多个只读层堆叠组成,每层通过SHA256标识,不同镜像可共享基础层。docker push时仅上传仓库缺失的层,已存在的层直接复用,实现增量传输。这种设计大幅提升了传输效率(如仅10MB变更时比全量推送节省98%带宽)、存储效率和构建速度。最佳实践包括优化层结构、使用多阶段构建和保持基础镜像一致,充分发挥Docker分层机制在持续集成和微服务中的优势。
2025-06-25 10:26:29
400
原创 算法-动态规划-钢条切割问题
钢条切割问题是一个经典的动态规划问题,目标是切割给定长度的钢条以获得最大收益。通过构建最优子结构,设r[i]为长度i的最大收益,递推公式为r[i] = max(p[j] + r[i-j])。算法自底向上计算收益数组r和切割方案s,时间复杂度O(n²),空间复杂度O(n)。示例演示了n=4时,切割为2+2获得最大收益10的过程,并提供Python实现代码。该方法高效解决任意钢条长度和价格表的最优切割问题。
2025-06-22 23:03:12
580
原创 Shell脚本中变量赋值${VAR:-DEFAULT}的用法
Shell 变量赋值的参数扩展语法摘要: 核心语法: ${VAR:-DEFAULT}:空/未定义时用默认值(不修改VAR) ${VAR:=DEFAULT}:空/未定义时设置默认值(修改VAR) ${VAR:+REPLACE}:非空时替换值 ${VAR:?ERROR}:空/未定义时报错 典型应用: 变量默认值设置 条件参数替换 强制变量检查 支持嵌套和命令替换 注意事项: 含空格需加引号 :=会修改原变量 主流Shell通用 优先使用:-获取默认值,谨慎使用:=修改原变量,复杂场景可嵌套使用。
2025-06-16 15:23:23
673
原创 7种方法提高源码阅读技巧
Reading source code is in the job description of a software developer. However, this experience is not always pleasant. Not everyone would like to read someone else’s code because they find it boring, sometimes frustrating. There are cases when you start r
2025-06-15 21:25:45
705
原创 微服务架构的优点和缺点
微服务架构将复杂系统拆分为独立可部署的小服务,具有五大优势:提升可扩展性、增强故障隔离、提高团队效率、加快部署速度并降低成本。但同时也面临分布式系统复杂性、部署协调困难、测试调试繁琐等挑战。通过实施DevOps实践、建立监控日志系统、优化服务间通信和集中化管理,可以有效应对这些问题。亚马逊、Netflix等企业已成功采用微服务架构,但需根据项目复杂度、团队能力等因素谨慎评估是否采用该架构。微服务的模块化特性使维护更新更高效,是构建现代弹性应用的重要方案。
2025-06-15 20:43:59
1117
原创 一个国外工程师在支付系统中引入kafka的心路历程-How Kafka Saved Our Payment System And Helped Us Scale to 10 Million Users
摘要: 一家公司的支付系统因耦合设计导致性能瓶颈——核心交易流程与邮件、通知等次要服务同步执行,一旦某个环节延迟,整个系统崩溃,用户遭遇重复扣款等问题。团队引入Kafka消息队列进行解耦:支付成功后仅发布事件,由独立消费者异步处理邮件、日志等任务。这一改造使支付响应速度提升,系统稳定性增强,且新增功能只需接入Kafka即可,无需修改核心代码。最终,事件驱动架构支撑了千万级用户规模,赋予团队可扩展性与运维信心。(150字)
2025-06-14 23:35:37
466
原创 深入理解raft算法-Deep Dive into Raft: Consensus Algorithms in Distributed Systems
nextIndexnextIndexOnce the。
2025-06-14 22:56:16
1272
原创 H2数据库中一条insert语句到生成java对象到数据写入磁盘的完整步骤
完整流程示例1. 用户发送 `INSERT` SQL2. 生成 `Insert` 命令对象3. 创建 `Row` 并填充 `Value` 数据4. 更新内存中的 `MVMap`(B+Tree)5. 事务提交时触发: - 写入 WAL 日志(`.trace.db`) - 标记脏页 - 异步线程执行磁盘写入6. 数据最终以分块形式持久化到 `.mv.db` 文件
2025-05-18 10:28:07
1156
原创 H2数据库源码学习+debug, 数据库 sql、数据库引擎、数据库存储从此不再神秘
H2数据库源码采用标准Maven结构,核心模块包括SQL解析与执行、数据库引擎、表结构操作、索引实现、存储引擎等。SQL解析通过递归下降解析器将SQL语句转换为抽象语法树,查询优化由Query类和Optimizer负责。存储引擎采用页式存储和事务日志机制,确保ACID特性。MVCC与事务管理通过TransactionStore和LockManager实现多版本控制和行级锁。索引实现包括B-Tree、哈希索引和MVStore的跳跃表结构。
2025-05-18 10:03:57
669
原创 软件系统的可观测性 Observability
传统监控可能无法覆盖所有异常场景,Observability 允许通过数据关联(如“某时段错误率上升” + “相关日志” + “调用链瓶颈”)快速定位问题。在云原生环境中(如 Kubernetes),服务实例动态扩缩容,Observability 提供实时、细粒度的运行状态视图。现代系统(如微服务、容器化架构)依赖众多组件,问题可能跨服务、跨节点发生,需通过链路追踪和上下文日志快速定位根源。避免过度收集数据(如全量日志),采用采样(Sampling)和聚合(Aggregation)减少存储与分析开销。
2025-05-07 20:09:27
632
原创 扩展正则表达式(Extended Regular Expression,ERE)和基本正则表达式(Basic Regular Expression,BRE)的区别
扩展正则表达式(Extended Regular Expression,ERE)和基本正则表达式(Basic Regular Expression,BRE)是正则表达式的两种语法标准,主要区别在于和。
2025-05-07 19:07:19
333
原创 java Servlet Session 本身局限性&解决方案
Java Servlet 的 Session 机制本身并未被废弃,但在分布式系统(如微服务架构、集群部署)中确实存在局限性。不过,这并不意味着它无法在分布式项目中使用,而是需要结合特定技术手段来解决其扩展性和一致性问题。,但在分布式系统中需通过集中式存储(如 Redis)或框架支持(如 Spring Session)解决扩展性问题。对于追求极致无状态的场景,可转向 Token 方案。技术选型应基于实际需求(性能、维护成本、架构复杂度)权衡。pom.xml 添加依赖。
2025-05-03 19:27:36
415
原创 Spring 事务的底层原理&常见陷阱
动态代理 + 事务管理器 + ThreadLocal 是 Spring 事务的核心。自调用、异常处理、传播行为、数据库支持 是常见陷阱。通过代码审查、日志(如 AbstractPlatformTransactionManager 的 DEBUG 日志)排查问题。
2025-05-03 19:20:28
1145
原创 java整则表达式Matcher类核心方法的用法&案例说明
matches() 检查整个字符串是否完全匹配 验证输入格式(如邮箱)find() 查找下一个匹配的子串 提取字符串中的特定模式group() 获取匹配内容或捕获组 解析结构化文本(如日志)start()/end() 获取匹配位置的索引 高亮显示匹配文本replaceAll() 替换所有匹配的子串 批量文本替换appendReplacement() 流式构建替换结果 复杂替换逻辑lookingAt() 检查字符串开头是否匹配 快速前缀验证
2025-05-02 09:09:05
974
原创 用java实现一个简单的sql select 解析器,无需第三方依赖,完全从0开始
以下是一个简单的 SQL SELECT 解析器的 Java 实现,支持单表查询和基本条件过滤。代码包含词法分析和语法分析模块,并支持以下语法:SELECT column1, column2 FROM table WHERE column3 = 5public enum TokenType {SELECT, FROM, WHERE,IDENTIFIER, COMMA, STAR, EQUALS,STRING, NUMBER, EOF}public class Token {public final
2025-05-02 04:30:00
2367
原创 Lucene多种数据类型使用说明
存储词项的位置、偏移量信息,支持高亮(Highlighting)。// 定义 String 类型字段(精确匹配):排序、聚合、分组(类似数据库的列式存储)。:允许一个字段存储多个值(如标签、分类)。:精确值匹配(如 ID、状态码、标签)。:范围查询(如价格、年龄)、排序、聚合。// 定义数值字段(IntPoint)// 存储原始值(需额外存储字段)
2025-05-01 21:35:31
1215
原创 Lucene并不是只有倒排索引一种数据结构,支持多种数据结构
Lucene 的核心机制确实以**倒排索引(Inverted Index)**为核心,但它并不是“全部”都依赖倒排索引。Lucene 的索引结构中还包含其他辅助数据结构,用于支持不同的查询场景。,但为了实现完整的搜索功能,它还依赖其他辅助数据结构。因此,Lucene 的索引是多种数据结构的组合,而不仅仅是倒排索引。,用于实现高效的全文搜索。:支持关键词搜索、短语查询、模糊查询等。:记录每个词项出现在哪些文档中(通过。倒排索引是 Lucene 的。
2025-05-01 21:33:18
1003
原创 用spring-boot-maven-plugin打包成单个jar有哪些缺点&优化方案
Fat JAR 的缺点主要集中在 性能开销、维护成本 和 场景适配性 上。建议根据以下场景选择:继续使用 Fat JAR:适合简单应用、快速原型开发或容器化部署(如 Docker + 分层构建)。切换其他方案:若追求极致启动速度 → Spring Native;若需共享依赖 → WAR + Tomcat;若依赖频繁更新 → Docker 分层镜像。
2025-05-01 21:23:26
821
原创 spring-boot-maven-plugin 将spring打包成单个jar的工作原理
核心功能:将 Spring Boot 应用及其依赖打包成一个自包含的 JAR。关键机制:自定义类加载器(JarLauncher)和嵌套依赖结构(BOOT-INF/lib)。优势:简化部署,无需外部 Web 服务器或依赖管理。适用场景:独立运行、容器化部署(Docker)等。
2025-05-01 21:07:20
1485
原创 redis 错误消息: BUSYKEY Target key name already exists.
迁移数据到目标 Redis 实例时,若目标键已存在且未启用覆盖。,但当前操作未明确允许覆盖。错误时,通常是因为你正在尝试覆盖一个。不允许覆盖已存在的键。参数,强制覆盖目标键。命令不允许覆盖目标键。
2025-03-02 14:30:00
393
原创 redis replication 环形缓冲区算法
用于临时存储主节点最近传播的写命令。当从节点短暂断开后重连时,如果所需数据仍在缓冲区中,主节点可以直接发送增量数据,避免全量同步的开销。Redis 的环形缓冲区通过高效的内存管理和偏移量追踪机制,显著提升了主从复制的健壮性和性能。(Partial Resynchronization)的核心机制。(Replication Backlog)是实现主从节点。是避免全量同步的关键。
2025-03-02 03:30:00
1322
原创 redis repl_backlog_first_byte_offset 这个字段的作用
repl_backlog_first_byte_offset` 是 Redis 复制积压缓冲区(Replication Backlog)中的一个关键字段,其作用是。当主从节点断开重连时,Redis 需要通过复制积压缓冲区(一个环形内存区域)快速恢复增量数据同步。积压缓冲区是环形的(类似一个循环队列),当写入数据超过缓冲区容量时,旧数据会被覆盖。(即缓冲区的起始位置对应的全局复制偏移量)。会向前推进(即增加),表示缓冲区的新起点。从节点重连主节点时,会将自己的。(已复制的偏移量)与主节点的。
2025-03-01 22:47:34
316
原创 redis slaveof 命令 执行后为什么需要清库重新同步
如果从节点之前有其他数据(例如曾是其他主节点的副本,或自身是独立主节点),直接保留数据会导致新旧数据混合。主节点的数据状态可能与从节点存在冲突(例如相同的键但值不同),导致数据逻辑错误。
2025-03-01 22:45:37
1005
原创 golang lumberjack 日志包
Lumberjackloglogruszap` 等)结合使用。它的核心功能是自动管理日志文件的切割、备份和清理,避免日志文件无限增长占用磁盘空间。当单个日志文件大小超过设定阈值(如100MB)时,自动创建新文件,旧文件按时间戳重命名备份。支持设置日志文件的最大保留时间(如保留最近7 天的日志),超时文件自动删除。可设置最大备份文件数(如最多保留5 个备份),超出数量时删除最旧的日志。支持并发写入,适用于高并发场景。
2025-02-28 02:45:00
459
原创 Mockito doreturn 和 thenreturn 这两个方法的区别
在于是否会在存根(Stubbing)过程中调用真实方法。都用于设置模拟对象的方法返回值,但它们的。在 Mockito 中,
2025-02-27 19:59:06
477
原创 redis restore 命令的用法
命令生成)恢复为 Redis 的键值。它在数据迁移、备份恢复和跨实例同步等场景中非常有用。,Redis 提供了灵活的数据管理能力,适用于多种运维场景。命令用于将序列化后的数据(通常由。
2025-02-27 19:54:35
752
原创 redis rdb文件格式&解析
Redis的RDB文件是二进制格式的持久化文件,解析需按特定结构逐字节处理。[魔数(5字节)] [RDB版本(4字节)] [数据库数据区] [0xFF] [校验和(8字节)][过期时间(可选)] [LRU/LFU信息(可选)] [类型(1字节)] [键] [值]0xFE [数据库编号] [键值对1] [键值对2] …
2025-02-26 16:00:00
519
原创 redis PSYNC命令详解
PSYNC?-1是 Redis 主从复制中从节点(Replica)向主节点(Master)发起全量同步(Full Resynchronization)的标准命令格式。PSYNC?-1?-1Redis 的PSYNC命令用于主从同步,支持和PSYNC?-1是使用的命令格式,强制触发全量同步。PSYNC?-1?-1主节点收到命令后,会检查参数:因复制 ID 和偏移量无效,主节点判定需全量同步。主节点返回格式:repl_idoffsetforkPSYNC?
2025-02-26 08:53:01
799
原创 redis REPLCONF 命令详解
REPLCONF是 Redis 主从复制(Replication)中用于配置复制流程的内部命令。它主要用于主节点和从节点之间的通信,帮助实现复制状态同步、心跳检测和偏移量确认等功能。以下是REPLCONF。
2025-02-25 16:30:00
828
原创 electron 的原理,使用场景,简单用法
preloadipcMain适合需要同时支持多操作系统的工具类应用(如 VS Code、Figma、Slack)。团队熟悉 Web 技术栈时,可快速构建原型或成熟应用。需同时访问 Web 内容和本地系统资源的场景(如 Git 客户端、聊天工具)。内部管理系统、数据可视化仪表盘等。
2025-02-25 02:00:00
916
原创 Electron支持的存储类型
数据在应用重启后保留(localStorage)或会话期间保留(sessionStorage),复杂数据用 SQLite/IndexedDB。// 渲染进程(如 React/Vue 组件):用户配置、轻量级数据(跨进程、持久化)根据需求选择合适的存储方式,小型配置用。:保存用户配置、日志文件、大型数据文件。:保存敏感信息(密码、API 密钥):简单的键值对存储(仅限渲染进程):结构化数据存储,支持事务和查询。// 渲染进程中打开数据库。// 主进程或渲染进程。:关系型数据、复杂查询。
2025-02-24 16:00:00
840
原创 golang range 的用法
range支持数组、切片、map、字符串和通道的遍历。返回值形式灵活,可选择性忽略索引或值(用遍历 map 时顺序随机,字符串遍历按 Unicode 码点处理,通道遍历需提前关闭。
2025-02-24 02:30:00
1159
原创 redis sentinel配置“sentinel parallel-syncs mymaster 1“详解
当 Sentinel 触发故障转移并选出新主节点后,剩余的从节点需要与新主节点重新建立复制关系(即执行。,可以在故障转移后平衡数据同步速度和主节点稳定性,避免服务雪崩。,目的是避免新主节点因过多并发同步请求导致性能问题。(Redis 默认保守配置,避免新主节点过载)。宕机,Sentinel 触发故障转移,选举。在 Redis Sentinel 的配置中,在 Sentinel 配置文件(如。
2025-02-23 14:00:00
551
原创 redis SLAVEOF NO ONE 命令详解
通过提升从节点为独立主节点实现快速恢复。使用时需严格评估数据一致性、客户端路由及 Sentinel 集成,避免引入运维风险。在自动化高可用场景中,优先依赖 Redis Sentinel 或 Redis Cluster 实现故障切换。是 Redis 中一个关键命令,用于将一个从节点(Replica),停止其复制行为,使其独立处理读写请求。是 Redis 主从架构中。
2025-02-23 02:45:00
848
原创 手动搭建Redis1主2从+ 3 Sentinel 高可用集群
通过以上步骤,您已成功部署一个基于 Redis Sentinel 的高可用集群。Sentinel 会持续监控主节点,并在故障时自动切换至从节点,保障服务可用性。查看 Sentinel 日志文件(如。
2025-02-22 10:06:53
421
原创 go channel 的用法和核心原理、使用场景
Channel 是 Go 并发模型的核心组件,通过通信共享内存的设计哲学,简化了并发编程的复杂性。合理使用无缓冲 Channel 实现同步,有缓冲 Channel 实现异步队列,配合select和 Goroutine 可以构建高效、清晰的并发架构。
2025-02-22 10:03:54
955
基于java jdbc 的数据库表结构生成工具 源代码
2024-12-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人