gpt4 book ai didi

go - Go中的二级缓存(内存+redis)实现

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:06 25 4
gpt4 key购买 nike

我正在尝试写一个二级缓存(内存+redis),但是当一个key高并发访问时遇到了瓶颈,我尝试对每个key都使用mutex,但是这样增加了cpu很多因为 loadFromDB 需要 100-200 毫秒。

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 将从 db 加载对象并将其写入 redis 和内存,这将花费大约 100-200ms,loadFromDB 和 rds.Get 函数现在使用 per-key RWMutex。

因为会有很多键(10000+),我不确定为每个键使用互斥锁是否是个好主意?

我可以做些什么来提高性能吗?

更新:这是我在 github 上的代码,用于我的两级缓存端模式实现。

https://github.com/seaguest/cache

最佳答案

最后,这是我的 github 仓库:

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

欢迎尝试,欢迎任何建议。

关于go - Go中的二级缓存(内存+redis)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57473226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com