redis 如何使用 scan, go语言

建议用方案乙

场景

redis 中存在大量 key。 其中有一部分是用户登陆的 session_id, 结构是 :

session_id:1

session_id:2

session_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 // 记录游标位置,初始为 0
	var 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
		}
	}

拓展

但是有一点要注意,你指定的批次数量,不一定会完全一样,就算库里大于你的单批次的数量。

在这里插入图片描述


相关推荐

  1. Python如何使用Redis

    2024-07-09 17:46:08       38 阅读
  2. 如何在生产环境正确使用Redis

    2024-07-09 17:46:08       49 阅读
  3. Spring boot如何使用redis缓存

    2024-07-09 17:46:08       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 17:46:08       50 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 17:46:08       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 17:46:08       43 阅读
  4. Python语言-面向对象

    2024-07-09 17:46:08       54 阅读

热门阅读

  1. arm (exti中断)

    2024-07-09 17:46:08       26 阅读
  2. LRU Cache 双向链表以及STL list实现----面试常考

    2024-07-09 17:46:08       27 阅读
  3. gitlab每日备份以及restore

    2024-07-09 17:46:08       27 阅读
  4. Centos安装Node.js

    2024-07-09 17:46:08       43 阅读
  5. C#多线程并行计算实例

    2024-07-09 17:46:08       17 阅读
  6. C#架构师的成长之路

    2024-07-09 17:46:08       25 阅读
  7. 算法刷题1-10大排序算法汇总

    2024-07-09 17:46:08       26 阅读
  8. 设计模式——工厂模式

    2024-07-09 17:46:08       44 阅读
  9. c语言中printf函数参数个数可变实现原理

    2024-07-09 17:46:08       22 阅读