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

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.RWMutextime.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信号量的编程

一&#xff0c;用信号量来实现是父进程先进行&#xff0c;还是子进程先进性 信号量的没有P&#xff0c;V操作之前&#xff0c;我们不知道如何控制&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h>…...

“Yaker,你可以全局配置插件环境变量!“

周四周四&#xff0c;Vme50(bushi 大家好&#xff0c;这里是疯狂超级牛&#xff08;功能上新版&#xff09; 经常有用户问 “牛牛如何为不同插件配置相同的变量值呢&#xff1f;” “能有一个一波搞定插件变量的方式就好了” 超级牛听到了广大用户的声音&#xff0c;默默地拿起…...

SAAS美容美发系统架构解析

随着技术的不断发展&#xff0c;SAAS&#xff08;Software as a Service&#xff0c;软件即服务&#xff09;模式在各个行业的应用逐渐深化&#xff0c;美容美发行业也不例外。传统的美容美发店面通常依赖纸质记录、手动操作和复杂的管理流程&#xff0c;而随着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文件&#xff0c;该文件会在连接之后自动生成&#xff0c;用于验证远程服务器的身份。 konwn_host和id_rsa&#xff0c;id_rsa.pub的关系 &#xff08;1&#xff09;konwn_host用于客户端验证远程服务…...

智慧防汛平台在城市生命线安全建设中的应用

随着城市化进程的加快&#xff0c;城市基础设施的复杂性和互联性不断增强&#xff0c;城市生命线的安全管理面临前所未有的挑战。智慧防汛平台作为城市生命线安全建设的重要组成部分&#xff0c;通过现代信息技术提升城市防汛应急管理的智能化水平&#xff0c;保障城市安全。 …...

python实现TCP Socket控制测试仪器

python实现TCP Socket控制测试仪器 说明前提条件代码 说明 本例是用python实现TCP Socket&#xff0c;最终目的是为了控制LCR电容测试仪器。 前提条件 测试仪器 配备了以太网接口&#xff0c;支持TCP/IP协议栈 用户可以通过IP地址和端口号连接到仪器&#xff0c;建立TCP通信…...

51c自动驾驶~合集38

我自己的原文哦~ https://blog.51cto.com/whaosoft/12358456 #GaussianPretrain 万能3D高斯预训练表示&#xff01;爆拉3D检测、Occ、高精地图等四大任务&#xff01; 受Tesla的技术的推动&#xff0c;越来越多的厂商开始走"纯视觉"的路线&#xff0c;多数方案还…...

电脑显示器拔插DVI线后副屏不显示

问题&#xff1a;台式机副屏显示器插拔DVI线后副屏无法检测到&#xff0c;不显示 其他现象&#xff1a;电脑设备管理器“显示适配器”中只有独显&#xff0c;未显示集显。 尝试方法&#xff1a; 1、 重新插拔并拧紧DVI线、更换DVI线、将DVI线替换为VGA线、调换DVI线及VGA线两…...

Bash脚本常用命令

1.Bash常用快捷键 2.通配符 3.Bash其他特殊符号 4.位置参数 5.预定义变量 6.常用变量比较 7.基础正则表达式 8.文件类型判断 9.文件权限判断 10.整数比较命令 11.字符串判断 其他常用参考&#xff1a; https://zhuanlan.zhihu.com/p/748857250...

《Unity Shader 入门精要》高级纹理

立方体纹理 图形学中&#xff0c;立方体纹理&#xff08;Cubemap&#xff09;是环境映射&#xff08;Environment Mapping&#xff09;的一种实现方法。环境映射可以模拟物体周围的环境&#xff0c;而使用了环境映射的物体可以看起来像镀了层金属一样反射出周围的环境。 对立…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

C# WPF 左右布局实现学习笔记(1)

开发流程视频&#xff1a; https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码&#xff1a; GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用&#xff08;.NET Framework) 2.…...