Go 对ZSet操作,go使用zset实现排行榜。go单元测试模拟redis

news/2024/5/10 1:07:55

Go 对ZSet操作

redis client操作使用 https://github.com/go-redis/redis

创建可以这样:

RedisClient := redis.NewClient(&redis.Options{Addr:         c.Addr,Password:     c.Password,DB:           c.DB,MinIdleConns: c.MinIdleConn,DialTimeout:  c.DialTimeout,ReadTimeout:  c.ReadTimeout,WriteTimeout: c.WriteTimeout,PoolSize:     c.PoolSize,PoolTimeout:  c.PoolTimeout,})

单元测试模拟 redis使用 https://github.com/alicebob/miniredis

func InitTestRedis() {mr, err := miniredis.Run()if err != nil {panic(err)}// 打开下面命令可以测试链接关闭的情况// defer mr.Close()RedisClient = redis.NewClient(&redis.Options{Addr: mr.Addr(),})fmt.Println("mini redis addr:", mr.Addr())
}

ZSet操作

func TestRedisZSet(t *testing.T) {InitTestRedis()ctx := context.Background()ls := []*redis.Z{{Score: 90.0, Member: "one"},{Score: 80.0, Member: "two"},{Score: 70.0, Member: "three"},{Score: 60.0, Member: "four"},{Score: 50.0, Member: "five"},}cli := RedisClientl1 := redis.Z{Score:  40,Member: "six",}// 添加一个值cli.ZAdd(ctx, "ranking", &l1)cli.ZAdd(ctx, "ranking", ls...)//升序:查询zset中指定区间的成员,-1代表取到最后println("=====================")println("升序获取到倒数第三-->")fmt.Println("ZRange:", cli.ZRange(ctx, "ranking", 0, 3).Val()) //[six five four three]//降序:查询zset中指定区间的成员,-1代表取到最后println("=====================")println("降序获取所有-->")fmt.Println("ZRevRange:", cli.ZRevRange(ctx, "ranking", 0, -1).Val()) // [one two three four five six]// [six five four three two one]opt := redis.ZRangeBy{Min:    "50", //最小分数Max:    "90", //最大分数Offset: 2,    //在满足条件的范围,从offset下标处开始取值Count:  3,    //查询结果集个数}//升序:根据opt条件查询Member成员println("=====================")println("条件查询 获取50-90分数区间,升序找到3个结果,-->")fmt.Println(cli.ZRangeByScore(ctx, "ranking", &opt).Val()) // [three two one]//降序:根据opt条件查询Member成员println("条件查询 获取50-90分数区间,降序找到3个结果,-->")fmt.Println(cli.ZRevRangeByScore(ctx, "ranking", &opt).Val()) //[three four five]//升序:根据下标范围返回的redis.Z结构体切片println("=====================")println("条件查询 从小到大,获取0-3名次,-->")fmt.Println(cli.ZRangeWithScores(ctx, "ranking", 0, 3).Val()) //[{40 six} {50 five} {60 four} {70 three}]//降序:根据下标范围返回的redis.Z结构体切片println("条件查询 从大到小,获取所有名次,-->")fmt.Println(cli.ZRevRangeWithScores(ctx, "ranking", 0, -1).Val()) //[{90 one} {80 two} {70 three} {60 four} {50 five} {40 six}]//升序:根据opt条件,返回的redis.Z结构体切片println("=====================")println("条件查询 获取50-90分数区间,升序找到3个结果集,-->")fmt.Println(cli.ZRangeByScoreWithScores(ctx, "ranking", &opt).Val())//降序:根据opt条件,返回的redis.Z结构体切片println("条件查询 获取50-90分数区间,降序找到3个结果集,-->")fmt.Println(cli.ZRevRangeByScoreWithScores(ctx, "ranking", &opt).Val())//fmt.Println(cli.ZRangeByLex(ctx, "ranking", &opt).Val())//fmt.Println(cli.ZRevRangeByLex(ctx, "ranking", &opt).Val())// 获取指定成员的scoreprintln("=====================")println("获取指定成员5分数,-->")f := cli.ZScore(ctx, "ranking", "5").Val()fmt.Println(f) // 80// 获取指定成员的下标println("获取指定成员5下标,-->")fmt.Println(cli.ZRank(ctx, "ranking", "5").Val()) //3// 返回指定区间的成员个数fmt.Println("获取50-80分数区间成员人数,-->")fmt.Println(cli.ZCount(ctx, "ranking", "50", "80").Val()) //4// 返回集合中成员的个数println("获取总榜成员人数,-->")fmt.Println(cli.ZCard(ctx, "ranking").Val()) //6// 根据成员名称,移除指定成员(可以多个): 0:失败  0<:成功println("移除不存在的成员,-->")fmt.Println(cli.ZRem(ctx, "ranking", "c++").Val()) //0println("移除存在的成员,-->")fmt.Println(cli.ZRem(ctx, "ranking", "six", "one").Val()) //2println("打印现存的所有成员-->")fmt.Println(cli.ZRange(ctx, "ranking", 0, -1).Val()) // [five four three two]// 升序:根据下标区间移除指定成员println("移除下标1-2的成员-->")fmt.Println(cli.ZRemRangeByRank(ctx, "ranking", 1, 2).Val()) //2:表示移除了两个println("打印现存的所有成员-->")fmt.Println(cli.ZRangeWithScores(ctx, "ranking", 0, -1).Val()) // [{50 five} {80 two}]// 升序:根据分数区间移除指定成员println("移除70-90分间的成员-->")fmt.Println(cli.ZRemRangeByScore(ctx, "ranking", "70", "90").Val()) //1:表示移除了一个println("打印现存的所有成员-->")fmt.Println(cli.ZRangeWithScores(ctx, "ranking", 0, -1).Val()) // [{50 five}]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/10.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

jenkins流水线部署,项目一键部署到k8s,项目一键部署K8S

预操作 打通jenkins、gitlab凭证&#xff0c; 见下面这篇文章 https://blog.51cto.com/wzlinux/2160109 然后从这里拿到凭证ID 用以在后面的Jenkinsfile中进行配置。 在阿里云&#xff0c;拿到镜像仓库凭证&#xff0c;用于自动上传镜像。 Jenkinsfile 放在项目的根目录…

提交代码触发Jenkins流水线更新

提交哪个构建哪个 或者 某个指定分支提交才构建 jenkins自己的restful接口在权限认证上比较麻烦&#xff0c;所以我选择了Jenkins的插件generic-webhook-trigger 使用下来感觉没有选错 1. 安装jenkins插件generic-webhook-trigger 在系统配置中去安装插件。 2. 在Jenkinsfile…

java 生成grpc调用service

1. 安装protoc 这里以mac为例&#xff1a; brew install automake brew install libtool brew install protobuf检查 protoc --version2. 下载protoc-(java/go/kotlin)插件 到这里下载对应系统的exe文件 https://repo.maven.apache.org/maven2/io/grpc/protoc-gen-grpc-java…

从言行合一到知行合一

本篇记录突然的随想&#xff0c;偶尔停留 2021年只有两种人在写博客&#xff0c;一种是试图建立受众并从中获利的人&#xff0c;另一种是只想写出想法、而没有任何目标的人。 这两种人的行为都非常好。选择做你喜欢的事&#xff0c;坚持下去&#xff0c;它们最终都可以对他人…