首页 > 数据库 >Golang Redis有序集合(sorted set)

Golang Redis有序集合(sorted set)

时间:2022-09-29 11:33:39浏览次数:51  
标签:分数 set err 元素 Redis Golang client 集合 order1

Redis 有序集合(sorted set)和集合一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,这个分数主要用于集合元素排序。

引用github库 

"github.com/go-redis/redis/v8"

go redis有序集合常用函数:

1.ZAdd

添加一个或者多个元素到集合,如果元素已经存在则更新分数

// 添加一个集合元素到集合中, 这个元素的分数是当前时间戳,元素名是order1
    RedisClient.ZAdd(context.Background(), "pending",
		&redis.Z{
			Score:  float64(time.Now().Unix()),
			Member: "order1",
		})

下面是redis.Z结构体说明:

type Z struct {
	Score  float64 // 分数
	Member interface{} // 元素名
}

2.ZCard

返回集合元素个数

size, err := RedisClient.ZCard(context.Background(), "pending").Result()
fmt.Println(size, err)

3.ZCount

统计某个分数范围内的元素个数

// 返回: 0<=分数<=当前时间戳 的元素个数, 注意:min, max两个参数是字符串
size, err = RedisClient.ZCount(context.Background(), "pending", "0",
		strconv.FormatInt(time.Now().Unix(), 10)).Result()
fmt.Println(size, err)

// 返回: 0<=分数<=当前时间戳
// 说明:默认第二,第三个参数是大于等于和小于等于的关系。
// 如果加上( 则表示大于或者小于,相当于去掉了等于关系。
size, err := client.ZCount("key", "(0",strconv.FormatInt(time.Now().Unix(), 10)).Result()

4.ZIncrBy

增加元素的分数

// 给元素order1,加上1分
RedisClient.ZIncrBy(context.Background(), "pending", 1, "order1")

5.ZRange,ZRevRange

返回集合中某个索引范围的元素,根据分数从小到大排序

// 返回从0到-1位置的集合元素, 元素按分数从小到大排序
// 0到-1代表则返回全部数据
vals, err := client.ZRange("pending", 0,-1).Result()
if err != nil {
	panic(err)
}

for _, val := range vals {
	fmt.Println(val)
}

ZRevRange用法跟ZRange一样,区别是ZRevRange的结果是按分数从大到小排序。

6.ZRangeByScore

根据分数范围返回集合元素,元素根据分数从小到大排序,支持分页。

// 初始化查询条件, Offset和Count用于分页
op := redis.ZRangeBy{
	Min:"2", // 最小分数
	Max:"10", // 最大分数
	Offset:0, // 类似sql的limit, 表示开始偏移量
	Count:5, // 一次返回多少数据
}
	
vals, err := client.ZRangeByScore("key", op).Result()
if err != nil {
	panic(err)
}

for _, val := range vals {
	fmt.Println(val)
}

7.ZRevRangeByScore

用法类似ZRangeByScore,区别是元素根据分数从大到小排序。

8.ZRangeByScoreWithScores

用法跟ZRangeByScore一样,区别是除了返回集合元素,同时也返回元素对应的分数

// 初始化查询条件, Offset和Count用于分页
op := redis.ZRangeBy{
	Min:"2", // 最小分数
	Max:"10", // 最大分数
	Offset:0, // 类似sql的limit, 表示开始偏移量
	Count:5, // 一次返回多少数据
}

vals, err := client.ZRangeByScoreWithScores("key", op).Result()
if err != nil {
	panic(err)
}

for _, val := range vals {
	fmt.Println(val.Member) // 集合元素
	fmt.Println(val.Score) // 分数
}

8.ZRem

删除集合元素

// 删除集合中的元素tizi
client.ZRem("pending", "order1")

// 删除集合中的元素tizi和xiaoli
// 支持一次删除多个元素
client.ZRem("key", "order1", "order2")

9.ZRemRangeByRank

根据索引范围删除元素

// 集合元素按分数排序,从最低分到高分,删除第0个元素到第5个元素。
// 这里相当于删除最低分的几个元素
client.ZRemRangeByRank("key", 0, 5)

// 位置参数写成负数,代表从高分开始删除。
// 这个例子,删除最高分数的两个元素,-1代表最高分数的位置,-2第二高分,以此类推。
client.ZRemRangeByRank("key", -1, -2)

10.ZRemRangeByScore

根据分数范围删除元素

// 删除范围: 2<=分数<=5 的元素
client.ZRemRangeByScore("key", "2", "5")

// 删除范围: 2<=分数<5 的元素
client.ZRemRangeByScore("key", "2", "(5")

11.ZScore

查询元素对应的分数

// 查询集合元素tizi的分数
score, _ := client.ZScore("key", "order1").Result()
fmt.Println(score)

12.ZRank

根据元素名,查询集合元素在集合中的排名,从0开始算,集合元素按分数从小到大排序

rk, _ := client.ZRank("key", "order1").Result()
fmt.Println(rk)

ZRevRank的作用跟ZRank一样,区别是ZRevRank是按分数从大到小排序。

标签:分数,set,err,元素,Redis,Golang,client,集合,order1
From: https://www.cnblogs.com/frankfud/p/16740889.html

相关文章

  • C# 接口属性中,如何设置 protected 的 set 或 get
    C#的接口中,是可以设置属性的,比如:public interface IOperator{    int UserId{ get; set;}}但是,我希望类中的set是protected的,怎么办呢?public interfac......
  • docker 简介和使用总结:image,container,dockfile,nginx,redis,compose
    硬件发展速度:asp.net+sql+redis+nginx:资源利用率太低,多软件工具不能隔离,相互影响,不能快速部署 0.docker简介和使用总结:image,container,dockfile,nginx,redis,compose......
  • NET6 web项目读取 appsettings配置文件
    可以在appsettings中配置数据量连接字符串等数据,便于项目发布后的配置首先,创建ConfigHelper类namespaceTestProject.services{publicclassConfigHelper{......
  • react forEach 里面 异步更新 setState
    如题要是等数组处理好,再setState中间就会卡一段时间const[list,setList]=useState([]);letarr=[]for(constitemofsourceList){letdd=await......
  • golang之Time时间函数
    总结常用time包下的方法1)获取前一天的时间packagemainimport"time"nowTime:=time.Now()yesterdayTime:=nowTime.AddDate(0,0,-1);//年,月,日获取前一......
  • golang 的双向循环链表
                如下为go实现的双向循环列表。packagemainimport("fmt")typeRingstruct{prev,......
  • 虚拟机的Linux系统安装redis
    在虚拟机的Linux系统安装redis时出现make:***[install]错误2百度了一下发现是因为没有安装gcc因为Redis是C实现的,需要gcc来进行编译执行安装gcc依赖和gcc:yum-yins......
  • redis有序集合中是否存在某个成员
    redis命令使用参考网页:​​http://redis.cn/commands.html​​有序集合中,redis没有命令直接判断有序集合中是否存在某个成员,自行通过代码实现,示例代码如下:#include<stdio.h......
  • 利用redis实现倒计时任务
    示例如下:importredisimporttimedefevent_handler(msg):'''监听到任何key过期后,得到的消息如下msg={'type':'pmessage',#返回值类型'pattern':'__k......
  • Memcached vs Redis, 挑选哪一个?
    MemcachedvsRedis,挑选哪一个?标签:MencachedRedisMemchached还是Redis?该用哪一个?当我们讨论改进性能的时候,这是每次技术讨论中最常见的一个问题。每当性能需要改善时......