- 博客(38)
- 收藏
- 关注
原创 【Redis】原理-数据结构
本文介绍了Redis中两种核心数据结构SDS(动态字符串)和IntSet(整数集合)的实现原理。SDS通过结构体sdshdr实现,采用内存预分配策略提升性能,支持O(1)时间复杂度获取长度和动态扩容。IntSet基于整数数组实现,具有自动升级编码机制,当插入超出当前编码范围的数值时会触发扩容和编码升级。两种结构都采用智能扩容策略:SDS按需预分配内存,IntSet每次仅扩容1个单位并保持有序性。这些设计使Redis在处理字符串和整数集合时兼具高效性和灵活性。
2025-12-21 16:57:08
589
原创 【实践】k8s部署美团 Leaf 应用
Leaf是美团开源的分布式ID生成系统,支持号段模式和雪花模式。号段模式通过数据库批量获取ID区间缓存在本地,减少数据库访问,保证ID有序性;雪花模式基于时间戳和机器标识生成64位ID,完全去中心化但依赖时钟同步。系统部署需要MySQL数据库和ZooKeeper支持,通过Docker和Kubernetes可实现高可用集群部署。Leaf适用于订单号、用户ID等需要高性能、分布式ID生成的场景。
2025-12-06 18:27:48
941
原创 【操作系统】文件系统
文件系统是持久性存储的抽象,负责组织、控制和访问文件。它通过文件描述符为应用程序提供操作接口,维护打开文件表管理文件元数据。文件系统将物理扇区与字节集合建立映射关系,采用缓存机制优化访问性能。目录结构支持分层组织,通过挂载实现不同文件系统的访问。文件分配方式包括连续、链式和索引分配,其中多级索引块可高效处理大文件。空闲空间列表用于管理存储资源。虚拟文件系统作为抽象层,统一不同文件系统的操作接口。数据块缓存和页缓存技术提升文件访问效率,打开文件表记录进程的文件操作状态。
2025-11-28 13:51:53
499
原创 【操作系统】进程间通信IPC
本文介绍了进程间通信(IPC)的几种主要方式。首先区分了直接通信(需要建立链路)和间接通信(通过内核共享资源)两种模型,并讨论了阻塞/非阻塞模式及通信链路缓冲机制。然后详细讲解了四种具体实现方式:信号(异步通知机制)、管道(通过共享文件实现)、消息队列(支持结构化数据传输)和共享内存(最高效但需同步保护)。最后提到Socket也是一种IPC方式。文章通过图示和类比说明了各种通信机制的工作原理及特点,帮助理解不同场景下进程间数据交换的实现方法。
2025-11-26 10:36:59
362
原创 【操作系统】死锁问题及解决方法
本文讨论了计算机系统中的死锁问题及其处理方法。文章首先通过道路变窄的类比解释死锁现象,然后介绍了系统模型中的资源分配图表示方法。死锁的四个必要条件被阐述为互斥、占用并等待、非抢占和循环等待。针对死锁问题,文章分析了三种处理策略:死锁预防(通过破坏必要条件)、死锁避免(使用银行家算法判断安全状态)和死锁检测(周期性检查循环等待)。最后指出大多数操作系统采用"鸵鸟策略",即忽略死锁问题并在发生时重启系统。这些方法从不同角度为解决并发系统中的死锁问题提供了理论框架。
2025-11-24 14:39:36
884
原创 【操作系统】信号量与经典同步问题
摘要:本文介绍了信号量和管程两种同步机制。信号量通过PV操作实现互斥与同步,生产者消费者模型展示了其典型应用。管程(Monitor)作为编程语言级同步原语,通过条件变量和锁机制实现线程协调,解决了信号量编程复杂度高的问题。重点分析了读者-写者问题的两种实现方式:信号量方案实现读者优先,管程方案实现写者优先。文章详细阐述了同步机制的核心思想、实现原理及典型应用场景,为并发编程提供了理论基础和实践指导。
2025-11-23 14:43:14
831
原创 【操作系统】多进程锁与同步实现
本文系统探讨了多线程环境下临界区访问的同步问题。首先介绍了资源共享、并发并行等基本概念,以及进程ID分配机制。重点分析了临界区的特性(互斥、可前进、有限等待)和常见问题(死锁、饥饿)。随后详细讨论了三种同步方法:1)禁用硬件中断法(仅适用于单CPU);2)基于软件的Peterson算法及其改进版本(通过标志变量和轮转机制实现互斥);3)高级抽象方法,利用原子操作(Test-and-Set、Exchange)实现锁机制。文章通过面包店买面包等生活化案例,生动展示了竞争条件和解决方案,并采用反证法验证Peter
2025-11-16 19:50:11
602
原创 【操作系统】进程及其进程调度
本文摘要: 进程是操作系统资源分配的基本单位,由代码段、数据段和进程控制块(PCB)组成。PCB是进程存在的唯一标识,记录进程状态、资源分配等信息。进程管理包括创建、运行、等待、唤醒和终止等状态转换。线程作为轻量级进程,共享进程资源但拥有独立寄存器和栈,提高了并发性能。线程实现分为用户线程和内核线程,前者由用户空间管理,后者由操作系统调度。进程/线程切换涉及上下文保存与恢复,进程创建通常采用fork()机制复制父进程资源。操作系统通过PCB和TCB结构实现高效的进程与线程管理机制。
2025-11-14 11:34:53
984
原创 【Redis】Redis分布式缓存 - 分片集群
文章摘要: Redis分片集群通过散列插槽(0-16383)实现数据分片,key的有效部分通过CRC16算法计算插槽值。集群支持动态伸缩,可添加新节点并重新分配插槽。当master节点故障时,集群会自动进行故障转移,提升slave为master,也可手动执行cluster failover命令切换。RedisTemplate通过lettuce支持分片集群访问,配置方式与哨兵模式类似。这种方式实现了数据的高效分片和故障自动恢复,确保集群的高可用性。
2025-11-09 20:46:53
361
原创 【操作系统】虚拟内存以及页面置换算法
本文介绍了虚拟内存技术及其相关概念。首先分析了虚拟内存的需求背景:程序规模增长快于存储容量增长。然后讲解了两种关键技术:覆盖技术(共享内存区域)和交换技术(进程地址空间换入换出)。重点讨论了虚拟内存技术,包括程序局部性原理、虚拟页式管理及缺页处理机制。最后详细阐述了多种页面置换算法:最优置换、FIFO(存在Belady现象)、LRU(基于访问时间)、时钟算法(利用访问位)和LFU(基于访问频率)。这些技术共同解决了内存不足问题,提高了系统性能。
2025-11-09 20:28:12
604
原创 【操作系统】内存分配
非连续内存分配解决了连续分配的内存碎片问题,提高了内存利用率。主要方法有分段和分页:分段将程序划分为不同功能段,每段有独立地址空间;分页将内存划分为固定大小的页/帧,通过页表建立映射。为提高性能,采用TLB缓存常用地址,多级页表减少空间占用,反向页表通过哈希优化大地址空间。这些方法在提升效率的同时也增加了地址转换开销,需在时间和空间上做权衡。
2025-11-09 16:25:50
531
原创 【操作系统】第三章 计算机体系结构及内存分层体系
本文介绍了计算机体系结构和内存管理相关概念。主要内容包括:1)计算机体系结构的基本组成;2)逻辑地址到物理地址的转换过程,由MMU和操作系统协作完成;3)连续内存分配中的碎片问题及解决方案,包括首次适配、最佳适配和最差适配算法;4)碎片整理的两种方法:压缩式(移动程序位置合并空闲块)和交换式(将等待程序数据转移到磁盘)。文章重点阐述了内存分配的关键技术和面临的挑战,为理解操作系统内存管理奠定基础。
2025-11-08 19:51:44
305
原创 【操作系统】第一章 概述
摘要:操作系统内核(Kernel)是管理硬件资源的核心组件,负责CPU调度、内存管理、文件系统等功能。其具有并发、共享、虚拟和异步四大特征。从功能看,操作系统既是控制软件也是资源管理器,采用分层结构位于硬件与应用之间。主要架构包括单体(如DOS)、微内核(通过消息传递)和外核等。典型实例有Unix、Linux和Windows。学习操作系统对理解计算机系统本质及满足工控等领域需求具有重要意义。(150字)
2025-11-08 11:16:30
272
原创 【Java并发】线程池
摘要:ThreadPoolExecutor配置包含7个关键参数,需根据任务类型优化配置。CPU密集型任务建议核心线程数≤CPU核数×1.5,I/O密集型任务可参考Nginx公式(核数×2+1)。最大线程数应考虑内存限制和外部依赖。队列选择需权衡延迟与吞吐量,拒绝策略应根据业务重要性选择。典型配置如电商秒杀(200最大线程+1000队列+CallerRunsPolicy)。监控推荐Micrometer+Prometheus方案,通过压测确定最优参数组合。(150字)
2025-11-04 12:40:29
810
原创 【Java并发】synchronized和ReentrantLock的区别
Java中的synchronized是JVM内置的关键字,实现简单但功能有限;而ReentrantLock作为API层面的锁,提供了更丰富的特性,包括公平锁、可中断等待、超时机制和条件变量等。虽然synchronized会自动管理锁,但ReentrantLock在灵活性、性能和可调试性方面更具优势,特别适合高并发场景。在实际项目中,为避免死锁风险,推荐优先考虑ReentrantLock的超时机制而非synchronized。
2025-11-02 10:47:21
167
1
原创 【实践】快速启动Hadoop&HBase服务
大数据集群服务启动脚本 该脚本用于启动大数据生态系统中多个组件的服务,包括: 基础服务:Zookeeper、HDFS(NameNode/DataNode) 计算框架:YARN(ResourceManager/NodeManager)、Spark历史服务 数据仓库:Hive Metastore/HiveServer2 其他组件:HBase(Master/RegionServer)、Oozie、Hue 脚本采用分层启动方式,先启动基础服务,再启动上层应用服务,确保组件间的依赖关系得到满足。每个服务都有对应的启动
2025-10-18 10:35:15
151
原创 【爬虫】浏览器插件
摘要:本文介绍了如何开发一个Chrome扩展插件来爬取中国大学MOOC课程数据。主要步骤包括:1)使用React+Vite的扩展模板初始化项目;2)分析目标网页结构并编写数据提取代码;3)在Popup页面添加数据获取按钮;4)实现CSV导出功能;5)加入自动翻页逻辑,通过检测分页按钮的js-disabled类判断最后一页。该方案采用结构定位而非类名选择器,提高代码健壮性,能自动遍历所有分页并整合数据导出为CSV文件。
2025-10-17 19:12:23
715
原创 【数据迁移】HBase Bulkload批量加载原理
HBase数据导入有两种方式:put和BulkLoad。put方式通过WAL写入MemStore,再flush为HFile,但涉及flush、split等操作,性能消耗大,不适合海量数据。BulkLoad则利用MapReduce直接生成HFile文件,再移动到对应Region目录,避免了中间过程,性能更优。BulkLoad通过跳过WAL和MemStore阶段,显著提升了大数据量的导入效率。
2025-10-16 09:00:14
741
原创 【爬虫】go框架-Colly
Colly是Go语言的高效网页抓取框架,通过Collector对象管理网络请求和回调处理。使用前需初始化Collector并配置参数如域名限制、UserAgent等。核心功能包括6个按顺序触发的回调方法,其中OnHTML用于解析HTML元素,支持CSS选择器语法提取标签属性内容。示例代码演示了如何抓取MOOC网站学校信息,通过分析HTML结构获取大学名称、图片URL等数据。开发者需结合网页源代码定位目标标签,使用ChildAttr等方法提取具体属性值。
2025-10-13 14:32:30
437
原创 【大数据】用户画像
本文介绍了电商平台用户画像系统的设计与开发,重点阐述了如何通过数据标签化构建精准用户画像。系统整合订单数据、访问日志和会员信息等多源数据,采用HBase存储个体用户标签,ElasticSearch/Solr支持群体查询。标签体系分为五级,涵盖规则匹配、统计和挖掘三类标签,通过Spark实现批流处理。该系统可提升营销精准度和商品推荐效率,为数字化运营提供数据支持。架构包含数据采集、存储、分析和应用四层,通过元数据管理和定期调度实现标签动态更新。
2025-10-12 20:48:46
842
原创 【实践】Rocky Linux安装MySQL
本文介绍了在Linux系统上安装和配置MySQL 8.0的完整步骤。首先更新系统,然后添加MySQL Yum仓库并安装MySQL服务器。接着启动MySQL服务并设置开机自启。重点说明了如何通过安全安装脚本配置强密码(需包含大小写字母、数字和特殊符号且长度大于8位),并进行安全设置(移除匿名用户、禁止root远程登录等)。最后还提供了修改root用户权限以允许远程连接的数据库配置命令。整个过程涵盖了从安装到安全配置的关键步骤。
2025-10-05 11:03:06
194
原创 【Spring】Spring5源码与底层原理
Bean的加载过程离不来两个接口:一个是BeanFactory;一个是继承自BeanFactory的ApplicationContextBeanFactory 作为 Spring 框架最基础的容器接口,BeanFactory 负责实例化、配置和管理 Bean,定义了基本的依赖注入规则和 Bean 生命周期管理。
2025-10-04 17:31:02
940
1
原创 【设计模式】模板方法
摘要:模板方法模式通过父类定义算法骨架(模板方法),子类实现具体细节。抽象类包含抽象方法(子类实现)和模板方法(通常为final防止覆盖),并可提供默认实现或钩子方法。具体子类继承抽象类,实现抽象方法,并可选择性覆盖钩子方法扩展行为。该模式确保算法结构稳定,同时允许子类灵活定制步骤。
2025-10-04 17:23:37
145
原创 【K8S】存储
Kubernetes存储配置摘要 Kubernetes提供多种存储解决方案,包括ConfigMap(明文配置)、Secret(敏感数据)和Volume/PersistentVolume(数据存储)。ConfigMap支持从文件或命令行创建,可通过环境变量或文件挂载方式注入Pod实现配置管理,支持热更新但可能增加API服务器负载。Secret用于保存敏感信息,必须经过base64编码,内置类型如Opaque(用户自定义)等。PersistentVolume解决跨部门持久化存储问题。ConfigMap和Secr
2025-10-03 10:08:09
439
原创 【Java基础】实现BlockingQueue
摘要:本文介绍了Java中的阻塞队列(BlockingQueue)及其实现类,包括ArrayBlockingQueue、LinkedBlockingQueue等。重点分析了悲观锁(如synchronized和ReentrantLock)和乐观锁(CAS)的实现原理。详细解读了ArrayBlockingQueue的内部结构,包括其底层数组、指针位置和锁机制,并通过源码展示了阻塞入队(put)和出队(take)的具体实现过程,涉及条件变量(notFull/notEmpty)的使用和线程间通信机制。
2025-09-26 14:28:12
292
原创 【实践】K8S+Docker集群搭建
本文摘要:介绍了Kubernetes集群的搭建过程,包含三台机器(1个Master和2个Worker节点)的IP配置,系统更新及Docker安装步骤。详细说明了Kubernetes的架构组件(Master的API Server、etcd等,Node的kubelet等)和Pod概念(共享网络和存储)。提供了Rocky Linux环境初始化配置,包括防火墙设置、SELinux禁用、时区调整等。最后通过Docker模拟Pod运行Nginx服务,展示了基础容器化操作。
2025-09-25 09:42:54
1114
4
原创 【算法】leetcode第466场周赛
本文解析了四道算法题的解题思路与代码实现: 数组元素相等的最小操作次数:只需判断数组是否全相同,不同则操作1次。时间复杂度O(n)。 转换字符串为全'a'的最小操作次数:找到最小非'a'字符,计算其到'a'的转换次数。时间复杂度O(n)。 碗子数组数目统计:两种解法: 单调栈法:维护递减栈,弹出时计数碗结构 双指针法:类似接雨水思路,统计满足条件的子数组 时间复杂度均为O(n) 二进制回文数计数:通过分析二进制长度规律,分情况计算小于和等于目标数的回文数数量。关键点在于处理奇偶长度和边界值比较。 各题解法均
2025-09-10 12:53:49
697
原创 【JAVA】Log4j2+Slf4j详解
Log4j2是Java开发中常用的日志框架,提供8种日志级别(从OFF到ALL),随环境不同推荐使用不同级别:开发/测试环境建议DEBUG/INFO,生产环境建议WARN/ERROR。配置方式支持properties和XML格式,XML配置更灵活,可同时输出到控制台和文件。使用时通过LogManager获取Logger实例,调用不同级别方法记录日志。若遇到日志显示问题,可通过检查有效日志级别或添加-Dlog4j.debug参数排查配置加载情况。配置文件名需为log4j2.properties或log4j2.
2025-09-07 21:30:54
979
原创 【算法】求最长回文子串
本文介绍了力扣第五题"最长回文子串"的两种解法。第一种是中心搜索法,通过从字符串中心向两边扩展寻找回文子串,需要考虑奇偶长度情况。第二种是动态规划法,利用回文子串的特性建立状态转移方程,通过子串长度和起始位置双重循环求解。两种方法的时间复杂度均为O(n²),其中动态规划法需要额外O(n²)空间。文章提供了详细的解题思路和完整的Java代码实现,强调了边界条件处理和实际例子的重要性。
2025-09-04 14:56:24
532
原创 【算法】求第K大的值
LeetCode 215题要求找出数组中第K大的元素。摘要要点: 快速排序法:先排序(O(NlogN))再直接取第K大元素; 快速选择法:基于快排的改进,通过比较基准值与第K大位置来减少递归范围,平均时间复杂度O(N); 堆排序法:利用大顶堆特性,每次弹出堆顶元素,K次后即为所求,时间复杂度O(NlogK); 堆结构实现:Java的PriorityQueue底层使用数组存储完全二叉树,通过siftUp(上浮)和siftDown(下沉)维护堆性质; 堆排序步骤:先构建最大堆,然后反复交换堆顶与末尾元素并维护堆
2025-09-03 12:51:34
383
原创 【算法】leetcode热门100题-刷题经验分享
本文总结了LeetCode高频算法题目的解题思路。Hash部分包括两数之和(使用HashMap优化)、字母异位词分组(排序或计数法)、最长连续序列(Set剪枝);双指针部分涵盖移动零(双指针维护非零元素)、盛水容器(短边优先移动)、三数之和(排序后退化为两数之和)、接雨水问题;滑动窗口部分介绍无重复子串(HashSet维护窗口)和字母异位词(固定窗口统计字符频率)。链表部分未展开。全文着重分析各种算法的优化思路,如空间换时间、剪枝策略和问题退化思想。
2025-08-27 17:10:41
771
原创 【算法】接雨水问题
文章摘要:LeetCode 42题"接雨水"的解法分析。暴力解法通过双重循环计算每个位置左右的最大值,时间复杂度O(n²)。优化解法使用动态规划预处理左右最大值数组,将时间降为O(n),但空间复杂度O(n)。最优解法采用双指针,在O(n)时间和O(1)空间内解决问题:通过左右指针移动,比较左右最大值来确定当前位置的储水量。三种解法都基于"每个位置的储水量由左右最高柱子的较小值决定"这一核心思路。
2025-08-22 20:59:01
215
原创 【算法】单源最短路-迪杰斯特拉算法
Dijkstra算法是一种基于贪心策略的单源最短路径算法,适用于有向图。其核心思想是:当前节点的最短路径依赖于前一节点的最短路径。算法通过维护距离数组和优先队列(最小堆)实现,步骤如下:初始化距离数组,将起点加入优先队列;每次取出最小成本节点,更新其邻接节点的距离;重复直到所有节点被处理。文章以LeetCode 3650题为例,展示了如何通过邻接表存储图(包括反向边),使用优先队列优化Dijkstra实现最短路径计算。关键点包括:邻接表结构设计、优先队列排序规则、以及提前终止条件(到达终点时直接返回)。
2025-08-17 23:29:22
1064
原创 【数据库原理与应用】数据库管理系统
本文介绍了数据库管理系统(DBMS)的体系结构和关键技术。主要内容包括:1) DBMS内核组成,包括语法分析器、权限检查、查询处理等核心模块;2) 数据库访问管理技术,涉及文件组织、索引、动态哈希等多种数据访问方法;3) 查询优化策略,重点分析连接操作的优化方法;4) 事务管理机制,详细说明ACID特性、故障恢复策略和三种数据更新方案。文章通过体系结构图和工作流程图,系统阐述了DBMS从SQL解析到数据存储的完整处理流程,以及保证数据一致性的关键技术实现。
2025-08-11 21:10:42
882
原创 【微服务】鉴权-JWT
JWT是一种基于非对称加密的鉴权方式,通过公钥加密、私钥解密实现安全通信。其流程包括密钥分发、加密解密和数字签名验证。在登录实践中,由用户中心校验信息,授权中心生成JWT并返回给客户端。JWT存储推荐使用cookie方案(需防范CSRF攻击)优于web存储(易受XSS攻击),同时应遵循Rest规范并加入随机码增强安全性。
2025-06-08 21:53:42
254
原创 【JAVA】IDEA中模块(Module)的使用
IDEA中的模块(Module)是管理复杂项目的有效方式。项目层级结构为Project→Module→Package→Class/接口,模块可嵌套且具有独立代码结构。项目作为顶级容器需至少包含一个模块,默认生成同名模块。模块间依赖可通过IDEA本地配置(Project Structure→Dependencies添加模块)或pom文件配置(使用坐标引用)实现,支持代码复用与解耦。
2025-06-08 00:43:41
700
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅