docker部署mysql中文乱码,修改两处字符集解决问题

这篇文章记录了一次大数据报表导出的优化实践。业务需求要求一次性导出10万条数据到Excel,最初采用全表扫描配合OFFSET分页,单次导出耗时超过30秒。经过分析慢查询日志,发现主要瓶颈在SQL层面和Excel写入方式。优化过程包括:只查询必要字段、去除无效条件、并发分片查询、流式写入Excel、最后引入游标分页避免大OFFSET扫描。最终导出耗时降至8秒。本文总结了SQL调优、分页策略以及大规模数据导出的关键经验。

在浮躁与内卷的社会中,保持专注与冷静,缓慢向上,也是最难得的成长勇气。

这篇文章记录了我在学习极客时间大明老师课程后,对 Redis 在 Go 项目中的实践总结。从初始化 Redis 客户端,到在仓储层引入缓存模块,再到结合 DDD 思想实现数据查询与缓存的解耦,逐步形成了更优雅的使用方式。

反射是程序在运行时动态访问、检测和修改自身状态的能力,通过反射可以获取类型信息、调用方法或修改字段值。在Go语言中,反射由reflect包实现,核心是reflect.Type(类型接口)和reflect.Value(值结构体),分别对应接口的类型和值部分。反射常用于序列化、ORM框架等场景,但存在性能开销大、代码可读性差、破坏封装性等缺点。优化方法包括缓存反射结果、减少高频调用或使用替代方案(如泛型)。反射适合框架开发等动态需求场景,但业务代码中应谨慎使用

Timer 用于一次性计时,可通过 C 通道接收时间;AfterFunc 用于异步回调,不通过 C 通道;Ticker 用于周期性计时;select 多个就绪 case 随机选择,break 仅退出当前块

Go语言的context包是并发编程的核心工具,主要用于管理goroutine的生命周期、传递取消信号和请求范围数据。通过WithCancel、WithTimeout、WithDeadline和WithValue等方法,可以从根context派生出子context,形成树状结构,实现优雅的协程控制和超时管理。context广泛应用于HTTP请求、数据库操作等场景,确保资源及时释放,避免泄漏。最佳实践包括及时调用cancel()、避免滥用WithValue传递业务参数,以及在goroutine中监听ctx.Done()以响应取消信号

本项目基于 Gin + GORM + MySQL + Redis,实现了一个简单的用户登录注册系统,核心功能包括 JWT 鉴权与 Redis 用户缓存。用户登录成功后签发 JWT,访问受保护接口时通过中间件校验 Token,有效提升接口安全性。用户资料优先从 Redis 获取,未命中则回源数据库并写入缓存,兼顾性能与一致性,适合作为入门级全栈身份认证系统的学习案例。

Go 中的 `panic` 会导致当前 goroutine 崩溃,若未被 `recover` 捕获,则程序终止。`recover` 需配合 `defer` 使用,只能捕获**当前 goroutine** 内的 panic。若 panic 发生在子 goroutine 中,主 goroutine 的 `recover` 无法捕获,程序仍会崩溃,因此每个 goroutine 内需单独设置 `defer+recover` 才能防止异常扩散。

本文介绍了一个适用于单机模块的 Go 语言事件总线(Eventbus)实现,用于异步事件的发布与订阅。通过 map[string]*EventChans 管理事件与多个通道的映射关系,并结合读写锁 sync.RWMutex 保证并发安全,实现了 Subscribe、UnSubscribe、Publish 三个核心方法,展示了如何安全高效地进行事件分发。适合 Go 初学者理解 channel 和并发控制。
