duration_cache

代码 · 2023-12-24

平时我们在调一些rpc/db数据或获取一些远程setting时,常常会把他们保存在本地cache里,但每次又需要考虑存本地全局变量还是cache组件,还要考虑序列化反序列化,保存时间,数据结构调整之类的事,导致一些类似的工作会搞好几遍。于是我就搞了这个duration_cache的东西,他只需要在你原先读取数据的基础上调整一行代码就可以帮你把数据保存起来,过期后再重新获取,一般是不需要考虑结构调整,也不自己处理过期,使用了泛型,所以支持所有类型数据。

具体本地缓存用的freecache,因为它支持单key过期时间,同时使用了zero-gc的策略,保证了性能,不过也不时动态扩容;另外有个点是每个key大小不能大于千分之一的总容量

另外使用了singleflight来保证不会有并发更新的问题

使用方法很简单:

原代码示例:

cacheRs, err := cache.GetUser(ctx, 1234)
if err == nil && cacheRs != nil {
  return cacheRs, nil
}
row, err := db.GetUser(ctx, 1234)
if err != nil {
  return nil, err
}
if err == nil && row != nil {
  cache.SetUser(ctx, 1234, row, 10 * time.Second)
}
return row, err

使用duration_cache

var rs := &User{}
err := duration_cache.Get(ctx, func () (*User, error) {
  return db.GetUser(ctx, 1234)
},10, &rs)
return rs, err

Just show the code

https://github.com/elangx/duration_cache

Theme Jasmine by Kent Liao Modified by eLangX