ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Go 缓存设计与实战:本地、分布式、热点三态全攻略

Go 缓存设计与实战:本地、分布式、热点三态全攻略 Go 缓存设计与实战本地、分布式、热点三态全攻略性能优化离不开缓存。本文从本地 LRU 到分布式 Redis最后讲 Bloom Filter hot key 防护。一、本地缓存LRUimportgithub.com/hashicorp/golang-lru/v2cache:lru.New[int,string](1024)cache.Add(42,tom)v,ok:cache.Get(42)优势性能卓越实现简单劣势进程内多实例需要外部同步二、Cache Aside 模式funcGet(uidstring)(User,error){ifv,ok:cache.Get(uid);ok{returnv.(User),nil}u,err:repo.Find(uid)iferr!nil{returnUser{},err}cache.Add(uid,u)returnu,nil}失效写时 delete 而不是 update避免并发写覆盖。三、Memcached vs Redis维度MemcachedRedis性能高高数据结构单一 KV多种分布式客户端 shardingCluster / Sentinel持久化不支持支持内存管理slab多种四、Redis 多级缓存Client → App LRU → Redis → DB五、热点 key 防护importgithub.com/golang/groupcache/singleflightg:singleflight.Group{}v,_,_:g.Do(user/42,func()(interface{},error){returnloadUser(42)})singleflight 让同 key 同时只走一次下游。六、Bloom Filter 防穿透importgithub.com/bits-and-blooms/bloom/v3f:bloom.NewWithEstimates(1000000,0.01)f.AddString(user:42)if!f.TestString(user:999){returnErrNotFound}8MB 内存可放 100 万 key错率 1%。七、缓存穿透 / 击穿 / 雪崩现象原因策略穿透大量 null 查询bloom filter cache null击穿热点 key 失效singleflight mutex雪崩多 key 同时失效TTL 抖动 后台刷新八、TTL 设计importmath/randttl:30*time.Minutetime.Duration(rand.Intn(300))*time.Second cache.Add(key,value,ttl)错开 0-5 min避免集中失效。九、热点统计keyCounter:sync.Map{}forkey:rangerequests{cntObj,_:keyCounter.LoadOrStore(key,new(atomic.Int64))cntObj.(*atomic.Int64).Add(1)}// 1000 内高频 → 进入热点缓存Redis 4 提供 hotkey 探测能力。十、企业实战电商商品缓存维度数据商品详情Redis hash 1k QPS库存Redis string 5w QPS推荐Redis sorted set十一、踩坑清单大数据大 Value超过 1MB 都会拖慢 Redis集中失效雪崩冷数据却用 Memcached——浪费内存十二、未来Video / Multimedia cache 服务高级 Cachealigned-colocation 模式AI 助手自动分配 TTL 与驱逐策略十三、总结与展望缓存是性能优化的快键但错误的缓存策略反而增加复杂度。未来缓存将向自适应方向发展业务只声明 SLO平台决定 TTL 与策略。十四、参考文献Redis 官方文档Memcached 文档bloom/redis-cache 项目
返回列表