【发布时间】:2014-08-25 10:43:44
【问题描述】:
我需要构建一个这样的数据结构:
map[string]SomeType
但它必须存储大约 10 分钟的值,然后将其从内存中清除。 第二个条件是记录数量 - 它必须是巨大的。此数据结构必须至少添加 每秒 2-5K 条记录。
那么,Go 中最正确的方法是什么?
我正在尝试为每个新元素制作带有超时的 goroutine。以及一个(或多个)带有通道的垃圾收集器 goroutine 来接收超时和清除元素。 但我不确定这是最清楚的方法。有数百万个等待超时的 goroutine 是否可以?
谢谢。
【问题讨论】:
-
如果你需要这种 TTL 行为,你不会想要使用
map,或者至少除了@987654325之外你还需要添加一些其他的数据结构@。您可能想查看最小堆(例如,在 Go 中,有 container/heap)。 -
谢谢!但是使用 map 是必要的,因为我需要通过它们的 ID 随机访问元素。有什么想法吗?
-
所以在草图中,我要做的是这个(如果你愿意,我可以更详细地写出来作为答案):拥有一个同时具有映射(用于值)的数据结构和一个堆(用于过期时间)。每次将条目添加到映射时,它都会插入到以其到期时间为键的堆中。每次有人进行某种地图访问操作时,您首先将所有已过期的元素从堆中弹出(基本上,一直持续到过期时间在
time.Now()之后),然后从地图中删除所有元素。然后你执行任何请求的操作。 -
另外,如果您希望地图项在没有人使用地图的情况下过期(这可能有助于回收程序其他部分使用的内存),您可以运行一个单独的 goroutine只是循环从堆中弹出东西,直到它们的到期时间到来,然后从映射中删除元素(您需要确保堆和映射都正确同步 - 可能使用
sync.RWMutex或类似的东西;这是使用通道进行同步的情况之一。 -
您可能需要考虑使用github.com/ReneKroon/ttlcache
标签: data-structures go timeout ttl