使用go_concurrent_map 管理 并发更新缓存

在后台服务中,为了提速,我在内存还做了一个告诉缓存来管理用户信息,根据更新通知,或者定时去redis中同步信息,那么在加载或者更新某个用户元素时,要防止并发,

当:

1)如果内存缓存没有;

2)去数据库或者redis加载;

3)添加到内存缓存;

这里就有个并发重复的可能性;

所以,这里要做一个加锁的插入或者更新,使用go_concurrent_map就十分方便:

Go 复制代码
// https://github.com/robinfoxnan/go_concurrent_map
// 这里使用一个支持高并发的map来管理会话
type UserCache struct {
	//lock sync.Mutex

	userMap utils.ConcurrentMap[int64, *User]
}

// 如果没有,则从redis中查找,如果redis中没有,则从数据库中查找
func (uc *UserCache) GetUser(uid int64) (*User, bool) {

	user, err := uc.userMap.Get(uid)
	return user, err
}

// 更新时候的回调函数,如果未设置,则
func updateInsertUser(exist bool, oldUser *User, newUser *User) *User {
	if exist == false {
		return newUser
	} else {
		oldUser.MergeUser(newUser)
		return oldUser
	}
}

// 这里可能会有并发冲突,需要解决的就是session列表需要合并
func (uc *UserCache) SetOrUpdateUser(uid int64, user *User) {
	uc.userMap.Upsert(uid, user, updateInsertUser)
}

这个类在插入时候,可以检测是否存在,并通过回调函数来决定是插入还是更新;这个加锁已经放在插入函数中完成了;

详细代码请查看:GitHub - robinfoxnan/BirdTalkServer: An open source IM system

相关推荐
流星白龙6 小时前
【Redis】4.基本全局命令
数据库·redis·缓存
流星白龙9 小时前
【Redis】3.Redis安装与命令行客户端
数据库·redis·缓存
我不想名字重复15 小时前
redis缓存和数据库数据保持一致
数据库·redis·缓存
时空无限15 小时前
vllm 大模型启动缓存相关环境变量 export
linux·缓存·vllm
流星白龙18 小时前
【Redis】6.计数其他命令
数据库·redis·缓存
正儿八经的少年19 小时前
redis 的大 key 和热 key 详解
数据库·redis·缓存
X-⃢_⃢-X20 小时前
十、Redis之布隆过滤器
数据库·redis·缓存
Database_Cool_21 小时前
阿里云 Tair(企业级内存数据库)vs 腾讯云 Redis 云缓存深度对比:性能/数据结构/成本全维度 Benchmark
数据库·阿里云·缓存
流星白龙21 小时前
【Redis】1.Redis特性
数据库·redis·缓存
chexus21 小时前
21. 深入 Nginx HTTP 缓存源码:CDN功能
nginx·http·缓存