golang支持线程安全和自动过期map
在 Golang 中,原生的 map 类型并不支持并发安全,也没有内置的键过期机制。不过,有一些社区提供的库和方案可以满足这两个需求:线程安全和键过期。
1. 使用 sync.Map(线程安全,但不支持过期)
Golang 提供了线程安全的 sync.Map,但它没有键过期功能。如果只需要线程安全,可以直接使用:
import ("fmt""sync"
)func main() {var m sync.Mapm.Store("key1", "value1") // 写入键值val, ok := m.Load("key1") // 读取键值if ok {fmt.Println("key1:", val)}m.Delete("key1") // 删除键值
}
限制:
sync.Map适用于高并发场景,但需要自行实现键的过期功能。
2. 使用开源库 go-cache(推荐:支持线程安全和键过期)
go-cache 是一个轻量级、高效的内存缓存库,支持线程安全和键过期功能。
安装
go get github.com/patrickmn/go-cache
使用示例
package mainimport ("fmt""time""github.com/patrickmn/go-cache"
)func main() {// 创建一个缓存对象,默认过期时间为 5 分钟,清理间隔为 10 分钟c := cache.New(5*time.Minute, 10*time.Minute)// 设置键值,并指定过期时间c.Set("key1", "value1", cache.DefaultExpiration) // 默认过期时间c.Set("key2", "value2", 10*time.Second) // 自定义过期时间// 读取键值val, found := c.Get("key1")if found {fmt.Println("key1:", val)} else {fmt.Println("key1 has expired or not found")}// 检查键是否存在_, exists := c.Get("key2")fmt.Println("key2 exists:", exists)// 删除键c.Delete("key2")
}
特点
- 线程安全。
- 支持键过期,自动清理。
- 提供多种方法(如读取、删除、批量操作等)。
3. 使用 expiremap(支持自动过期和并发安全)
expiremap 是另一个简洁的库,专门为自动过期的键值存储设计。
安装
go get github.com/zyedidia/expiremap
使用示例
package mainimport ("fmt""time""github.com/zyedidia/expiremap"
)func main() {// 创建一个过期 map,键值过期时间为 2 秒m := expiremap.New(time.Second * 2)// 设置键值m.Set("key1", "value1")m.Set("key2", "value2")// 读取键值val, ok := m.Get("key1")if ok {fmt.Println("key1:", val)} else {fmt.Println("key1 has expired or does not exist")}// 等待 3 秒后,键值会自动过期time.Sleep(3 * time.Second)_, ok = m.Get("key1")fmt.Println("key1 exists after 3 seconds:", ok)
}
特点
- 键过期时间由
time.Duration控制。 - 自动清理过期键。
- 支持线程安全。
4. 自己实现一个安全且支持过期的 map
如果你不想使用外部库,可以结合 sync.RWMutex 和 time.Timer 自行实现:
示例代码
package mainimport ("fmt""sync""time"
)type SafeMap struct {data map[string]anymutex sync.RWMutex
}func NewSafeMap() *SafeMap {return &SafeMap{data: make(map[string]any),}
}func (sm *SafeMap) Set(key string, value any, duration time.Duration) {sm.mutex.Lock()defer sm.mutex.Unlock()sm.data[key] = value// 启动一个定时器删除键go func() {time.Sleep(duration)sm.mutex.Lock()delete(sm.data, key)sm.mutex.Unlock()}()
}func (sm *SafeMap) Get(key string) (any, bool) {sm.mutex.RLock()defer sm.mutex.RUnlock()val, ok := sm.data[key]return val, ok
}func (sm *SafeMap) Delete(key string) {sm.mutex.Lock()defer sm.mutex.Unlock()delete(sm.data, key)
}func main() {sm := NewSafeMap()sm.Set("key1", "value1", 5*time.Second) // 设置 5 秒过期val, ok := sm.Get("key1")fmt.Println("key1 exists:", ok, "value:", val)// 等待 6 秒,确保键已过期time.Sleep(6 * time.Second)val, ok = sm.Get("key1")fmt.Println("key1 exists after expiration:", ok)
}
特点
sync.RWMutex确保并发安全。- 使用
time.Timer实现键过期。
总结
- 如果需要简单易用的解决方案,推荐使用
go-cache。 - 如果你需要更轻量的库,
expiremap是一个好选择。 - 对于特定需求,可以自行实现线程安全的
map,结合定时器实现过期功能。
相关文章:
golang支持线程安全和自动过期map
在 Golang 中,原生的 map 类型并不支持并发安全,也没有内置的键过期机制。不过,有一些社区提供的库和方案可以满足这两个需求:线程安全和键过期。 1. 使用 sync.Map(线程安全,但不支持过期) Go…...
机器学习之RLHF(人类反馈强化学习)
RLHF(Reinforcement Learning with Human Feedback,基于人类反馈的强化学习) 是一种结合人类反馈和强化学习(RL)技术的算法,旨在通过人类的评价和偏好优化智能体的行为,使其更符合人类期望。这种方法近年来在大规模语言模型(如 OpenAI 的 GPT 系列)训练中取得了显著成…...
泷羽sec---shell作业
作业一 写计算器 使用bc命令 需要进行安装bc 代码如下: #!/bin/bash echo "-----------------------------------" echo "输入 f 退出" echo "可计算小数和整数" echo "用法如:1.12.2" echo "------…...
华为海思2025届校招笔试面试经验分享
目前如果秋招还没有offer的同学,可以赶紧投递下面这些公司,都在补招。争取大家年前就把后端offer拿下。如果大家在准备秋招补录取过程中有任何问题,都可以私信小编,免费提供帮助。如果还有部分准备备战春招的同学,也可…...
摆脱复杂配置!使用MusicGPT部署你的私人AI音乐生成环境
文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 今天给大家分享一个超酷的技能:如何在你的Windows电脑上快速部署一款文字生成音乐的AI创作服务——MusicGPT,并且通过cpolar内网穿透工具&…...
嵌入式Linux中的GPIO编程
GPIO(General Purpose Input Output)是嵌入式系统中非常常见的一种硬件资源,它允许开发者直接控制微处理器或微控制器的引脚。通过设置这些引脚的状态,可以实现对硬件设备的控制,如LED灯的开关、传感器数据的读取等。 …...
js:函数
函数 函数:实现抽取封装,执行特定任务的代码块,方便复用 声明 函数命名规范 尽量小驼峰 前缀应该为动词,如getName、hasName 函数的调用 函数体是函数的构成部分 函数传参 参数列表里的参数叫形参,实际上写的数据叫实…...
低代码平台审批流程设计
审批流程设计 在此界面设置审批单从发起、到审批、再到结束的流转步骤。 6.1 添加节点 点击两个节点间连线的 图标可添加 审批人、抄送人、办理人、条件分支。 6.2 节点类型 提交节点 点击提交节点,可在右侧弹窗中设置提交节点的抄送人,实现审批在发…...
OpenCV相机标定与3D重建(8)相机标定函数calibrateCamera()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 从校准图案的多个视图中找到相机的内参和外参参数. cv::calibrateCamera 是 OpenCV 中用于相机标定的一个非常重要的函数。它通过一系列已知的世…...
Linux信号量的编程
一,用信号量来实现是父进程先进行,还是子进程先进性 信号量的没有P,V操作之前,我们不知道如何控制: #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h>…...
“Yaker,你可以全局配置插件环境变量!“
周四周四,Vme50(bushi 大家好,这里是疯狂超级牛(功能上新版) 经常有用户问 “牛牛如何为不同插件配置相同的变量值呢?” “能有一个一波搞定插件变量的方式就好了” 超级牛听到了广大用户的声音,默默地拿起…...
SAAS美容美发系统架构解析
随着技术的不断发展,SAAS(Software as a Service,软件即服务)模式在各个行业的应用逐渐深化,美容美发行业也不例外。传统的美容美发店面通常依赖纸质记录、手动操作和复杂的管理流程,而随着SAAS平台的出现&…...
如何为 ext2/ext3/ext4 文件系统的 /dev/centos/root 增加 800G 空间
如何为 ext2/ext3/ext4 文件系统的 /dev/centos/root 增加 800G 空间 一、引言二、检查当前磁盘和分区状态1. 使用 `df` 命令检查磁盘使用情况2. 使用 `lsblk` 命令查看分区结构3. 使用 `fdisk` 或 `parted` 命令查看详细的分区信息三、扩展逻辑卷(如果使用 LVM)1. 检查 LVM …...
vscode远程连接ssh
一. 使用vscode里的ssh查件连不上远程的解决方法 删除Windows上的known_host文件,该文件会在连接之后自动生成,用于验证远程服务器的身份。 konwn_host和id_rsa,id_rsa.pub的关系 (1)konwn_host用于客户端验证远程服务…...
智慧防汛平台在城市生命线安全建设中的应用
随着城市化进程的加快,城市基础设施的复杂性和互联性不断增强,城市生命线的安全管理面临前所未有的挑战。智慧防汛平台作为城市生命线安全建设的重要组成部分,通过现代信息技术提升城市防汛应急管理的智能化水平,保障城市安全。 …...
python实现TCP Socket控制测试仪器
python实现TCP Socket控制测试仪器 说明前提条件代码 说明 本例是用python实现TCP Socket,最终目的是为了控制LCR电容测试仪器。 前提条件 测试仪器 配备了以太网接口,支持TCP/IP协议栈 用户可以通过IP地址和端口号连接到仪器,建立TCP通信…...
51c自动驾驶~合集38
我自己的原文哦~ https://blog.51cto.com/whaosoft/12358456 #GaussianPretrain 万能3D高斯预训练表示!爆拉3D检测、Occ、高精地图等四大任务! 受Tesla的技术的推动,越来越多的厂商开始走"纯视觉"的路线,多数方案还…...
电脑显示器拔插DVI线后副屏不显示
问题:台式机副屏显示器插拔DVI线后副屏无法检测到,不显示 其他现象:电脑设备管理器“显示适配器”中只有独显,未显示集显。 尝试方法: 1、 重新插拔并拧紧DVI线、更换DVI线、将DVI线替换为VGA线、调换DVI线及VGA线两…...
Bash脚本常用命令
1.Bash常用快捷键 2.通配符 3.Bash其他特殊符号 4.位置参数 5.预定义变量 6.常用变量比较 7.基础正则表达式 8.文件类型判断 9.文件权限判断 10.整数比较命令 11.字符串判断 其他常用参考: https://zhuanlan.zhihu.com/p/748857250...
《Unity Shader 入门精要》高级纹理
立方体纹理 图形学中,立方体纹理(Cubemap)是环境映射(Environment Mapping)的一种实现方法。环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了层金属一样反射出周围的环境。 对立…...
【递归算法】全排列 Ⅱ
题目链接 文章摘要: 本文解析了LeetCode上"全排列II"问题,要求在包含重复数字的数组中返回所有不重复的全排列。通过分析决策树,指出需在标准全排列解法基础上增加剪枝策略,避免重复结果。详细讲解了两种剪枝思路&#…...
专业级视频对比分析工具:video-compare的技术架构深度解析
专业级视频对比分析工具:video-compare的技术架构深度解析 【免费下载链接】video-compare Split screen video comparison tool using FFmpeg and SDL2 项目地址: https://gitcode.com/gh_mirrors/vi/video-compare 在视频编码质量评估、算法效果验证和媒体…...
英雄联盟智能助手完全指南:3分钟掌握LCU API自动化工具
英雄联盟智能助手完全指南:3分钟掌握LCU API自动化工具 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟…...
嵌入式软件开发规范与最佳实践指南
嵌入式软件开发最佳实践指南1. 项目概述1.1 嵌入式开发核心挑战现代嵌入式系统开发面临代码复杂度增加、团队协作需求提升以及产品迭代周期缩短等多重挑战。高效的开发流程和规范的编码实践成为保证项目成功的关键因素。1.2 开发环境配置建议推荐采用以下硬件配置方案ÿ…...
Python邮件自动化实战:基于imaplib和email库的高效邮件处理方案
1. Python邮件自动化处理的核心价值 每天早晨打开邮箱,看到堆积如山的未读邮件时,你是否感到头皮发麻?作为曾经每天要处理200封邮件的市场分析师,我完全理解这种痛苦。直到发现Python的imaplib和email这对黄金组合,我的…...
CentOS 7.9 上TDengine 3.0.4.2 二进制安装避坑指南:从下载到压测一条龙
CentOS 7.9 上TDengine 3.0.4.2 二进制安装实战:从零部署到百万级压测全解析 时序数据库正在成为物联网、工业互联网和金融监控等场景的核心基础设施。作为国产时序数据库的佼佼者,TDengine以其卓越的写入性能和压缩比,正在全球范围内获得越…...
重度抑郁症多基因风险与大脑结构的关联,一项涵盖50,975名参与者的大型分析,涵盖11项队列
论文总结 这篇论文通过大规模国际合作,整合了11项研究、共50,975名参与者的数据,采用统一的多基因风险评分和神经影像分析流程,发现抑郁症的多基因风险与较低的颅内体积、较小的皮质表面积(尤其是额叶和眶额叶区域)以…...
C语言:结构体(自定义类型)
目录 1. 声明 1.1 结构体的声明 1.2 结构体自引用 2. 结构体内存对齐(热门考点) 2.1 对齐规则 2.3 修改默认对齐数 3.结构体传参 4. 结构体实现位段 4.1 位段 4.2 内存分配 4.3 跨平台问题 4.4 位段的应用:IP数据报 4.5 注意事项…...
3分钟搞定Windows音频捕获:win-capture-audio让你的录音效率翻倍
3分钟搞定Windows音频捕获:win-capture-audio让你的录音效率翻倍 【免费下载链接】win-capture-audio An OBS plugin that allows capture of independant application audio streams on Windows, in a similar fashion to OBSs game capture and Discords applicat…...
告别文档迁移困境:3个关键场景解锁飞书文档批量备份新方案
告别文档迁移困境:3个关键场景解锁飞书文档批量备份新方案 【免费下载链接】feishu-doc-export 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export 还在为团队协作平台切换带来的文档迁移难题而烦恼吗?当企业从飞书切换到其他办公…...
