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

在 Go 中,如何实现一个带过期时间的字典映射

有些时候,应用系统用不上 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   TestTTLMapttl_map_test.go:64: worldttl_map_test.go:64: worldttl_map_test.go:64: worldttl_map_test.go:64: worldttl_map_test.go:66: expiredttl_map_test.go:66: expiredttl_map_test.go:66: expiredttl_map_test.go:66: expiredttl_map_test.go:66: expiredttl_map_test.go:66: expired
--- PASS: TestTTLMap (10.00s)
PASS

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

Over!


http://www.mrgr.cn/news/57756.html

相关文章:

  • 富格林:可信操作助力有效追损
  • C/C++每日一练:实现冒泡排序
  • uniapp实现多文件下载,保存到本地
  • 凯撒密码-图形化实现(Scratch)
  • LeetCode常用算法模板
  • 国内 Docker 镜像加速与 GitHub 加速服务:CNPROXY.TOP
  • 【资深码农】环境搭建篇
  • 【算法】Bellman-Ford单源最短路径算法(附动图)
  • Orthanc局域网访问、IP访问、远程访问服务器
  • Linux的目录结构 常用基础命令(2)
  • 【网络】:网络基础
  • 解决url含%导致404错误
  • flink使用hikariCP数据库连接池,导致连接泄露
  • 【含文档】基于ssm+jsp的爱旅行平台的设计与实现(含源码+数据库+lw)
  • uboot源码makefile基础及启动流程梳理
  • 2024年必收藏!最全 禅道 项目管理软件各版本安装部署全攻略
  • 网络地址和本地网络地址
  • [ComfyUI]Flux:超赞古风少女LORA,唯美江南水乡小桥流水轻舟江南美人
  • 手写路由Vue-Router源码实现原理
  • 昇思MindSpore进阶教程--安装常见问题(下)