自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(107)
  • 收藏
  • 关注

原创 算法:N皇后问题

这里分享一个经典搜索问题,N皇后。

2025-12-22 21:23:41 410

原创 Redis事务全面解析

Redis事务是一组命令的集合,这些命令会被顺序化、串行化地执行,确保在执行过程中不会被其他客户端的命令打断。核心特性命令打包:多个命令打包成一个单元执行顺序保证:执行期间不被其他客户端插队简单易用:相比MySQL事务实现更轻量优势说明适用场景命令打包多个命令作为一个单元执行需要原子性操作的场景防止插队执行期间不被其他客户端打断并发资源竞争简单轻量实现简单,性能开销小不需要完整ACID的场景乐观锁支持通过WATCH实现版本控制数据一致性要求较高的场景。

2025-12-22 17:31:54 1008

原创 MySQL事务深度解析:从ACID到MVCC的实现原理

定义:事务是一组逻辑上相关的DML(数据操作语言)语句组成的操作序列,这些语句构成一个完整的业务逻辑单元。核心特性:事务中的操作要么全部成功,要么全部失败,保证数据的完整性和一致性。隔离级别解决的问题:在并发事务环境下,如何平衡数据一致性与系统性能的矛盾。MySQL作为一个服务器,肯定是会同时被多个客户端访问的,会同时执行多个事务,那么不同的事务之间肯定是会有可能互相影响的,比如多个事务访问同一张表、同一行数据,MySQL的事务为了避免不同的事务之间互相影响,于是将不同的事务隔离开,

2025-12-21 17:33:13 1454

原创 Redis持久化机制详解(二):AOF持久化全解析

AOF(Append Only File)是Redis的实时持久化机制,通过记录所有写操作命令来实现数据持久化。核心特点实时记录:每次写操作都立即记录可读性强:文本格式存储,便于人工阅读数据安全:丢失风险低于RDB工作原理图fill:#333;color:#333;color:#333;fill:none;客户端写命令Redis主线程执行写入AOF缓冲区根据策略刷盘AOF文件重启时重新执行AOF文件中的命令恢复数据。

2025-12-21 16:49:27 581

原创 Redis持久化机制详解(一):RDB全解析

定义:将内存中的数据保存到非易失性存储介质(磁盘),防止进程退出或系统崩溃造成数据丢失。恢复速度快:二进制加载,大数据集恢复迅速文件紧凑:压缩存储,节省磁盘空间适合备份:单个文件方便传输和归档全量复制:主从同步时效率高性能影响小:bgsave期间服务基本不受影响RDB作为Redis的定期快照持久化机制,通过fork子进程+写时复制实现了高效、一致的数据备份。虽然存在数据丢失风险,但其恢复速度快、文件紧凑的特点使其在备份、全量复制等场景中具有不可替代的价值。核心要点回顾使用bgsave避免服务阻塞。

2025-12-20 17:46:18 1374

原创 Redis ZSet类型深度解析:有序集合的原理与实战应用

高效排序:O(logN)的插入、删除和查询复杂度灵活查询:支持按排名、分数范围、元素查询丰富运算:支持交、并集运算,支持权重和聚合方式内存优化:智能选择Ziplist或Skiplist编码排行榜系统:游戏、社交、电商等各种排名场景延迟任务:订单超时、定时提醒、任务调度实时统计:在线用户、文章热度、系统监控优先级队列:任务调度、消息队列地理位置:附近搜索、范围查询时间序列:监控数据、日志记录。

2025-12-20 17:26:38 1032

原创 算法:hot100---128. 最长连续序列

但是我统计长度的时候,是从前往后遍历,我把每一个元素都当成了连续序列的起点进行计算,这也就导致超时了,O(N*N),要设计时间复杂度为O(N)的方法,O(N*logN)就不能考虑了,也就是说,这道题排序是用不了了。但是问题在于,我们不能够遍历所有的子序列,如果遍历所有的子序列,妥妥的O(N*N),这么一看,还是要两重遍历啊,但是,两重遍历,时间复杂度不一定是O(N*N)啊,于是,转换思路,使用位图,因为位图中的元素是连续存储的,天然帮我排好序了,但是,我忽略了一个问题,我在统计的过程中需要遍历整个位图。

2025-12-19 12:44:18 265

原创 Redis Set类型完全指南:无序集合的原理与应用

✅用户标签系统:基于兴趣的推荐和分组✅社交关系:共同好友、好友推荐✅统计分析:UV统计、独立计数✅内容筛选:多条件过滤、去重✅随机选择:抽奖、随机推荐✅访问控制:黑白名单管理。

2025-12-15 17:20:34 943

原创 Redis List类型完全指南:从原理到实战应用

Redis的List(列表)类型是一个功能强大的数据结构,它类似于双端队列(deque),支持两端的高效插入和删除操作。本篇博客将深入探讨Redis List的底层实现、丰富命令集以及多种实际应用场景,帮助你全面掌握这一重要数据结构。Redis List具备以下关键特性:Redis List有序存储双向操作元素可重复下标访问维护插入顺序左端操作 lpush/lpop右端操作 rpush/rpop正数下标: 0, 1, 2...负数下标: -1, -2, -3...1.2 性能特点两端插入/删除:O(1

2025-12-15 17:00:19 1186

原创 Redis Hash类型深度解析:结构、原理与实战应用

Redis Hash是一个键值对集合,用于存储字段-值(field-value)映射。为了避免与Redis本身的key-value结构混淆,我们将Hash内部的键值对称为对。fill:#333;color:#333;color:#333;fill:none;Redis KeyHash类型Value...Redis Hash类型是一个功能强大、灵活的数据结构,特别适合存储对象类型的数据。

2025-12-11 17:15:52 689

原创 Redis 字符串类型完全指南:从原理到实战应用

Redis字符串类型是最基础的数据结构,支持二进制安全存储,最大容量512MB。文章详细介绍了GET/SET等核心命令、批量操作及数字操作特性,并分享了键名设计规范。在应用场景方面,Redis字符串可用于缓存、计数器、共享Session和验证码系统。最后给出性能优化建议,包括批量操作、内存管理和网络优化。掌握这些知识能充分发挥Redis的高性能优势,构建更可靠的系统。

2025-12-11 17:01:27 610

原创 Redis 渐进式 Rehash 深度剖析:如何实现平滑扩容与数据一致性

Redis采用渐进式Rehash机制解决哈希表扩容时的性能问题。当负载因子超过阈值时,Redis会创建新哈希表ht[1],但不一次性迁移数据,而是将rehash过程分摊到每次操作中:查询访问两个表,插入只写入新表,并逐步迁移一个桶的数据。这种设计避免了全局rehash导致的性能抖动,保证了Redis的毫秒级响应。通过双表机制和精确的负载因子控制(正常扩容≥1,强制扩容>5,缩容<0.1),Redis在内存使用和性能之间取得了平衡。

2025-12-10 12:42:00 845

原创 从单机到微服务:分布式架构演进全景解析

单机时代 (1990-2000)├── 特点:All in One├── 技术:LAMP栈└── 局限:单点故障,扩展困难Web 2.0时代 (2000-2010)├── 演进:前后端分离├── 技术:负载均衡,读写分离└── 突破:水平扩展成为可能云计算时代 (2010-2015)├── 演进:服务化架构├── 技术:SOA,分布式缓存└── 突破:弹性伸缩能力微服务时代 (2015-2020)├── 演进:功能解耦├── 技术:容器化,服务网格。

2025-12-04 10:12:42 719

原创 MySQL 索引:核心原理、数据结构与优化实践

MySQL索引是提升查询性能的核心工具,本文系统讲解了其原理与实践。索引本质是B+树数据结构,具有矮胖、有序等特点,支持高效查询。MySQL支持主键、唯一、普通等索引类型,InnoDB采用聚簇索引存储数据。复合索引需遵循最左匹配原则,合理使用可避免回表查询。索引创建应考虑查询频率、区分度等因素,避免滥用导致性能下降。通过EXPLAIN分析查询计划,结合实际业务场景优化索引,才能实现数据库高效稳定运行。

2025-12-03 20:17:32 1176

原创 C++多线程调试历险记:一个由构造顺序引发的“幽灵bug“

方案1:调整成员声明顺序(推荐)private:// 被依赖的成员在前// 线程在最后声明!

2025-11-28 17:34:13 680

原创 日志接口的便捷与性能之争:流式与格式化的深度对比

在C++日志系统设计中,接口选择始终是架构师需要面对的重要抉择。流式接口的优雅便捷与格式化接口的极致性能,如同鱼与熊掌,如何取舍?本文将通过详细的技术分析和实测数据,为你揭示两者的本质差异。

2025-11-23 16:47:57 1090

原创 C++11智能指针完全指南:告别内存泄漏

在现代C++开发中,原始指针的直接使用已被视为不良实践。C++11引入的智能指针通过自动化内存管理,彻底改变了我们处理动态内存的方式。本文将带你全面掌握智能指针的使用精髓。使用原始指针进行动态内存管理,开发者必须手动配对使用。:两个Node对象的引用计数始终为1,无法被自动释放。,让智能指针帮你自动管理内存生命周期。实现共享所有权,当最后一个。被销毁时才会释放对象。reset(),计数=2。析构,计数=0,释放内存。,用于解决循环引用问题。让你的代码中几乎看不到。,同一时刻只能有一个。

2025-11-21 14:37:10 852

原创 软件测试完全指南:从概念到实战的完整体系

建议读者在理解理论的基础上,多参与实际项目测试,积累实战经验。:使用人工或自动化手段来运行或测定某个软件系统的过程,目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。本文系统讲解软件测试的核心概念、测试用例设计方法和缺陷管理流程,助你构建完整的测试知识体系。的过程,目的是在软件发布前尽可能多地发现其中存在的问题(Bug),确保软件质量。:为特定测试目标而设计的一组测试输入、执行条件和预期结果。:软件产品中存在的各种问题,不符合需求或影响正常使用。- 每个用例有明确的测试点。

2025-11-21 14:23:48 847

原创 MySQL全面入门:从基础操作到数据管理实战

MySQL作为世界上最流行的开源关系型数据库,是每一位开发者必备的技能。本文将从零开始,系统地介绍MySQL的核心操作,内容涵盖。字符集支持更广泛的Unicode字符,包括emoji表情,是现代应用的推荐选择。无论你是数据库新手还是需要一份速查手册,本文都将为你提供清晰的指引。数据库是存储数据的容器,我们的所有操作都在其内部进行。表是数据库中实际存储数据的结构,由行和列组成。这是与数据本身交互的核心部分,即我们常说的。从表中检索数据,这是最复杂也最常用的操作。确保某列或某组列的值是唯一的。

2025-11-21 14:11:14 403

原创 Python:基础语法细节(一)

Python 语法简洁直观,具有动态类型、自动内存管理等特点,与 C++/Java 等静态语言在类型系统、运算符等方面存在显著差异。掌握这些基础特性是深入学习 Python 的重要前提。

2025-11-20 13:16:36 348

原创 Python:简单了解python

简单函数print("你好!")# 调用函数greet()# 带参数的函数print(f"你好,# 简单函数 def greet() : print("你好!") # 调用函数 greet() # 带参数的函数 def greet_person(name) : print(f"你好, {name }!") greet_person("小明") # 带返回值的函数 def add_numbers(a , b) : return a + b!")greet_person("小明")

2025-11-20 13:10:04 969

原创 解决异常:terminate called without an active exception Aborted

Aborted。

2025-11-19 21:33:19 170

原创 Linux文件:文件描述符和文件缓冲区 --- 源码解析,我行你也行

文件中的内核缓冲区有一个作用就是,一次往缓冲区多写入或者多读取一些内容,再刷新,是为了减少I/O次数,提高性能。而且我们知道,write/read这些系统调用,也是有成本的,如果每次使用printf/fputs等函数,都会调用一次系统调用,就要经历从用户态陷入内核态,再从内核态切换回用户态的过程,这个过程是比较耗费时间的。直接将用户要写入/读取的内容写到/读出文件的内核缓冲区,成本是比较高的,为了减少系统调用的次数,在语言层面就设置一个缓冲区(这个缓冲区就是开辟了一块内存,先存在这个内存中)

2025-11-16 12:03:37 1012

原创 算法:位运算类型题目练习与总结

这有啥用啊?不是很显然吗?我们就可以。

2025-11-16 11:10:02 877

原创 一次代价昂贵的调试教训:我是如何花6小时追踪一个本应3分钟发现的Bug

从Protobuf序列化层级不匹配的惨痛经历,反思技术问题排查的系统性方法。昨晚11点,我正沉浸在消息队列项目的持久化模块开发中。一切都看起来很美好——架构设计清晰,代码逻辑合理,测试用例覆盖全面。但当我实现消息的垃圾回收和恢复功能时,一个看似简单的问题让我陷入了长达6小时的调试深渊。

2025-11-15 00:51:43 524

原创 算法:前缀和类型题目的练习与总结

这周做了不少前缀和的题目,总感觉前缀和的题目和dp题目非常相似,似乎大部分用dp也能做,不过,没关系,我们就当练习前缀和好了。这篇博客中将分享一些前缀和的经典题目,并总结出前缀和的模版套路。如果有所收获,请不要吝啬手中的三连哦!!!

2025-11-12 12:11:14 976

原创 算法:二分算法类型题目总结---(含二分模版)

34. 在排序数组中查找元素的第一个和最后一个位置。

2025-11-07 13:36:25 1286

原创 Linux文件:文件基础

众所周知,操作系统的四大核心功能是进程管理、文件管理、内存管理、设备管理。在前面的博客中,已经分享了进程管理的相关知识,接下来,分享一下Linux的文件管理的相关知识。我认为Linux文件管理需要了解文件描述符、缓冲区、重定向、磁盘文件系统、虚拟文件系统等等知识,当然,看看这篇博客的标题,这篇博客当然不会讲那么多,想要学习这些深入的知识,我们得提前了解一些文件的基础知识,那么,接下来就一起来了解一下文件系统的前置知识吧。

2025-11-07 11:43:10 677

原创 解决报错:/usr/bin/ld: /tmp/cc52JU0u.o: undefined reference to symbol ‘adler32‘ /usr/bin/ld: /lib/x86_64-

代码中使用到了muduo库,protobuf,pthread库。

2025-11-06 15:50:55 267

原创 Linux进程:进程控制(一个进程从出生到离开的全过程,一篇文章讲清楚)

在前面的几篇博客中,我们聊了进程属性、状态、进程地址空间、优先级、调度切换等内容,已经为这篇博客的阅读打下了基础,在这篇文章,我们来一起学习一下怎么控制进程。一个进程究竟怎么创建?一个进程怎么退出?……fork系统调用,用来创建一个进程,返回值比较特殊,有两个返回值,对于父进程来说,返回值是子进程的pid,对于子进程来说,返回值为0,当然,创建失败,返回值就是-1。fork有两个返回值?我的天呐,怎么做到的?fork创建了多个进程之后,一般而言,父子进程的代码是共享的,数据是私有的、各自一份的(全局

2025-11-06 10:08:42 1336

原创 算法:38.外观数列----一道模拟题的经典易错点

这道题题目并不难,但是这道题目真的给我上了一课,希望这篇博客,能够给看到的读者小小的提一个醒,大家不要范这种错误哦!!!

2025-11-06 09:21:53 897

原创 Linux进程:进程调度O(1)算法---走进操作系统内核,不在停留课本

优先级的本质:确定某种资源分配的先后顺序,目标资源比较少,需要竞争资源,于是就有了优先级,进程的优先级竞争的是CPU的资源。

2025-11-05 10:53:01 1174

原创 算法:滑动窗口题目分享(二)

上次分享的滑动窗口题目比较简单,今天分享几道更难一些的题目,依旧是巩固一下之前的套路,不过目前发现之前的套路,在面对一些复杂题目时,不太行,复杂题目的要求限制更大一些,需要根据实际情况调整之前的套路。

2025-11-05 09:56:03 643

原创 Linux进程:进程状态

我们每个人都应该见过下面这幅图,或者类似的图,这时基本上所有的操作系统教材中都会出现的进程状态切换图。:每一个CPU对应一个,当进程处在运行队列当中,则这个进程处于运行状态:每一种设备的结构体中都有一个,当进程需要I/O请求的时候,就从cpu的运行队列上剥离,加入某种设备的等待队列当中,就处于阻塞状态。(用时间换空间):当内存资源严重紧张的时候,操作系统会将某些处于阻塞状态的进程的代码和数据从内存中调出,放到磁盘上的,来缓解内存资源严重不足的状况,当资源充足的时候,重新调回内存。

2025-10-29 23:33:48 762

原创 算法:滑动窗口类型题目的总结

一旦我们发现一道题目可以用滑动窗口的思路结局,那么这道题就可以按照下面的步骤写,首先,定义好left,right,并且定义好其他的用于记录的变量,接着,right < nums.size() 进行循环再然后,进窗口再然后写一个while循环来判断是否需要出窗口在while循环里面写上出窗口的逻辑,一般都是某某–,left++出了while循环,无论是否需要出窗口,right都要++每次循环都要更新窗口大小最后返回合适的窗口大小即可。

2025-10-29 20:47:22 755

原创 Linux进程:进程属性

本文介绍了Linux进程的10个主要属性,包括PID(进程标识符)、PPID(父进程标识符)、PGID(进程组标识符)、SID(会话ID)、TTY(终端号)、STAT(进程状态)、UID(用户ID)、TIME(运行时间)和COMMAND(启动命令)。其中PID是进程唯一标识符,可通过getpid获取;PPID是父进程ID,可通过getppid获取;PGID是进程组ID,等于组长进程PID;SID标识所属会话;TTY显示运行终端;STAT表示进程状态;UID记录启动用户;TIME显示运行时长;COMMAND显

2025-10-28 22:38:17 1132

原创 Linux进程:进程地址空间(一)

今天我们来学习一下进程地址空间的知识,好久没有分享干货了,今天是时候回归了,加油!!!进程地址空间是一个比较复杂的东西,一篇文章我自认为是讲不清楚的,所以,我想把进程地址空间分成四个部分来讲。今天我们来浅浅认识一下进程地址空间,在后面我们会重新对进程地址空间加深控制。

2025-10-27 23:52:32 890

原创 算法:11.盛水最多的容器

最朴素的思路肯定是把所有的容器的容量全部都算出来,然后选择最大的容量返回,显然这么做时间复杂度太高了,时间复杂度为O(N^2)一般来说这种遍历的题目要降低时间复杂度,比较有效的方法就是双指针,这道题目也是一样,利用两个指针,一个left,一个right,分别指向两侧的两个木板,我们计算出初始容量 (right - left)* height,所以我们在计算高度的时候要小心。OK,我们来想一下left和right两个指针应该怎么移动?

2025-10-27 13:07:32 333

原创 算法:283. 移动零

遇到非0的时候,首先将非0的元素与left下标元素交换位置,接着left++,这时right的位置就变成0了,所以right也++,这样子当我们的right == nums.size() - 1的时候,left和right区间内的所有元素就全都是0了,对于小白来说,第一反应肯定是先遍历一遍数组,遇到0了,在和下一个数字交换。很容易想到,如果只记录当前下标,无法把前面的0一起管理好,我们用两个指针,一个left,一个right,诶,显然不对了,要对这个方法进行改进。当遇到0的时候,right++,

2025-10-26 22:22:59 10391

原创 操作系统“权限”是什么?——一篇文章带你深刻理解Linux下权限

记住一句话。

2025-02-21 19:49:36 13326 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除