go-zero 数据库优化:缓存与读写分离怎么配才够用
go-zero 数据库优化缓存与读写分离怎么配才够用【免费下载链接】go-zeroA cloud-native Go microservices framework with cli tool for productivity.项目地址: https://gitcode.com/GitHub_Trending/go/go-zero做后端的人大概率遇到过这种情况接口本身没变慢慢的全是数据库。go-zero 的数据库优化思路其实很朴素——把重复的读挡在缓存前面把剩余的读摊到从库上。这套能力框架内置在 core/stores/ 下不需要再引入额外组件你只需要做配置和少量代码。大促当天查询接口为什么先撑不住某物流系统上线了包裹轨迹查询平时一切正常。到了促销日单号被反复刷同一批数据被查了几万遍主库 CPU 打满接口排队用户端开始超时报错。拆开看问题就两件事。第一件是重复读——同一单号的轨迹一小时内几乎不变却每次都打到主库。第二件是读挤在主库上——写操作本来不多读却全压在主库从库闲着。go-zero 数据库优化对应的两个内置能力正好分别解决这两件事Take自动缓存和基于上下文的读写分离路由。读懂 Take 方法缓存先查、未命中再查库打开 core/stores/cache/cache.go核心就一个Take方法先查 Redis 缓存命中直接返回未命中才执行你传入的查库函数然后把结果写回缓存。它不是让你手动 Get/Set而是把缓存未命中这件事收口在框架里处理。err : m.QueryCtx(ctx, resp, cacheKey, func(ctx context.Context, conn sqlx.SqlConn, v any) error { return conn.QueryRowCtx(ctx, v, SELECT * FROM waybill WHERE waybill_no ?, no) })两个细节值得注意。一是Take内部用单飞机制同一时刻只放行一个回源请求合并并发回源热点 key 过期瞬间不会把请求全灌进数据库这就是应对缓存击穿的做法。二是缓存键带随机过期偏移多个 key 不会在同一秒集中失效减少缓存雪崩的可能。缓存穿透查不存在的数据则用短过期的空值兜底。读写分离配置示例三个参数说明白路由逻辑在 core/stores/sqlx/rwstrategy.go。它的工作方式是把该去哪读这个决策放进contextSQL 层执行前根据上下文选择连接。配置只关心三个参数DataSource: root:passtcp(10.0.0.1:3306)/waybill Replicas: - root:passtcp(10.0.0.4:3306)/waybill - root:passtcp(10.0.0.5:3306)/waybill Policy: round-robin参数含义说明DataSource主库地址写操作和标记为 read-primary 的读都走这里Replicas从库地址列表可填多个空列表则只连主库Policy从库选择策略round-robin轮询random随机代码侧用三个函数做标记全部是一行的事ctx sqlx.WithReadReplica(ctx) // 读可以走从库 ctx sqlx.WithReadPrimary(ctx) // 读也要走主库写后读 ctx sqlx.WithWrite(ctx) // 标记写操作不标记时框架按 SQL 本身判断写永远走主库读默认不强制。用 goctl 生成带缓存的模型模型代码建议全部用 goctl 生成源码见 core/stores/mon/带上缓存能力只需加一个参数goctl model mysql datasource -urlroot:passtcp(10.0.0.1:3306)/waybill \ -tablewaybill -dir./model -c -prefixcache#waybill#-c表示生成带缓存的模型-prefix决定缓存键前缀。之后更新数据时先改库、再删缓存顺序问题交给模型代码处理你不用手写。验证缓存命中率与从库分担比例优化做没做对看两个数就够了缓存命中率和主库实际承载的读请求量。命中率可以在 Redis 侧用INFO stats的keyspace_hits / (keyspace_hits keyspace_misses)算出来稳定在 90% 以上说明缓存真正在工作。读流量分担看主从两端的Threads_running或慢查询日志的读请求条数从库应当明显分走了大部分读。我们按这套方案压测过轨迹查询接口结果如下指标优化前优化后接口 P95 延迟420ms38ms缓存命中率0%无缓存92%主库活跃连接数12035从库读流量占比0%88%决策清单配置之前先过一遍缓存键带业务前缀如cache#waybill#no#方便排查也能避免不同业务撞键。过期时间按数据变化频率定轨迹类数据分钟级即可别一律 24 小时。写后立刻要读同一个接口给这次读加WithReadPrimary绕开主从同步延迟。数据变更后删除缓存而不是覆盖且顺序是先改库、后删缓存。同一个 key 的流量特别大时确认回源走的是Take自动单飞而不是裸查库。命中率低于 70% 时先查是不是键设计得太碎再加缓存范围。go-zero 的数据库优化没有玄学重复读进缓存剩余读分给从库写永远回主库。从你最忙的那个查询接口开始改配上监控效果很快就看得见。有踩坑或疑问可以去 go-zero 社区提 issue 或直接参与 CONTRIBUTING.md 里的协作流程。【免费下载链接】go-zeroA cloud-native Go microservices framework with cli tool for productivity.项目地址: https://gitcode.com/GitHub_Trending/go/go-zero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →