Golang:在lru缓存

时间:2016-10-28 09:37:32

标签: performance caching go

我的结构类似于:map[key]value,我希望通过字符串键将其存储在"github.com/golang/groupcache/lru"中,例如cacheKey

这是我的问题:

我发现每当我想要更新缓存的项目时,我首先需要Get

item := cache.Get(cacheKey)
if v, ok := item[key]; ok{
    item[key]=new_value
    cache.Add(cacheKey, item)
}

这是正确的方法吗?

或者,正如一些人建议的那样,我需要重新设计我的结构,以确保每当我想要更新它时我都可以cache.Add(cacheKey, item)

或者,我甚至应该使用像cacheKey_key这样的组合键来存储该项目?

1 个答案:

答案 0 :(得分:0)

上面的代码可行。我查看了您引用的LRU缓存的来源。以下是我的笔记:

  • 无论您决定什么,如果您计划在goroutines中使用它,请确保对此LRU的访问是线程安全的。
  • 您可以存储*map而不是普通map,这样就无需调用add。
  • 如果可以使用覆盖添加到地图,请跳过状态检查(if v, ok...

所以说,这就是它:

m sync.Mutex
m.Lock()
defer m.Unlock()
cache.Get(cacheKey)[key] = new_value

如果您详细说明您计划存储的数据类型,我们可能会尝试提供替代解决方案。