有些时候,应用系统用不上 redis,我们也可以用锁和 goroutine 实现一个带有过期时间的线程安全的字典。

这种字典的应用场景,比较倾向于数据规模较小,没有分布式要求。

下面是实现:

1、定义结构

type Item struct {
value interface{}
expireAt int64
} type TTLMap struct {
m map[string]*Item
mu sync.Mutex
}

字典的值是一个可以接收任何类型的 interface{}

2、定义行为


func NewTTLMap(size int) (m *TTLMap) {
m = &TTLMap{m: make(map[string]*Item, size)}
go func() {
for now := range time.Tick(time.Second) {
m.mu.Lock()
for k, v := range m.m {
if v.expireAt <= now.Unix() {
delete(m.m, k)
}
}
m.mu.Unlock()
}
}()
return
} func (m *TTLMap) Set(key string, value interface{}, ttl int64) {
m.mu.Lock()
defer m.mu.Unlock()
m.m[key] = &Item{value: value, expireAt: time.Now().Unix() + ttl}
} func (m *TTLMap) Get(key string) (v interface{}, ok bool) {
m.mu.Lock()
defer m.mu.Unlock()
if item, ok := m.m[key]; ok && item.expireAt > time.Now().Unix() {
return item.value, true
}
return nil, false
}

NewTTLMap 函数用来初始化字典,然后使用 goroutine 开启新的轻量级线程,按照一定的频率从字典里删除项。

Get 函数用来获取字典的值,然后这里也判断一下过期时间,如果已经过期了,就不再返回了。

3、验证结果

func TestTTLMap(t *testing.T) {
m := NewTTLMap(10)
m.Set("hello", "world", 5)
for i := 0; i < 10; i++ {
time.Sleep(time.Second)
if v, ok := m.Get("hello"); ok {
t.Log(v)
} else {
t.Log("expired")
}
}
}

输出结果:

=== RUN   TestTTLMap
ttl_map_test.go:64: world
ttl_map_test.go:64: world
ttl_map_test.go:64: world
ttl_map_test.go:64: world
ttl_map_test.go:66: expired
ttl_map_test.go:66: expired
ttl_map_test.go:66: expired
ttl_map_test.go:66: expired
ttl_map_test.go:66: expired
ttl_map_test.go:66: expired
--- PASS: TestTTLMap (10.00s)
PASS

每秒读取一次,由于过期时间是 5 秒,因此,5 秒之后就读取不到值了。

Over!

在 Go 中,如何实现一个带过期时间的字典映射的更多相关文章

  1. php中实现精确设置session过期时间的方法

    http://www.jb51.net/article/52309.htm 大多数据情况下我们对于session过期时间使用的是默认设置的时间,而对于一些有特殊要求的情况下我们可以设置一下sessio ...

  2. 转:php中实现精确设置session过期时间的方法

    原文来自于:http://www.jb51.net/article/52309.htm 大多数据情况下我们对于session过期时间使用的是默认设置的时间,而对于一些有特殊要求的情况下我们可以设置一下 ...

  3. localstorage实现带过期时间的缓存功能

    前言 一般可以使用cookie,localstorage,sessionStorage来实现浏览器端的数据缓存,减少对服务器的请求. 1.cookie数据存放在本地硬盘中,只要在过期时间之前,都是有效 ...

  4. redis中获取没有设置ttl过期时间的key

    需求:redis作为一个内存型的数据库,我们需要对过期key保持关注,从info keyspace中可以看出有多少key没有设置过期时间,那么到底是哪些呢? 说明:关于redis ttl 的返回值,请 ...

  5. java实现带过期时间的缓存

    private static ScheduledExecutorService swapExpiredPool = new ScheduledThreadPoolExecutor(10); priva ...

  6. python中使用redis模块, 设置过期时间

    # 链接数据库self.handle = redis.Redis(host=host, port=port, db=db, password=password, decode_responses=Tr ...

  7. Redis中取得所有Key、过期时间配置与获取、Key过期通知。

    string connection = "127.0.0.1:6379,password=xxxxx,connectRetry=5"; [TestMethod] public vo ...

  8. golang中time包一个简单的时间格式输出

    一.代码 package main import ( "fmt" "time" ) func main() { //"2006-01-02 15:04 ...

  9. 关于web会话中的session过期时间的设置

    关于web会话中的session过期时间的设置 1.操作系统: 步骤:开始——〉管理工具——〉Internet信息服务(IIS)管理器——〉网站——〉默认网站——〉右键“属性”——〉主目录——〉配置— ...

  10. asp中设置session过期时间方法总结

    http://www.jb51.net/article/31217.htm asp中设置session过期时间方法总结 作者: 字体:[增加 减小] 类型:转载   asp中默认session过期时间 ...

随机推荐

  1. 本地部署DeepSeek

    没想到新年最热闹的地方之一会是互联网,刷爆朋友圈的除了新年祝福还有DeepSeek.揣着一颗好奇心试了试,竟有一种发现新大路的感觉.估计是围观的人太多,在线的版本有时候会出现连不上的情况,好奇心驱使之 ...

  2. 支持S3协议的S3cmd工具简单使用

    本文分享自天翼云开发者社区<支持S3协议的S3cmd工具简单使用>,作者:付****健 一:安装方法 #wget http://nchc.dl.sourceforge.net/projec ...

  3. 一种提升SQL改写效率的方法

    本文分享自天翼云开发者社区<一种提升SQL改写效率的方法>,作者:唐****律 一.背景 SQL改写是数据库产品中使用比较频繁的一个技术,在大多数产品中的调用频率也非常高,通常对性能的需求 ...

  4. 文件快递柜FileCoxBox-匿名口令分享文本,文件,像拿快递一样取文件

    FileCoxBox特色 轻量简洁:Fastapi+Sqlite3+Vue2+ElementUI 轻松上传:复制粘贴,拖拽选择 多种类型:文本,文件 防止爆破:错误次数限制 防止滥用:IP限制上传次数 ...

  5. VsCode安装Copilot详细教程

    安装GitHub Copilot插件前,您需要安装以下软件: 安装Visual Studio Code:前往https://code.visualstudio.com下载并安装最新版的Visual S ...

  6. JavaGUI - [01] 常见API

    题记部分 一.Component 作为基类,提供了如下常用的方法来设置组件的大小.位置.可见性等. setLocation(int x,int y) 设置组件的位置 setSize(int width ...

  7. Flink学习(十九) 容错机制

    主要内容: 一致性检查点(checkpoint) 从检查点恢复到状态 Flink检查点算法 保存点(savepoint) 一致性检查点(checkpoint) Flink故障恢复机制的核心,就是应用状 ...

  8. P11620 [Ynoi Easy Round 2025] TEST_34

    由子序列和最值异或可以想到线性基 发现其实线性基满足结合律 考虑线段树进行维护 那么显然的一个想法就是把1操作直接上tag 但是发现上tag其实会丢失线性基的性质 于是差分 将区间修改变为单点修改 考 ...

  9. Vulnhub-Troll-1靶机-ftp匿名登录+流量包分析+hydra爆破+ssh登录脚本提权

    一.靶机搭建 选择扫描虚拟机 选择路径即可 二.信息收集 扫ip 靶机ip:192.168.108.144 扫开放端口 开放了ftp服务 扫版本服务信息 信息如下 21/tcp open ftp vs ...

  10. Selenium KPI接口 附件上传

    实现功能 拖拽图片到百度上传图片搜索功能区域. 定位.send_keys(r'图片路径') 导入相关包 from selenium import webdriver from time import ...