1. 对于大量请求,要分片处理,对延迟要求没那么高的,可以用redis做计数器,然后自增取模,分片处理。然后写一个定时器执行
//分片的范围,SliceCount为6,那么就是分为6份,0-5
index := db.GetRedis().Incr(nCtx, keys.RedisHopeIndexKey).Val() % SliceCount
//遍历全部然后取模分片
for _, player := range playerList {
if player.GetAccountId()%SliceCount == index {
filterPlayerList = append(filterPlayerList, player)
}
}
//如果此处轮询空了,直接退出
if len(filterPlayerList) == 0 {
return
} 2.如果逻辑反复要调用redis的时候,如果要求实时性没那么高,可以考虑用定时器把redis的值存本地内存,然后5分钟拉取一次
atomic.StoreInt64(&s.OnlineNumStat, curOnlineNum)
onlineNumStat := atomic.LoadInt64(&s.OnlineNumStat)3.Redis实现分布式锁
1.典型的错误方式
加锁和过期时间,不是一致的,有时间差,可能导致加锁后没过期时间,阻塞后面所有请求,另外,他删除锁也有问题,可能把其他的误删了。

2.正确的
1.加锁原子性

2.解锁安全性
通过value保证这个锁是自己的锁才可以删除,所以我们uuid作为value,然后lua脚本保证读取和删除的原子性操作,他们设置同一个key,通过value的uuid来判断是否是自己的锁,lua脚本保证不会错删。

3.lua脚本的作用

评论