dousha1394 2019-08-13 07:41
浏览 486

Go中的两级缓存(内存+ Redis)实现

I am trying to write a two-level cache (memory + redis), but I got a bottleneck when there is a high concurrency access for one key, I tried to use mutex for each key, but this increased cpu a lot since loadFromDB takes 100-200ms.

func (s *Store) GetJsonObjectWithExpire(key string, obj interface{}, ttl int, f StoreLoadFunc) error {
    // first read from memory
    v, ok := s.mem.Get(key)
    if ok {
        if v.Outdated() {
            to := deepcopy.Copy(obj)
            go s.updateMem(key, to, ttl, f)
        }
        return nil
    }

    // if missed in memory, check from redis
    v, ok = s.rds.Get(key, obj)
    if ok {
        if v.Outdated() {
            go s.rds.loadFromDB(key, nil, ttl, f, false)
        }
        return nil
    }
    return s.rds.loadFromDB(key, obj, ttl, f, true)
}

loadFromDB will load object from db and write it to redis and memory, this will take about 100-200ms, both loadFromDB and rds.Get function use per-key RWMutex right now.

since there will be a lot of keys(10000+),I am not sure if it is a good idea to use a mutex for each key?

Is there any thing that I can do to improve the performance?

UPDATE: Here is my code on github for my two-level cache-aside pattern implementation.

https://github.com/seaguest/cache

  • 写回答

1条回答 默认 最新

  • doublel83422 2019-08-30 08:39
    关注

    Finally, here is my github repo:

    A lightweight distributed two-level cache (memory + redis) with loader function library for Go.

    Welcome to have a try, any suggestion is appreciated.

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。