自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 资源 (2)
  • 收藏
  • 关注

原创 Kafka 和 RabbitMQ 介绍及在 Go 中的使用

Kafka是一个分布式流平台,主要用于高吞吐量、低延迟的数据流处理。它基于发布/订阅模型,用来处理大量的数据流。RabbitMQ是一个流行的开源消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议,提供可靠的消息传递功能。

2025-04-22 18:11:22 500

原创 Kafka 消息有序性 和 阻塞处理方案

设置相同的 key,Kafka 会根据 key 的 hash 值映射到固定分区。多个 consumer 去消费同一个分区,顺序就会被破坏。设置合理的 consumer 超时和 commit 间隔。保证同一个 key 的消息都进一个分区,自然就有序。增加 consumer 实例,提升消费并发度。,同一个分区内的消息是严格按顺序追加的,但。加速消费积压消息:暂停写入 + 拉快消费。提高消费速度,避免长耗时阻塞。分区,才能保证消费顺序。监控消息堆积量、消费速率。(内存 buffer)增加分区数量,分摊压力。

2025-04-22 18:10:27 388

原创 MySQL 死锁排查与解决方案

两个或多个事务在执行过程中,互相持有对方需要的锁,导致彼此都无法继续执行,形成永久阻塞。1️⃣ 发现死锁异常↓2️⃣查看死锁详情↓3️⃣ 分析死锁链、锁类型、冲突 SQL↓4️⃣ 确定高危事务,锁顺序、索引、执行顺序↓5️⃣ 优化 SQL、事务顺序、加索引、拆分事务↓6️⃣ 上线压测验证。

2025-04-22 18:05:35 420

原创 MySQL 常见索引失效场景

不要应该不要对索引字段做函数运算保持索引字段原样不要隐式类型转换保证类型匹配开头的 like 查询尽量用前缀匹配or 查询字段不全有索引用 union all 替代 or联合索引按顺序用遵循最左前缀原则。

2025-04-22 18:00:52 149

原创 MySQL 调优实战经历总结

慢查询日志 + EXPLAIN 永远是第一手武器没有银弹,SQL优化 + 索引调整 + 参数调优 + 架构设计多维度协同才是王道不迷信 ORM,复杂业务场景敢用原生 SQL定期巡检数据库慢日志和 QPS 峰值。

2025-04-22 17:57:28 215

原创 MySQL事务详解

事务(Transaction)是指一组操作,要么全部执行成功提交(commit),要么全部不执行回滚(rollback),是数据库保证数据一致性的重要机制。✅事务原子性靠 Undo Log + 两阶段提交机制保障,隔离级别控制事务并发可见性,InnoDB 默认 REPEATABLE READ 通过 next-key lock 解决幻读问题,ACID 特性是保障数据安全的一整套机制。

2025-04-22 17:52:51 448

原创 Redis 和 DB 数据不一致的解决方案

场景推荐方案缓存 + 数据库写不一致先更新库再删缓存 + 延时双删缓存穿透缓存空值 / 布隆过滤器缓存击穿永久热点 key / 互斥锁 / 延时双删缓存雪崩随机 TTL / 定时预热 / 多级缓存高可用一致性同步MQ 异步同步缓存允许最终一致性场景定时校验 + 延迟队列 + 延时双删| Redis 和 DB 的一致性,核心是延时双删缓存空值防穿透互斥锁防击穿随机TTL防雪崩MQ异步保证最终一致,按场景选方案,组合用,效果最佳。

2025-04-22 17:43:36 573

原创 Go 中 atomic 能解决 map 并发读写问题吗?

atomic 用于原子操作基础类型,不能直接保证 map 内部的线程安全。| | 替换 map 整体引用可以用,但不适合频繁读写的 map 场景。

2025-04-22 17:31:18 153

原创 Go 中 map 并发读写问题及解决方案

🔥 总结一句话:Go 原生 map 非线程安全,严禁并发读写,务必使用加锁、sync.Map 或 Channel保证并发安全。

2025-04-22 17:29:29 412

原创 大语言模型提示词优化技巧与多场景通用模版库

你是一个多文本摘要助手。

2025-04-21 19:46:30 285

原创 Golang 单元测试实践与技术分享

本文将介绍如何使用 Go 语言编写高质量的单元测试,并解释相关的最佳实践。我们将通过一个完整的示例项目来演示如何编写测试、为什么这样写以及如何在日常开发中应用这些技术。编写良好的单元测试是保证 Go 代码质量的关键。通过表格驱动测试、全面的测试用例和清晰的错误报告,可以创建可维护且可靠的测试套件。为所有重要逻辑编写测试追求合理的测试覆盖率(通常80%以上)定期运行测试(可以集成到CI/CD中)将测试作为设计工具,帮助改进代码结构。

2025-04-15 16:07:30 1045

原创 Go pprof 性能分析使用说明文档

pprof 是 Go 官方内置性能分析工具,提供多种分析视图:CPU Profiling(CPU 占用分析)Memory Profiling(内存分配分析)Goroutine Profiling(协程分析)Threadcreate Profiling(线程创建分析)堆栈(Stack trace 快照)通过 HTTP 端口或文件采样,结合或 Web 火焰图直观分析程序性能瓶颈。功能命令内存 Profile火焰图。

2025-04-14 14:38:44 975

原创 Go 中 Actor 模型与 GMP 模型的区别

在 Go 语言中,Actor 模型和GMP 模型(Goroutine、M 线程、P 调度器)是两种不同的并发编程模型。GMP 模型是 Go 语言运行时的核心调度机制,而 Actor 模型是一种并发编程的设计范式,通常可以在 Go 中使用 goroutine 和 channel 进行实现。每个 Actor 维护自己的状态。Actor 通过消息传递进行通信,避免了传统锁竞争问题。Actor 处理消息时是原子的,不会并发执行。:Go 语言的协程,每个 Goroutine 代表一个独立的任务。

2025-02-13 18:02:11 715

原创 Go中的Actor模型应用场景

Actor模型是一种并发计算模型,每个Actor都是一个独立的计算实体,它能够接收消息、处理消息并发送消息。Actor模型简化了并发编程的复杂性,通过消息传递来避免共享状态,从而使得并发的执行变得更为直观。

2025-02-13 16:43:17 478

原创 Go 中 map 的底层结构和扩容机制

Go 采用渐进式扩容策略,即每次插入或删除操作时,会迁移部分桶中的数据。:是存储键值对的桶结构,每个桶最多存储 8 个键值对。如果某个键值对被删除,其对应的桶不会立即清理,而是标记为。扩容时,旧桶中的键值对会根据新的哈希值重新分配到新桶中。:将旧桶中的键值对重新计算哈希值,并迁移到新桶中。可能会扩容,其键值对的内存地址可能会发生变化。中的元素数量增加时,为了维持高效的存取性能,:当某个桶的溢出链表过长时,也会触发扩容。:新桶数组的大小通常是旧桶数组的两倍。:扩容时,指向旧桶数组的指针。

2025-02-06 09:40:32 364

原创 Go之map的比较

在 Go 中,比较两个map是否相等需要手动实现逻辑或使用手动实现:通过检查长度、键和值是否相等,适用于简单的map,性能更高。:适用于复杂类型的比较,代码更简洁,但可能有性能开销。

2025-02-06 09:39:59 381

原创 提示词写作指南:如何更快让 AI 理解需求

清晰的任务描述:直接表达你希望执行的操作。提供范例:通过示例或模板帮助 AI 理解输出要求。设定风格或语气:影响内容的情感表达和语气。分步提示:将复杂任务拆分为多个步骤,逐步执行。设定输出格式:明确输出的结构,确保条理清晰。字数或时间限制:控制输出内容的长度和深度。关键词或要素列表:确保 AI 不遗漏任何重要内容。任务优先级:强调最重要的部分,确保任务重点突出。

2025-02-05 14:03:27 958

原创 AI 提示词(Prompt)写作学习文档

写好 AI 提示词的关键在于明确性上下文的提供以及任务的精细描述。通过学习并掌握不同类型提示词的写作技巧,你将能够更高效地与 AI 互动,获得更符合需求的输出。

2025-02-05 13:53:32 764

原创 Go之map的比较

在 Go 中,比较两个map是否相等需要手动实现逻辑或使用手动实现:通过检查长度、键和值是否相等,适用于简单的map,性能更高。:适用于复杂类型的比较,代码更简洁,但可能有性能开销。根据具体需求选择合适的方法,可以更好地平衡代码的可读性和性能。

2025-01-23 00:15:00 307

原创 Go之interface的比较

在 Go 中,两个interface底层类型是否相同:如果底层类型不同,则不能比较。值是否相等:如果底层类型相同且值相等,则比较结果为true。nil的处理:如果其中一个interface值为nil,则需要特别处理。可比较的类型:如果底层值是不可比较的类型(如切片、映射、通道),则不能直接比较。为了安全地比较interface值,建议使用类型断言或类型切换来处理具体的底层类型。

2025-01-23 00:00:00 407

原创 Go之高效拼接字符串

拼接大量字符串:推荐使用或。拼接少量字符串:可以使用操作符或。需要格式化字符串:使用。

2025-01-22 00:15:00 871

原创 Go 中 defer 的底层数据结构和特性

defer的底层实现依赖于_defer结构体和 Goroutine 的链表。defer的执行遵循 LIFO 原则,最近声明的defer会最先执行。defer的参数在声明时计算,而具名返回值可以在defer中被修改。defer与panic和recover结合,可用于异常处理。理解defer的底层实现和特性,可以帮助你更好地使用它来管理资源、处理异常和简化代码逻辑。希望以上内容能帮助你深入理解 Go 中defer的底层实现和特性。

2025-01-22 00:00:00 257

原创 Go 中单引号、双引号和反引号的区别

标记类型特点单引号rune表示单个 Unicode 字符,类型为runeint32的别名)。双引号string表示字符串,支持转义字符,不可变,默认 UTF-8 编码。反引号string表示原始字符串,内容不会转义,支持多行文本,不可变。希望以上内容能帮助你更好地理解 Go 中单引号、双引号和反引号的区别和使用场景。

2025-01-21 13:48:06 510

原创 Go 中的 defer:执行顺序、修改返回值的时机及注意事项

defer的执行顺序为后进先出(LIFO)。defer在return之后执行,但在返回值被传递给调用方之前。defer可以修改命名返回值,但无法修改无命名返回值。在defer中可以捕获panic并使用recover恢复程序。defer的参数在声明时求值,而不是在执行时。理解defer的这些特性,可以帮助你更好地利用它进行资源管理和错误处理。

2025-01-21 13:43:02 645

原创 Go 语言中 for range 与闭包的陷阱及详细解释

闭包是一个函数和其周围的状态(词法环境)的组合。在 Go 中,闭包通常是指一个匿名函数,它可以捕获外部变量的值。例如:go复制在上述代码中,makeAdder返回了一个闭包,该闭包捕获了变量base,并可以在后续调用中使用它。在for range循环变量的作用域:循环变量的作用域是整个循环体,闭包捕获的是变量的引用,而不是值。陷阱表现:所有闭包可能捕获的是同一个变量的最终状态,而不是每次迭代时的值。解决方法在循环中创建局部变量副本。使用索引访问原始集合的元素。使用立即执行的闭包捕获当前值。

2025-01-21 11:56:42 699

原创 Go 语言中 for range 的地址变化分析

在for range中,循环变量是原始元素的副本,其地址可能在每次迭代时相同(Go 1.22 之前)或不同(Go 1.22 之后)。循环变量的地址与原始集合中元素的地址始终不同。在涉及取地址或闭包时,需特别注意循环变量的地址特性,以避免潜在的陷阱。

2025-01-21 11:47:16 399

原创 Go 语言中 Slice 和 Array 的区别

定义array是一个固定长度的序列,长度在声明时确定,且不可改变。声明方式go复制var arr [5]int // 定义一个长度为5的整型数组特点长度固定,一旦声明,长度不可更改。在内存中连续存储,可以使用索引快速访问元素。如果需要固定长度的序列且对性能要求极高,推荐使用array。如果需要动态调整长度的序列,推荐使用slice,其灵活性和强大的功能更适合大多数场景。

2025-01-21 11:35:45 651

原创 编程语言“鄙视链”背后的真相

编程语言的“鄙视链”现象,虽然源于语言特性和历史背景,但其背后反映的更多是程序员们对技术的偏见与认同。在团队协作中,如何化解语言间的误解与矛盾,是每个开发者需要面对的挑战。而从行业发展的角度看,“鄙视链”既促进了技术的多元化发展,也可能在某种程度上限制了创新。只有打破这种偏见,才能真正推动编程技术的进步。无论你偏爱哪种编程语言,最终的目标都是让技术为人类带来更多的便利与可能。

2025-01-20 17:57:52 425

原创 技术领导力:从代码执行者到团队掌舵人

技术领导力是指在技术领域中,通过自身的专业知识、技术能力和管理技巧,带领团队实现目标的能力。它不仅包括对前沿技术的掌握和应用,还涵盖了团队管理、沟通协作、战略规划等多方面的能力。具有技术领导力的程序员,不仅能够解决复杂的技术问题,还能通过有效的方式激励团队成员,推动项目的顺利进行。技术领导力是程序员职业发展的重要方向,它不仅能够提升个人的职业竞争力,还能为团队和公司带来更大的价值。

2025-01-20 17:47:07 606

原创 MySQL性能简介及优化方法

MySQL 是一种免费开源的兼席 SQL 数据库管理系统。它以快速的架构和高效的数据操作而水平应用场景。

2025-01-09 18:49:46 364

原创 Mysql-CHAR和VARCHAR详解

是两种用于存储字符串的字段类型,它们的主要区别在于存储方式、长度限制、性能和用途。如果字符串长度小于定义的长度,系统会在右侧用空格填充(用于存储),但检索时会去掉填充的空格。存储空间利用率更高,只占用实际字符所需的字节数,加上 1 或 2 个字节的长度信息。在存储和检索时自动去除尾部的填充空格,可能会导致某些情况下的数据不一致问题。会固定分配指定长度的存储空间,无论实际存储的字符串长度是多少。:适用于长度不固定的字符串,比如文章内容、用户输入的备注等。如果定义的长度小于实际存储数据长度,数据会被截断。

2025-01-09 16:46:21 831

原创 GoLand 中 Tabnine 插件的使用教程

Tabnine 是一款基于人工智能的代码补全工具,支持多种语言和集成开发环境(IDE)。在 GoLand 中安装并使用 Tabnine,可以显著提升代码编写效率,提供智能代码补全建议。

2025-01-09 00:15:00 2210

原创 Golang基础-原子操作和锁区别

是无锁的,适用于简单的数据操作,能够提供较高的性能。它适合于一些简单的计数、标志位的修改,适用于高并发且对性能要求较高的场景。

2025-01-08 00:30:00 551

原创 Golang基础-GC

Go 语言的 垃圾回收(GC) 是自动管理内存的重要机制,负责清理不再使用的内存,以避免内存泄漏。Go 的垃圾回收器采用的是 标记-清除(Mark-Sweep) 算法,配合 分代回收(Generational GC) 和 并发回收 等优化措施,旨在保证高效且最小化暂停时间。以下是对 Go 垃圾回收的详细介绍,包括工作原理、算法细节、性能优化等方面。Go 语言的垃圾回收设计目标是:低暂停时间:尽量避免长时间的暂停,以提高应用程序的响应性和实时性。并发执行:GC 不应该阻塞应用程序的执行,尽可能与程序并发运行。

2025-01-08 00:15:00 791

原创 Golang基础-GC性能优化

Go 语言的垃圾回收机制通过标记-清除算法、并发回收和增量回收等手段,尽量减少了 GC 对程序性能的影响,并通过。

2025-01-08 00:15:00 616

原创 Golang基础-浅聊内存泄漏

尽管 Go 的垃圾回收机制可以有效地管理内存,但开发者仍然需要注意避免内存泄漏,特别是在涉及指针引用、缓存、长时间运行的 goroutine 和系统资源时。通过合理的内存管理、定期清理和监控内存使用情况,能够有效地避免内存泄漏问题。如果你在使用 Go 时遇到了内存泄漏问题,建议使用 Go 提供的性能分析工具(如。

2025-01-08 00:15:00 1048

原创 Golang基础-GC三色标记法

三色标记法是垃圾回收算法中的一种高效的标记方式,它通过将对象分为白色、灰色、黑色来区分对象的状态,从而确保并发环境下的内存管理。Go 从1.5 版本开始采用三色标记法,并结合并发标记和清理,避免了传统 GC 的停止世界问题,使得 GC 停顿时间大大减少,应用程序性能得到了提升。不同的 Go 版本不断优化 GC 的并发性和效率,尤其是在Go 1.11和之后的版本,GC 变得更加高效和精细。

2025-01-08 00:15:00 1220

原创 Golang之Kafka的应用

在 Golang 中,Kafka 是一个常用的分布式消息队列,可以通过社区支持的库(如sarama和)进行操作。以下是 Kafka 在 Golang 中的使用详细介绍,包括生产者、消费者、和高级功能。librdkafka以下内容以为例。

2025-01-08 00:15:00 703

原创 Golang基础-sync.Pool介绍和用法

sync.Pool是 Go 标准库中提供的一种对象池(Object Pool)机制,主要用于。它通过维护一个对象池,允许多个 goroutine 重用这些对象,而不是每次都进行内存分配。这有助于减少内存分配和垃圾回收的开销,提高程序的性能,尤其是在频繁创建和销毁对象的场景中。sync.Poolsync.PoolGet():从池中获取一个对象。如果池中没有对象,则会调用New函数(如果提供了)来生成一个新对象。Put():将对象放回池中,以便后续复用。sync.Pool​。

2025-01-08 00:00:00 1110

原创 Golang基础-mutex的正常模式和饥饿模式1

为了解决了等待goroutine队列的长尾问题饥饿模式下,直接由unlock把锁交给等待队列中排在第一位的goroutine (队头),同时,饥饿模式下,新进来的goroutine不会参与抢锁也不会进入自旋状态,会直接进入等待队列的尾部。对于两种模式,正常模式下的性能是最好的,goroutine可以连续多次获取锁,饥饿模式解决了取锁公平的问题,但是性能会下降,这其实是性能和公平的一个平衡模式。的实现中,当一个 goroutine 获取了锁时,其他请求锁的 goroutine 会被阻塞,直到锁被释放为止。

2025-01-07 01:00:00 1019

Golang之敏感词过滤器的设计与实现

通过资源中的示例,开发者可以快速理解并应用敏感词过滤器,同时结合实际需求灵活调整和优化功能。

2025-01-03

Golang之相似图片检测-感知哈希算法

源码示例

2025-01-02

基于MFC的计算器程序

这个是在实验中写的应用,在界面点击数字可以进行加减乘除等运算

2018-11-30

VS2010聊天室的开发

学习过程当中的小实验~使用时,任选一个运行的终端作为服务器,其余的用户终端都在这个服务器的协调下交换信息

2017-12-19

空空如也

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

TA关注的人

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