dpauxqt1281 2014-08-25 10:43
浏览 215
已采纳

在Go中使用TTL选项进行映射

I need to build a data-structure like this:

map[string]SomeType 

But it must store values for about 10 minutes and then clear it from memory. Second condition is records amount - it must be huge. This data-structure must add at least 2-5K records per second.

So, what is the most correct way in Go to make it?

I'm trying to make goroutine with timeout for each new elemnt. And one(or more) garbage-collector goroutine with channel to receive timeouts and clear elements. But I'm not sure it's the most clear way. Is it Ok to have millions of waiting goroutines with timeouts?

Thanks.

  • 写回答

2条回答 默认 最新

  • dongqiulei1987 2014-08-25 13:48
    关注

    You will have to create a struct to hold your map and provide custom get/put/delete funcs to access it.

    Note that 2-5k accesses per second is not really that much at all, so you don't have to worry about that.

    Here's a simple implementation:

    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
    
    }
    

    <kbd>playground</kbd>

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端