当前位置: 首页 > news >正文

高性能 Go 语言带 TTL 的内存缓存实现:精确过期、自动刷新、并发安全

在高并发服务开发中,内存缓存是提升性能的关键组件。而支持自动过期(TTL) 的缓存更是常见需求。本文将介绍一种基于 Go 语言实现的高性能、并发安全、支持过期时间自动刷新的内存缓存方案,并附完整源码、测试用例及性能分析。

🎯 设计目标

  • 所有条目使用统一的全局 TTL(Time-To-Live)
  • Set(key, value) 会重置该 key 的过期时间
  • 过期后自动删除,无需手动清理
  • 并发安全:支持多 goroutine 同时读写
  • 高性能:读操作零分配,写操作开销可控
  • 精确过期:避免"提前误删"或"延迟删除"

🧠 核心思路:为每个 Key 绑定独立 Timer

传统方案常使用后台协程轮询 + 堆(heap)管理过期时间,但存在两个问题:

  1. 同一个 key 多次 Set 会导致堆中冗余项;
  2. 旧的过期计划可能误删刚被刷新的 key。

我们采用更简洁、精确的方案:

每次 Set 时,为该 key 启动一个 time.Timer,在 TTL 后自动删除。若 key 被再次 Set,则取消旧 Timer,启动新 Timer。

Go 的 time.Timer 由 runtime 高效管理,轻量且精确,非常适合此场景。

📦 完整源码 (cache.go)

// cache.go
package timecacheimport ("sync""time"
)// Cache is a thread-safe in-memory cache with fixed TTL.
type Cache[T any] struct {items  map[string]Ttimers map[string]*time.Timermu     sync.RWMutexttl    time.Duration
}// NewCache creates a new cache with the given TTL.
// Panics if ttl <= 0.
func NewCache[T any](ttl time.Duration) *Cache[T] {if ttl <= 0 {panic("TTL must be positive")}return &Cache[T]{items:  make(map[string]T),timers: make(map[string]*time.Timer),ttl:    ttl,}
}// Set stores a value and resets its expiration timer.
func (c *Cache[T]) Set(key string, value T) {c.mu.Lock()defer c.mu.Unlock()// Cancel existing timer if anyif timer, exists := c.timers[key]; exists {timer.Stop()delete(c.timers, key)}// Store valuec.items[key] = value// Schedule expirationtimer := time.AfterFunc(c.ttl, func() {c.mu.Lock()defer c.mu.Unlock()// Double-check existence to avoid raceif _, exists := c.items[key]; exists {delete(c.items, key)// timers[key] already deleted above, but safe to double-delete}})c.timers[key] = timer
}// Get returns the value if it exists and has not expired.
func (c *Cache[T]) Get(key string) (T, bool) {c.mu.RLock()defer c.mu.RUnlock()if val, ok := c.items[key]; ok {return val, true}var zero Treturn zero, false
}// Delete removes a key immediately and cancels its timer.
http://www.dtcms.com/a/490746.html

相关文章:

  • ML.NET机器学习框架基本流程介绍
  • Day32_【 NLP _2.RNN及其变体 _(2) LSTM】
  • 重庆建站模板代理怎么做p2p网站
  • iis配置网站是什么网站建设方案书阿里云模板
  • 【计算机视觉】SAM 3 技术深潜:从“分割万物”到“理解概念”的范式转移
  • 「深度学习笔记3」概率论深度解析:从不确定性到人工智能的桥梁
  • 齐河专业企业网站建设做网站引流到天猫
  • 技术贴!【谷歌浏览器】实用工具推荐之谷歌浏览器(Google Chrome)离线纯净版完全安装指南:告别广告与捆绑骚扰
  • Centos7 自建Umami-开源免费的网站访问流量统计分析平台
  • 申威架构安装Java 11 RPM包教程:java-11.0.7-swjdk-11u-8.ky10.sw_64.rpm详细安装步骤
  • 【STM32项目开源】基于STM32的人体健康监测系统
  • 一个做礼品的网站国外网站用什么dns
  • 东莞 网站建设网站定制制作公司
  • Python 线程 类比c++【python】
  • 舆情监测的底层逻辑与技术方法探析
  • 谈谈redis的持久化
  • 网站建设进度深圳网站建设制作营销
  • SSM高校学生社团管理系统n4pcu(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 强化学习_Paper_2000_Eligibility Traces for Off-Policy Policy Evaluation
  • Kubernetes秘钥与配置管理全解析
  • Python 匿名函数、map、filter、sort 用法详解
  • wordpress 4.0 伪静态seo优化一般优化哪些方面
  • 上海自助模板建站wordpress被黑
  • 数据可视化延迟实时大屏优化:WebSocket增量传输+Canvas渲染数据延迟压缩至300ms
  • TimerFd Epoll
  • 百度网盘怎么实现不限速的高速下载?
  • UltraEdit做网站教程定制开发网站如何报价单
  • 《彻底理解C语言指针全攻略(5)--指针和函数专题》
  • 广州做网站找哪个公司好建设网络道德教育网站不包括
  • TUP及ESOP动态股权激励:算法是核心