- 博客(60)
- 收藏
- 关注
原创 Redis主从架构、哨兵模式及集群比较
Redis提供三种分布式解决方案:主从架构实现基础数据备份和读负载均衡,适合小规模读多写少场景;哨兵模式在主从基础上增加自动故障切换功能,保障高可用性;Redis集群通过数据分片和原生高可用机制,支持大规模数据存储和扩展。三者核心差异在于数据分布方式、故障恢复机制和扩展能力,分别针对不同规模业务需求。主从架构部署简单但需手动恢复,哨兵模式自动容灾但存储受限,集群方案支持水平扩展但部署复杂。根据数据规模、读写负载和可用性要求选择合适的架构方案。
2025-08-18 14:27:23
654
原创 Redis 哨兵模式与主从架构对比
Redis哨兵模式与主从架构的核心差异在于高可用机制:主从架构仅包含主库和从库,需人工干预主库故障恢复;哨兵模式新增哨兵节点,可自动检测故障并完成主从切换,实现秒级恢复。两者均采用主从复制机制,存在数据延迟问题,且无法扩展写性能。哨兵模式适合对可用性要求高的场景,但复杂度高于主从架构,且仍受限于单机内存。若需突破单机限制,应使用Redis集群方案。
2025-08-18 14:22:28
860
原创 Redis核心应用场景及代码案例
本文介绍了Redis在16个典型应用场景中的实现方式,通过代码示例展示了具体用法。主要内容包括:高频数据缓存、分布式会话存储、计数器、限流器、分布式锁等基础功能实现;消息队列、排行榜、热点数据存储等常见业务场景应用;以及布隆过滤器、BitMap、HyperLogLog等高级数据结构的实际应用。每个示例都提供了完整的Go语言实现代码,涵盖了Redis的字符串、哈希、列表、集合、有序集合等主要数据结构。这些案例展示了Redis在分布式系统中的核心作用,包括数据缓存、状态共享、并发控制等方面,为开发者提供了可直接
2025-08-15 21:41:23
855
原创 Redis核心架构
Redis核心架构与数据存储原理分析 Redis采用模块化设计,核心包括网络层、命令解析、内存管理、持久化和高可用等模块。网络层基于高性能事件驱动库ae,支持多种I/O多路复用技术。数据存储以redisDb为核心,通过字典结构dict实现键值对存储,支持16个数据库。每个键值对以dictEntry形式存储,值通过redisObject封装,支持多种数据类型和编码方式。系统采用渐进式rehash机制,并包含完善的LRU/LFU内存管理策略。整体架构实现了高性能、低延迟的数据访问,同时通过多种持久化方案保证数据
2025-08-15 21:27:10
2025
2
原创 更友好的并发库conc介绍
本文介绍了Go语言中的并发工具包conc,它由sourcegraph开源,旨在解决并发编程中的常见问题。文章详细解析了conc的核心组件:WaitGroup(支持作用域并发和panic传递)、Pool(高效goroutine池)、Stream(有序结果流)、iter(迭代器)和panics(panic处理)。通过代码示例展示了这些组件的使用方法,如并发控制、错误处理、结果收集等。文章强调了结构化并发的重要性,并指出conc适合初学者学习并发编程,同时也能满足复杂场景的需求。该工具包简化了Go并发编程,降低了
2025-08-13 22:54:05
703
原创 MySQL基础面试
MySQL数据库深度解析与优化实践 本文全面剖析了MySQL数据库的核心知识体系与优化策略,主要内容包括: 数据库基础 逻辑架构:三层结构(连接层、服务层、引擎层)及其功能 三大范式:数据规范化的基本原则 版本选择:社区版与企业版的特性对比 存储引擎 InnoDB与MyISAM的核心差异 B+树索引原理及其优势 InnoDB四大特性:事务、行锁、外键、MVCC 索引优化 创建原则与失效场景分析 聚簇/非聚簇索引区别 覆盖索引与索引下推技术 最左前缀原则的实际应用 事务管理 ACID特性详解 隔离级别与并发问
2025-08-12 14:42:36
1217
原创 MySQL基础笔试
本文整理了MySQL数据库的基本操作命令,包括服务管理、用户权限、数据库操作、表操作、数据增删改查、索引管理等内容。主要涵盖:1)MySQL服务启停与端口检查;2)用户密码设置与修改;3)数据库创建与字符集设置;4)表的创建、修改与数据操作;5)索引的创建、查看与删除;6)数据备份与恢复;7)权限管理与用户删除;8)密码丢失找回方法等。这些命令涵盖了MySQL数据库日常管理中的常见操作,可作为数据库管理员的实用参考手册。
2025-08-12 13:06:16
892
原创 golang 基础案例_02
本文介绍了Go语言中并发编程与错误处理的关键技术。主要内容包括:1)并发控制机制,如互斥锁、读写锁、WaitGroup和atomic包,通过代码示例展示了不同锁的性能差异;2)错误处理方式,包括error接口的使用和自定义错误类型;3)特殊函数init的执行机制及其初始化顺序;4)单元测试和基准测试的编写规范;5)指针和context包的使用场景;6)闭包的概念及其应用场景;7)网络编程基础,包括TCP/UDP通信和RPC的基本原理。文章通过具体代码示例详细说明了各种并发原语的使用方法、性能比较和最佳实践,
2025-08-11 23:37:21
596
原创 golang 基础案例_01
本文总结了Go语言中的关键知识点:1) new和make的内存分配机制及适用场景;2) 数组与切片的区别,包括动态性、内存分配和传递方式;3) defer的执行顺序和返回值修改时机;4) 基本数据类型uint和rune的特性;5) goroutine协程管理和context使用;6) 反射机制(TypeOf/ValueOf)及其应用场景;7) select多路复用的工作流程;8) 类型断言的使用方法。文章通过代码示例详细说明了这些核心概念的实际应用,帮助开发者理解Go语言的底层实现机制。
2025-08-11 23:05:12
1318
原创 MySQL 索引
MySQL索引是提高数据库查询性能的关键数据结构,通过存储数据指针快速定位记录。索引分为单列和组合索引,支持升序/降序排序。创建方式包括CREATE INDEX、ALTER TABLE和建表时直接指定。虽然索引能大幅提升查询速度,但会占用额外存储空间并影响写入性能,需合理规划。唯一索引确保列值不重复,主键索引则强制非空且唯一。可通过SHOW INDEX查看索引信息,使用DROP INDEX或ALTER TABLE删除索引。索引的合理使用能显著优化数据库性能,但过多或不恰当的索引反而会降低效率。
2025-08-10 09:45:45
260
原创 SQL 注入分析
SQL注入是通过恶意输入篡改SQL查询的安全威胁,常见于未经验证的用户输入。攻击者可构造特殊输入绕过验证,如输入'OR'1'='1'使查询恒真。防范措施包括:使用参数化查询分离输入与语句、对输入进行验证和转义、遵循最小权限原则、采用ORM框架抽象查询,以及禁用详细错误信息。开发者必须始终将用户输入视为不安全并严格处理,以保护数据库安全。
2025-08-10 09:39:52
320
原创 MySQL 正则表达式
MySQL支持正则表达式匹配,通过REGEXP和RLIKE操作符实现,功能与PHP/Perl类似。主要正则模式包括:^匹配字符串开头,$匹配结尾,.匹配任意字符,[]匹配字符集,*和+分别表示零次/多次和一次/多次匹配等。基本语法为SELECT...WHERE column REGEXP 'pattern',可进行开头/结尾匹配、包含检测、大小写区分(BINARY)等操作。RLIKE与REGEXP功能相同,可互换使用。示例包括匹配特定开头/结尾字符串、数字组合等,适用于复杂查询场景。
2025-08-10 09:37:47
919
原创 MySQL分页查询的工作原理
MySQL分页查询优化与实现原理 本文深入探讨了MySQL中分页查询的实现原理及优化策略。主要内容包括:1) MySQL执行流程和索引结构分析;2) ORDER BY工作原理,包括索引扫描排序和文件排序(全字段排序与rowid排序);3) LIMIT工作机制及性能问题;4) 常见问题分析:排序字段非唯一导致的乱序问题和深度分页问题。文章通过具体SQL示例说明如何利用索引优化排序,并提供了解决深度分页问题的子查询方案。最后指出生产环境应避免使用SELECT *,合理设计分页策略以提升查询性能。
2025-08-10 09:34:10
651
原创 group by详解
本文详细解析了SQL中group by的分组原理及优化方法。首先通过员工表统计城市员工数的例子,说明group by的基本使用方式。接着深入分析其执行流程,包括创建临时表、分组统计和排序等步骤。文章重点比较了where和having的区别,指出where用于行筛选而having用于分组后筛选。针对group by可能导致的性能问题,提出了四种优化方案:为分组字段加索引、使用order by null取消排序、调整内存临时表大小参数、使用SQL_BIG_RESULT提示处理大数据量。最后强调在实际应用中,需要
2025-08-10 09:29:39
648
原创 Golang 与Java 单例模式、工厂模式比较
为了便于理解Golang的设计模式,将其与Java的设计模式对比,可以为之前熟悉Java的同学提供一个便利的思路;Golang 和 Java 在实现单例模式、工厂模式时,因语言特性(如面向对象模型、并发机制、类型系统等)的差异,呈现出不同的设计思路和实现方式。
2025-08-08 13:13:00
772
原创 Mysql与Oracle 索引失效场景对比
MySQL与Oracle索引失效场景对比 摘要:MySQL和Oracle在索引失效方面存在共性和差异。两者在函数/表达式、OR条件、否定操作符、隐式类型转换、模糊查询和联合索引等场景都可能失效,但表现不同:MySQL 8.0前不支持函数索引,对OR条件处理更严格;而Oracle原生支持函数索引,优化器更灵活。联合索引场景中,MySQL范围查询后列失效,Oracle可能支持跳跃扫描。开发中需结合数据库类型和版本,通过执行计划分析避免索引失效。
2025-08-08 12:51:36
1463
原创 mysql 索引失效分析
MySQL索引失效的核心原因包括:在索引列上使用函数/表达式、隐式类型转换、使用NOT IN/!=操作符、%开头的模糊查询、违反联合索引最左前缀原则、OR条件含非索引列、索引列参与计算等。失效本质是破坏了B+树索引的有序性和可比较性,导致优化器选择全表扫描。优化建议包括:避免对索引列运算、确保类型匹配、合理设计联合索引、使用EXPLAIN分析执行计划等。通过理解这些原理并合理设计索引,可有效提升查询性能。
2025-08-07 23:59:55
778
原创 最佳左前缀法则(Optimal Left-Prefix Rule)
摘要:复合索引遵循"最佳左前缀法则",即查询条件需从索引最左侧列开始才能有效利用索引。例如索引(a,b,c)中,仅查询c或b、c不会走索引;查询a或a、b能部分使用索引;只有a、b、c全查时索引才完全生效。特殊情况是,即使条件顺序(c,b,a)与索引顺序不同,MySQL优化器会自动调整为(a,b,c)顺序,依然能充分利用索引。该原理基于B+树索引的排序特性,只有按定义顺序匹配才能高效检索数据。
2025-08-07 23:50:24
232
原创 defer、return、return value 执行顺序
在 Go 语言中,deferreturn语句和返回值的执行顺序及相互影响是一个容易混淆的点。
2025-07-23 14:46:46
568
原创 Golang内置函数及案例
Go语言常用内置函数摘要:len()获取字符串、切片等长度;cap()获取切片/通道容量;new()分配零值内存返回指针;make()创建并初始化切片/映射/通道;append()向切片追加元素;copy()复制切片元素;delete()删除映射键值对;close()关闭通道;complex()/real()/imag()处理复数;panic()抛出异常,recover()捕获异常恢复执行。这些函数简化了基础数据结构的操作和内存管理。
2024-11-14 15:13:18
531
1
原创 MySQL与Oracle对比及区别
性能卓越,服务稳定,很少出现异常宕机;开放源代码无版本制约,自主性及使用成本低;历史悠久,社区和用户非常活跃,遇到问题及时寻求帮助;软件体积小,安装使用简单且易于维护,维护成本低;品牌口碑效应;支持多种OS,提供多种API接口,支持多种开发语言,对流行的PHP,Java很好的支持。
2024-11-12 11:43:55
5486
2
原创 云原生架构图
云原生(Cloud Native) 是一种软件架构和开发方法论,旨在充分利用云计算环境的优势,使应用程序更具有弹性、可伸缩性、可靠性和效率。其中,“Cloud Native” 应用程序通常采用微服务架构,使用容器技术进行部署,倡导自动化运维和持续集成/持续部署。整个设计思想旨在使应用程序能够更好地适应云环境中的快速变化和不断增长的需求。
2024-11-09 16:51:07
674
原创 Go 中的 Context实现原理以及正确使用方式
在 Go 语言中,Context 包是用于传递请求范围数据、取消信号和截止时间的机制。它通常被用来处理 goroutine 之间的通信和取消。Context 包是 Go 语言内置的,它可以很方便地使用,而不需要额外的依赖。Context 包是一个轻量级的工具,它提供了一个标准的接口,用于在 goroutine 之间传递请求范围的数据、取消信号和截止时间。Context 包实现了一种类似于树状结构的数据结构,其中每个节点都表示一个请求范围。
2024-11-05 22:07:38
1669
原创 Go 位运算符的使用
假如一个列表中有2*N+1个数,其中一个数字只出现了一次。位清空的意思是 **假如有 两个变量 var1 &^ var2 作位清空运算 **,第一位如果为0结果为0 第一位如果结果为1 结果为1 利用这个特性数值右移一位 循环计算即可。两个运算符左侧总是为要进行位移操作的变量,右侧为需要移动的位数值。就有点懵,以为是0左移32位 不明白为什么结果为32,就是因为把32当做要位移的位数了。当两个数二进制位有一个为1时当前位置1,同为0的时候当前位才会置0。当两个数二进制位同为1的时候当前位置1,否则置0。
2024-11-04 21:57:59
602
原创 Golang channel底层原理
假如channel为缓冲区通道,从channel缓冲区头部(recvx)读数据,将sudog对应写协程数据,写入缓冲区尾部(sendx),唤醒写协程。默认情况下,读写未就绪的channel(读没有数据的channel,或者写缓冲区已满的channel)时,协程会被阻塞。但是当读写channel操作和select搭配使用时,即使channel未就绪,也可以执行其它分支,当前协程不会被阻塞。当存在阻塞读协程,直接把数据发送给读协程,唤醒并将其放入协程可运行队列中等待调度运行。从环形缓冲区读数据。
2024-11-03 21:25:33
1367
原创 Golang gRPC
我们的第一步(正如您从gRPC 简介中了解到的那样)是使用协议缓冲区定义 gRPC服务以及方法请求和响应类型。有关完整的.proto文件,请参见。要定义服务,您需要在.proto文件中指定一个名为service的服务...然后,您在服务定义中定义rpc方法,指定它们的请求和响应类型。gRPC 允许您定义四种服务方法,所有这些方法都在RouteGuide服务中使用简单 RPC,其中客户端使用存根将请求发送到服务器并等待响应返回,就像普通的函数调用一样。服务器端流式 RPC。
2024-11-03 13:01:07
1275
原创 Golang new() make var []int 使用的具体区别
初始化数组为nil,可以append插入数据,不能用下标t[i]=1插入数据;初始化数值长度为0,没有append方法,t[0]=1也会在编译时报错;初始化数组长度>0,没有append方法,用下标t[i]=1的方法可以正常插入数据;初始化一个长度为0容量为nil的切片即make([]int, 0) ,t = appeng(t,1)可以正常插入数据;初始化一个长度为0容量为nil的切片即make([]int, 0,0),t = appeng(t,1)可以正常插入数据;
2024-11-01 08:30:00
1831
原创 数组排序简介-桶排序(Bucket Sort)
桶排序的稳定性取决于桶内使用的排序算法。如果桶内使用稳定的排序算法(比如插入排序算法),并且在合并桶的过程中保持相等元素的相对顺序不变,则桶排序是一种。以 [39,49,8,13,22,15,10,30,5,44] 为例,演示一下桶排序算法的整个步骤。将待排序数组中的元素分散到若干个「桶」中,然后对每个桶中的元素再进行单独排序。对于数据分布不均或空间限制严格的场景,选择桶排序时需谨慎评估其适用性。反之,则桶排序是一种。
2024-10-31 20:23:22
429
1
原创 数组排序简介-归并排序(Merge Sort)
归并排序是一种采用分治策略的稳定排序算法。其核心思想是将数组递归分解为若干子数组直至长度为1,再两两合并为有序数组。算法步骤包括:分解阶段将数组不断对半拆分,归并阶段通过双指针比较合并有序子数组。该算法适用于大规模数据排序、需要稳定性的场景,时间效率为O(nlogn)。示例代码展示了Go语言实现,通过递归分解和有序合并完成排序。归并排序在保持元素相对顺序的同时,能高效处理海量数据,特别适合外部排序和并行计算环境。
2024-10-31 17:54:17
463
原创 数组排序简介-计数排序(Counting Sort)
数组排序简介-计数排序(Counting Sort) 定义一个大小为排序范围的计数数组 countscounts,用于统计每个元素的出现次数。其中:数组的索引值 num−nums_min 表示元素的值为 num。数组的值 counts[num−nums_min] 表示元素 num 的出现次数。
2024-10-30 08:58:16
859
原创 数组排序简介-堆排序(Heap sort)
堆排序是一种基于堆结构的高效排序算法。其核心思想是将数组构建为大顶堆,通过重复取出堆顶最大元素并调整堆结构实现排序。算法步骤包括:1)构建初始大顶堆;2)交换堆顶与末尾元素后调整堆;3)重复操作直至堆大小为1。堆排序具有O(nlogn)时间复杂度,适用于大规模数据排序、内存受限环境等场景,但属于不稳定排序。文中提供了Golang实现代码,通过heapify函数维护堆性质,逐步完成排序。
2024-10-30 08:18:05
724
原创 数组排序简介-快速排序(Quick Sort)
快速排序是一种基于分治策略的高效排序算法,其核心思想是通过"哨兵划分"将数组分为左右两个子数组,然后递归排序。算法步骤如下:1)选取基准数pivot;2)使用双指针将小于pivot的元素移到左侧,大于pivot的移到右侧;3)递归处理子数组直到完成排序。该算法在大量随机数据排序时表现优异,具有原地排序和空间效率高的特点,但属于不稳定排序。示例代码展示了Go语言实现,通过递归方式完成快速排序过程。
2024-10-29 11:36:10
1008
原创 数组排序简介-希尔排序(Shell Sort)
希尔排序是一种改进的插入排序算法,通过间隔分组逐步排序实现优化。其核心思想是将数组按间隔划分为子数组进行插入排序,逐步缩小间隔直至为1。算法步骤包括:初始化间隔,分组排序,不断缩小间隔重复操作。该算法适用于大型数组,效率优于简单插入排序,且规模越大优势越明显。示例代码展示了用Go语言实现的希尔排序过程,通过动态调整间隔完成排序。需要注意的是,文中部分内容误将希尔排序与归并排序的描述混淆,实际上希尔排序是不稳定的排序算法。
2024-10-29 11:24:16
666
原创 数组排序简介-插入排序(Insertion Sort)
数组排序简介-插入排序(Insertion Sort) 将数组分为两个区间:左侧为有序区间,右侧为无序区间。每趟从无序区间取出一个元素,然后将其插入到有序区间的适当位置。插入排序在每次插入一个元素时,该元素会在有序区间找到合适的位置,因此每次插入后,有序区间都会保持有序。
2024-10-28 22:45:54
320
原创 数组排序简介-选择排序(Selection Sort)
选择排序是一种简单的排序算法,通过将数组分为已排序和未排序区间,每次从未排序区间选择最小元素放入已排序区间末尾。其时间复杂度为O(n²),空间复杂度O(1),属于不稳定排序。算法适合小数据量排序,优点是原地操作无需额外空间。相比冒泡排序,选择排序在所有情况下时间复杂度均为O(n²),且不稳定。代码实现简洁,通过遍历比较找到最小值进行交换。该算法适用于对空间有要求但对稳定性无需求的小规模数据排序场景。
2024-10-28 22:35:59
565
原创 数组排序简介-冒泡排序(Bubble Sort)
本文介绍了冒泡排序的基本原理和特点。冒泡排序通过相邻元素比较交换,使较大元素逐渐后移,较小元素前移,如同气泡上浮。算法步骤包括:比较相邻元素、交换位置、每轮确定一个最大值。其时间复杂度较高,适用于小规模或基本有序的数据。冒泡排序是稳定算法,不会改变相等元素的相对顺序。文章最后提供了Golang的实现代码,展示了具体的排序过程。该算法简单易懂,但效率较低,适合教学或特定场景使用。
2024-10-28 22:10:12
501
原创 go.mod 与go.sum作用
go.sum文件在 Go 模块管理中起着至关重要的作用,它主要用于确保依赖模块的完整性和一致性。当使用go mod进行依赖管理时,go.sum文件记录了每个直接依赖和间接依赖模块的版本哈希值。这些哈希值是根据特定的哈希算法(通常是 SHA-256)计算得出的,用于验证下载的模块内容是否与预期一致。例如,假设你的项目依赖了模块,在go.sum。其中,v1.7.4是模块的版本号,后面的一大串字符是该版本模块内容的哈希值。2、内容结构。
2024-10-25 11:16:07
2157
原创 goalng框架Gin解析
本文通过案例的形式,说明gin框架的基本用法,主要列举后端的案例,前端和相对简单的知识点未在此分析;过完案例后可以有个基本的印象:就是封装和简便。
2024-10-24 16:10:47
748
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅