gpt4 book ai didi

data-structures - 在 Go 中使用 TTL 选项映射

转载 作者:IT王子 更新时间:2023-10-29 01:10:39 25 4
gpt4 key购买 nike

我需要构建这样的数据结构:

map[string]SomeType 

但它必须将值存储大约 10 分钟,然后将其从内存中清除。第二个条件是记录数量——它必须是巨大的。此数据结构必须至少添加 每秒 2-5K 条记录

那么,Go 中最正确的实现方式是什么?

我正在尝试为每个新元素制作带有超时的 goroutine。一个(或多个)垃圾收集器 goroutine 带有接收超时和清除元素的 channel 。但我不确定这是最清楚的方法。有数百万个超时等待的 goroutine 可以吗?

谢谢。

最佳答案

您必须创建一个结构来保存您的 map 并提供自定义的获取/放置/删除函数来访问它。

请注意,每秒 2-5k 次访问根本不算多,因此您不必担心。

这是一个简单的实现:

type item struct {
value string
lastAccess int64
}

type TTLMap struct {
m map[string]*item
l sync.Mutex
}

func New(ln int, maxTTL int) (m *TTLMap) {
m = &TTLMap{m: make(map[string]*item, ln)}
go func() {
for now := range time.Tick(time.Second) {
m.l.Lock()
for k, v := range m.m {
if now.Unix() - v.lastAccess > int64(maxTTL) {
delete(m.m, k)
}
}
m.l.Unlock()
}
}()
return
}

func (m *TTLMap) Len() int {
return len(m.m)
}

func (m *TTLMap) Put(k, v string) {
m.l.Lock()
it, ok := m.m[k]
if !ok {
it = &item{value: v}
m.m[k] = it
}
it.lastAccess = time.Now().Unix()
m.l.Unlock()
}

func (m *TTLMap) Get(k string) (v string) {
m.l.Lock()
if it, ok := m.m[k]; ok {
v = it.value
it.lastAccess = time.Now().Unix()
}
m.l.Unlock()
return

}

playground

注意(2020-09-23):由于某种原因,当前版本的 playground 的时间分辨率有很大差距,这工作正常,但是要在 playground 上尝试,您必须将 sleep 时间更改为 3-5 秒.

关于data-structures - 在 Go 中使用 TTL 选项映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25484122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com