- 博客(33)
- 资源 (3)
- 收藏
- 关注
原创 Redis 双写一致性:旁路缓存、延迟双删、读写锁、异步通知
本文探讨了数据库与缓存双写一致性问题及解决方案。首先解释了双写一致性的概念,即修改数据库时同步更新缓存。然后分析了两种更新顺序(先更新数据库或先更新缓存)都会导致数据不一致的问题,提出旁路缓存策略(Cache Aside),通过删除缓存而非更新缓存来解决。进一步讨论了先删缓存还是先更新数据库的问题,指出两种方式都存在脏读风险,建议采用延时双删策略。最后介绍了增强手段:读写锁(强一致但性能低)和异步通知(基于MQ或Canal实现最终一致性)。文章强调应根据业务场景选择合适方案,强一致性业务可用读写锁,允许延迟
2025-12-09 22:07:44
959
原创 Redis 缓存问题:穿透、击穿、雪崩是什么及其解决方案
本文主要介绍了Redis缓存中的三种常见问题及解决方案: 缓存穿透:查询不存在的数据导致请求直接打到数据库。解决方案包括缓存空数据和使用布隆过滤器进行预判。 缓存击穿:热点数据失效导致大量并发请求访问数据库。可通过互斥锁保证强一致性,或使用逻辑过期策略提高性能。 缓存雪崩:大量key同时失效或Redis宕机引发数据库压力。需设置不同过期时间或实现高可用架构。 三种问题区别在于:穿透针对不存在数据,击穿针对单个热点数据,雪崩则是大量数据集体失效。解决方案需根据业务场景选择。
2025-12-09 17:13:58
837
原创 Redis 数据过期删除和内存淘汰策略:惰性删除 + 定期删除、LRU 和 LFU . . .
Redis 支持对数据设置有效时间,数据过期以后,Redis 就需要将数据从内存中删除。那么 name - qingxue 的有效时间就是 10 秒Redis 里的数据可以按照不同的规则进行删除,这种删除规则就被称之为数据过期删除策略。数据过期删除策略 = 过期删除策略 = 数据过期策略 = 数据删除策略当 Redis 中的内存不够用时,此时再向 Redis 中添加新的 key,那么 Redis 就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存淘汰策略,有时也被称为数据淘汰策略。
2025-12-08 21:53:07
866
原创 Redis 数据持久化:RDB和 AOF 有什么区别?
Redis提供了RDB和AOF两种持久化方式。RDB通过快照方式定期将内存数据保存为.rdb文件,支持手动(save/bgsave)和自动触发,采用写时复制技术避免阻塞。AOF记录所有写命令,可配置刷盘策略(always/everysec/no),并通过重写机制优化文件大小。RDB恢复速度快但可能丢失数据,AOF更安全但文件较大。两者可配合使用,确保Redis宕机后数据可恢复。实际应用中建议同时开启,根据业务需求配置合适的触发策略。
2025-12-07 21:30:05
1285
原创 Redis 线程模型:Redis为什么这么快?Redis为什么引入多线程?
Redis采用单线程模型处理客户端请求,确保命令顺序执行且无锁竞争,实现高性能内存操作。但其程序并非完全单线程,包含多个后台线程处理文件关闭、AOF刷盘和内存释放等耗时任务。Redis的高性能源于内存操作、高效数据结构、单线程无竞争以及I/O多路复用技术。6.0版本引入多线程主要优化网络I/O中的协议解析和序列化操作,但默认关闭以保持兼容性。Redis的设计权衡了多线程的复杂度与性能收益,在大多数场景下单线程模型已足够高效。
2025-12-06 21:52:38
912
原创 MySQL【索引】:索引的概念与分类
索引是数据库优化查询性能的关键数据结构,通过B+树等结构快速定位数据,减少磁盘IO和CPU消耗。索引分为多种类型:按数据结构有B+Tree、Hash等;按物理存储有聚簇索引(存放实际数据)和二级索引(存放主键值);按字段特性可分为主键索引、唯一索引、普通索引和前缀索引(针对字符串前几个字符)。合理使用索引能显著提升查询效率,但会占用额外存储空间,体现"以空间换时间"的设计思想。
2025-12-05 22:15:26
639
1
原创 Redis 的数据类型 + 底层实现:String、Hash、List、Set、ZSet
Redis数据类型及底层实现摘要 Redis提供五种基本数据类型:String、Hash、List、Set、ZSet,以及四种高级类型(BitMap、HyperLogLog、GEO、Stream)。每种类型采用不同的底层结构: String:动态字符串SDS,支持二进制安全、自动扩容 Hash:小数据用listpack(原ziplist),大数据用哈希表 List:3.2版本后统一为quicklist(双向链表+压缩列表组合) Set:整数且少量元素用intset,其他情况用哈希表 ZSet:小数据用lis
2025-12-05 22:03:02
1154
原创 认识 Redis:Redis 是什么?好处?业务场景?和MySQL的区别?
Redis是一个基于内存的高性能数据结构存储系统,支持字符串、哈希、列表等丰富数据类型,常用于缓存、消息队列等场景。相比MySQL,Redis通过内存操作提供极快的读写速度,能有效提升系统性能并减轻数据库负载。其持久化机制(RDB/AOF)确保数据安全,主从复制和集群模式保障高可用性。Redis典型应用场景包括热点数据缓存、分布式锁实现、排行榜功能、限时业务处理等,其中缓存和分布式锁是最核心的应用。通过Redis+MySQL的组合,可以显著提高系统QPS,满足高并发需求。
2025-12-05 21:48:53
1168
1
原创 MySQL【存储引擎】:InnoDB、MyISAM、Memory...
MySQL主要存储引擎包括InnoDB、MyISAM和Memory。InnoDB是5.5版本后的默认引擎,支持事务、行级锁和外键,适合高负载OLTP应用;MyISAM不支持事务和行级锁,但存储容量更大,适合读多写少场景;Memory引擎数据存储在内存中,读写快但不持久。InnoDB与MyISAM的主要区别在于锁机制、事务支持和外键约束。MyISAM查询速度更快,因其索引直接指向数据位置且不维护事务特性。InnoDB的行级锁包括记录锁、间隙锁和临键锁,锁机制更细粒度。
2025-12-04 22:11:07
600
原创 MySQL【数据类型】:CHAR 和 VARCHAR 的对比、VATCHAR(n) 和 INT(n) 里的 n 一样吗?
MySQL数据类型详解及优化策略 本文系统介绍了MySQL三大数据类型(数值、日期/时间、字符串)的特点与应用场景。重点对比了CHAR和VARCHAR两种字符串类型的差异:CHAR定长(性能优但空间浪费),VARCHAR变长(空间优但性能略差)。文章通过学生表设计案例演示了数据类型选择,并解答了四个关键面试题:1)CHAR与VARCHAR的本质区别;2)VARCHAR长度并非越大越好(涉及内存分配问题);3)CHAR仍具优势场景(固定长度字段);4)VARCHAR(11)与INT(11)中数字含义的本质差异
2025-12-04 21:58:06
759
原创 MySQL【数据库的三大范式】:1NF 原子、2NF 完全依赖、3NF 不可传递
本文介绍了数据库设计的三大范式原则。第一范式(1NF)要求字段具有原子性,不可再分;第二范式(2NF)要求非主键字段完全依赖主键,避免部分依赖;第三范式(3NF)消除传递依赖,非主键字段只能直接依赖主键。范式设计能减少数据冗余、保证一致性,但过度范式化会导致查询性能下降。实际开发中需要在规范化和性能之间取得平衡,有时会采用反范式设计来提高查询效率。理解三大范式有助于设计出结构合理、维护性好的数据库。
2025-12-04 21:08:03
820
原创 MySQL【SQL及其分类】:DDL、DML、DQL、DCL
SQL是结构化查询语言,用于操作关系型数据库的统一标准语言。文章介绍了SQL的通用语法(不区分大小写、分号结尾、注释方式)和四大分类:DDL(数据定义)、DML(数据操作)、DQL(数据查询)和DCL(数据控制)。重点讲解了DDL操作数据库和表的方法,包括查询、创建、修改和删除数据库/表,以及DML中的添加和修改数据操作。文章通过示例代码演示了各种SQL语句的具体用法和注意事项。
2025-12-04 20:26:39
1087
原创 MySQL【数据库的相关概念】:什么是数据库?关系型和非关系型数据库有哪些?OLTP和OLAP的区别...
MySQL是一种关系型数据库(RDBMS),主要用于OLTP在线事务处理场景,如银行交易等日常业务操作。它与OLAP在线分析处理不同,OLTP侧重"小、快、准"的业务操作,而OLAP侧重"大、重、广"的数据分析。
2025-12-01 22:29:50
870
原创 MySQL【索引】篇:索引的分类、B+树、创建索引的原则、索引失效的情况...
索引概述 索引是数据库中提升查询速度的一种数据结构,类似于书籍的目录,帮助数据库快速定位数据。它通过B+树结构实现高效查找,将时间复杂度从O(n)降低到O(log n),大幅减少磁盘IO和CPU消耗。索引采用空间换时间的设计思想,在维护数据的同时额外存储索引信息。 索引主要分为三类: 按数据结构:B+Tree、HASH、Full-Text索引 按物理存储:聚簇索引(存放实际数据)和二级索引(存放主键值) 按字段特性:主键索引(不可为NULL)、唯一索引(值不可重复)、普通索引(基础查询优化)和前缀索引
2025-12-01 22:13:06
1088
原创 Go【Map】进阶篇:底层原理、赋值、访问、扩容流程
Go语言中map的底层实现采用哈希表结构,主要由hmap和bmap组成。hmap是map的核心控制结构,包含桶数组、哈希种子等元信息;bmap是实际存储键值对的桶结构,每个桶可存8个键值对,采用紧凑的内存布局存储tophash、keys和values数组,并通过overflow指针连接溢出桶。map初始化时会根据容量计算桶数量,写入数据时通过哈希值定位桶位置,并处理可能的扩容迁移。这种设计在保证高效查找的同时,通过溢出桶减少了扩容频率。
2025-11-23 22:33:31
989
原创 Go【Map】基础篇:键值对快速检索、map是否并发安全?
Map是一种无序的键值对集合,通过key快速检索数据。在Go语言中,map的键类型必须可比较,如string、int等,而slice、map等不可比较类型不能作为键。map可以通过字面量或make函数初始化,使用make时建议指定初始容量以提高性能。访问map时返回value和bool值,未找到key时返回对应类型的零值。注意未初始化的map为nil,不能直接存储元素。若需要key对应多个value,可使用切片类型作为value。map是引用类型,动态增长且无序,底层通过哈希表实现。
2025-11-22 22:29:13
758
原创 Go【接口】进阶篇:揭秘底层结构 iface 与 eface
Go语言接口的底层分为两种结构:eface和iface。eface实现空接口interface{},仅包含_type指针(类型信息)和data指针(实际数据)。iface实现带方法的接口,包含itab(接口类型信息和方法表)和data指针。主要区别在于:eface无方法表,可存储任意类型但不能调用方法;iface包含方法表,只能存储实现了接口方法的类型,支持方法调用。itab结构存储接口类型、动态类型、哈希值和实现方法的函数指针数组。
2025-11-22 22:17:24
316
原创 一文学会 Go【Context】四大核心方法 + 七大创建方式!
Go语言中的Context接口是用于在goroutine间传递请求范围值、取消信号和超时控制的重要机制。该接口定义了四个核心方法:Deadline()返回截止时间和是否设置标志,Done()返回取消通知通道,Err()返回取消原因,Value()获取上下文存储的值。Deadline()方法常用于判断任务是否设置了执行时限,如示例中通过WithDeadline创建的Context会返回具体截止时间,而TODO()创建的则返回零值。这些方法共同构成了Go并发编程中优雅控制协程生命周期的基础设施。
2025-11-21 22:18:04
1485
原创 一文学会Go语言【Channel】机制
Go语言中的Channel(通道)是实现goroutine间通信的核心机制,遵循CSP并发模型。通道分为无缓冲和有缓冲两种类型,使用make初始化。通过<-操作符进行数据收发,close()关闭通道。当通道关闭后,仍可读取数据但会返回零值,而写入会导致panic。判定式读取(v, ok := <-ch)可以检测通道状态。通道实现了goroutine间的安全数据交换,避免了共享内存的竞态问题。正确使用通道能有效实现并发编程中的数据同步与通信。
2025-11-19 22:20:23
817
原创 Go语言【变量与常量】的全面指南:声明、初始化、类型转换、作用域详解
本文摘要: Go语言变量与常量详解。变量是内存中命名区域,必须在使用前声明且类型静态检查,支持单行和批量声明。变量初始化可采用标准格式或短变量格式(仅限函数内)。常量在编译期创建,值不可变,支持布尔、数值和字符串类型,需用const声明。常量/变量混合运算时要求类型一致,可通过显式类型转换解决类型不匹配问题。强调变量必须使用、不能重复声明,以及短变量声明的限制条件。
2025-11-19 12:18:18
1051
原创 Go 语言的【并发】编程核心:进程、线程与协程详解
本文摘要: 进程、线程与协程:进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位,协程是更轻量的用户态线程,由语言自带调度器管理,切换开销更小。 并行与并发:并行指任务同时运行(需多核支持),并发指任务交替执行(单核即可实现)。 Goroutine特点: Go语言实现的轻量级协程,初始栈仅2KB且可动态伸缩 调度由Go runtime在用户态完成,切换成本远低于线程 无需手动管理线程池,可轻松创建大量goroutine(十万级别) 使用方式:通过go func()语法创建goroutine,实现简
2025-11-18 22:11:23
956
原创 一文学会 Go【接口】:定义与实现接口、空接口、类型断言、接口比较
Go语言中的接口定义了一组方法签名,是一种行为契约,不包含实现。结构体定义具体属性和方法,当结构体方法与接口方法签名匹配时即隐式实现了该接口,无需显式声明。接口通过type和interface关键字定义,其实现语法与普通方法定义一致。示例展示了如何定义Person接口、Student结构体,通过实现接口方法实现多态,最终将结构体实例赋值给接口变量并调用方法。这种机制为Go语言提供了灵活的多态支持,使代码更易于扩展和维护。
2025-11-18 22:03:32
825
原创 一文学会 Go【方法】的定义与调用!
Go语言中的方法是绑定在特定类型上的函数,通过接收者(receiver)将方法与类型关联。方法定义包含接收者、方法名、参数列表和返回值列表,其中接收者类型不能是指针或接口类型。方法必须与接收者类型在同一包内定义,不能为原生类型添加方法。方法调用通过"."操作符完成,无论是值类型还是指针类型定义的方法,都可以通过值或指针变量调用,编译器会自动进行转换。方法为Go语言提供了面向对象的特性,使得结构体与方法结合可以近似实现类的功能。
2025-11-17 18:43:02
822
原创 Go语言的【结构体】详解:定义、初始化与成员访问
Go语言结构体是一种复合数据类型,用于组合多种属性来描述复杂对象。通过type struct_name struct语法定义结构体,可以包含多个成员变量。结构体支持两种初始化方式:键值对形式(可选择性初始化部分属性)和值列表形式(必须按顺序初始化全部属性)。使用点操作符.可以访问结构体成员,还支持结构体嵌套实现属性继承。结构体有效解决了基本数据类型无法描述复杂对象的问题,是Go语言中组织数据的核心方式之一。
2025-11-17 12:21:29
401
原创 一文掌握Go语言【函数】,将内置函数、高阶函数、匿名函数、闭包一网打尽!
函数是将大问题分解为小任务、实现代码复用的语法结构。声明格式为func 名称(参数) (返回值) {函数体},支持多返回值。参数传递采用值传递方式,基本类型为深拷贝,slice/map/channel为浅拷贝。函数支持形参与实参对应,返回值可命名或匿名。示例展示了无返回值、单返回值和多返回值的函数定义与调用方式。
2025-11-15 12:05:30
767
原创 从 growslice 源码看 Go 语言【切片扩容】的 4 步流程!
Go 切片数据结构包含指向底层数组的指针、当前长度和容量。当使用 append 添加元素超过当前容量时触发扩容。Go 1.18 之前,小切片(<1024)容量翻倍,大切片按1.25倍增长;1.18 之后,阈值改为256,大切片使用更精细的增长公式 newcap += (newcap + 3*256)/4 扩容。扩容机制旨在平衡内存使用和性能,避免频繁扩容造成浪费。
2025-11-14 22:15:21
923
原创 Go 中的数组与切片有什么不同?
摘要: Go语言中数组和切片是两种密切相关的数据结构。数组长度固定,是值类型,存储在栈/堆上,传递时会复制整个数组,适合固定大小的集合。切片长度可变,是引用类型,存储在堆上,通过指针、长度和容量管理底层数组,支持动态扩容和裁剪,传递时只复制元数据,灵活性更高但涉及内存分配。数组适合需要安全复制的场景,切片适合需要动态增减元素的场景。
2025-11-14 22:02:32
1109
原创 一文详解 GO 语言中的数组与切片
本文介绍了Go语言中数组的基本概念和使用方法。数组是由固定长度的特定类型元素组成的序列,由于长度固定,在Go中较少直接使用。文章详细说明了数组的声明语法、默认值规则,以及三种取值方式(索引下标、for range遍历)。对于赋值操作,介绍了初始化时逐一赋值、指定索引赋值和后续索引赋值三种方法。最后指出数组比较的前提条件是类型必须完全相同(包括长度和元素类型)。本文内容对理解Go语言数组的基本特性具有指导意义。
2025-11-13 22:20:15
838
原创 Go 语言的类型别名与类型自定义
本文介绍了Go语言中的类型自定义和类型别名两种特性。类型自定义使用type关键字基于现有类型创建新类型,新类型与原类型需显式转换才能运算;类型别名通过type T = U语法为已有类型创建完全等同的别名,可直接互换使用。关键区别在于:类型自定义产生新类型,类型别名创建等价名称。记忆要点:type T U为新类型,type T = U为类型别名。
2025-11-12 22:24:28
152
原创 详解 Go语言中的数值类型——整型、浮点型、复数
Go数值类型概述 Go语言提供三大类数值类型:整数型、浮点型和复数型。整数型分为平台无关整型(固定大小)和平台相关整型(大小随系统变化),包括有符号和无符号两种形式,并提供byte和rune语义别名。浮点型有float32和float64,默认使用后者以保证精度。复数型包括complex64和complex128,支持复数字面值构造和实部虚部提取。数值类型转换需注意精度损失问题,浮点数比较应考虑误差阈值。Go还支持多种进制的整数表示和格式化输出。
2025-11-12 22:18:36
646
原创 【清理C盘】将WSL从C盘迁移到D盘
确保 D:\Ubuntu_WSL\Ubuntu.tar 和 D:\Ubuntu_WSL\docker-desktop.tar 文件已成功创建。输入 wsl --shutdown 使其停止运行,再次使用 wsl -l -v 确保其处于stopped状态。在D盘创建一个目录用来存放新的WSL,比如我创建了一个 D:\Ubuntu_WSL。这时候启动WSL,已经恢复正常了,但是用户变成了root,之前使用过的文件也看不见了。了解到本机的WSL的版本一个为Ubuntu,一个为docker-dektop。
2025-04-07 23:49:46
1399
1
原创 python自动办公|批处理文件|txt转Excel
在这里插入图片描述](https://img-blog.csdnimg.cn/8348d8894b524de895a58e79c5852714.png。💗功能8:在7的基础上将文件夹内的txt转换成同名的空白excel。🌟功能6:将1-5封装成一个自定义函数txt_to_excel。🌟功能4:在excel新增一行并添加数据。🌟功能3:删除单元格内不需要的字段。🌟功能2:删除指定列(从1开始)🌟功能1:txt转Excel。🌟功能5:保存excel文件。💗功能7:只复刻文件夹的结构。
2023-11-19 02:09:17
219
原创 如何在Tensorboard上查看模型训练信息
在浏览器中打开Tensorboard的网址,默认为http://localhost:6006/,即可查看相关的日志。在Tensorboard的左边栏中可以依次查看训练损失、训练精度、验证损失、验证精度和学习率等信息的变化趋势。如何在Tensorboard上查看训练过程中得到的训练损失、训练精度、验证损失、验证精度和当前学习率等信息?这里添加了训练损失、训练精度、验证损失、验证精度和当前学习率等信息到Tensorboard中。这里启动了一个Tensorboard服务,并且将日志输出路径设置为"./log"。
2023-05-17 03:10:38
4111
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅