建议用方案乙
文章目录
- 场景
- 方案
- 方案甲
- 方案乙
- 拓展
场景
redis 中存在大量 key。 其中有一部分是用户登陆的 session_id
, 结构是 :
session_id:1session_id:2session_id:3
需求: 有多少用户在线
方案
方案甲
keys session_id:*
这种方式简单快捷,一次性查到所有用户。
但是,如果有 1 百万用户,这时候对于 redis 的压力🍐,可想而知。
方案乙
SCAN
方式
记录游标,循环取出
下面是 go 语言代码案例
go1.21
go get github.com/redis/go-redis/v9
redisCli, err := redis.GetRedisCli(c)if err != nil || redisCli == nil {return resp, errors.New("redis db err")}var cursor uint64 // 记录游标位置,初始为 0var keys []string // 查到的所有 key 列表iter := 0 // 查询次数for {batch := int64(1000) // 每批次查询个数var keysNew []string // 每批次查到的 key 列表keysNew, cursor, err = redisCli.Scan(c, cursor, "session_id:*"), batch).Result()if err != nil {break}keys = append(keys, keysNew...) // 追加到全量的数组中iter++if cursor == 0 { // 当 cursor 等于 0 时,退出循环。第一次和最后一次是 0。break}if iter > 100 { // 避免无限循环break}}
拓展
但是有一点要注意,你指定的批次数量,不一定会完全一样,就算库里大于你的单批次的数量。