文章目录
  1. Redis基本命令的使用-有序集合
  2. 1. 简介
  3. 2. 命令
    1. 2.1 集合操作
    2. 2.2 集合间操作
  4. 3. 内部编码
    1. 3.1 ziplist(压缩列表)
    2. 3.2 skiplist(跳跃表)
  5. 4. 使用场景
    1. 4.1 排行榜
    2. 4.2 历史搜索记录

[TOC]

Redis基本命令的使用-有序集合

1. 简介

与集合不同的是,有序集合中的元素可以排序,排序的依据是给每个元素设置一个分数(score)

比如对一个班级的学生进行分数排名。

2. 命令

2.1 集合操作

  • 添加成员
1
2
3
4
5
6
7
$ zadd key [NX|XX] [CH] [INCR] score member [score member ...]

> 示例
127.0.0.1:6379> zadd user:rank 1 a 10 b 5 c
(integer) 3

# 返回添加成功的个数

Redis3.2为zadd添加了四个选项:

  • NX:元素必须不存在,才能设置成功,用于添加
  • XX:元素必须存在,才能设置,用于更新
  • CH:返回此次操作后,元素和分数发生变化的个数
  • INCR:对score做增加,相当于命令zincrby

由于有序集合存在排序,所以zadd时间复杂度是O(log(n)),sadd是O(1)。

  • 计算成员个数
1
2
3
4
5
6
7
$ zcard key

> 示例
127.0.0.1:6379> zcard user:rank
(integer) 3

# 类似scard
  • 计算某个成员分数
1
2
3
4
5
6
7
$ zscore key member

> 示例
127.0.0.1:6379> zscore user:rank b
"10"

# 如果成员不存在,返回nil
  • 计算成员排名
1
2
3
4
5
6
7
8
9
10
11
$ zrank key member
$ zrevrank key member

> 示例
127.0.0.1:6379> zrank user:rank c
(integer) 1
127.0.0.1:6379> zrevrank user:rank a
(integer) 2

# zrank从分数低到高排名,zrevrank反之
# 排名下标从0开始
  • 删除成员
1
2
3
$ zrem key member [member ...]

# count默认为1
  • 增加成员分数
1
2
3
4
5
$ zincrby key increment member

> 示例
127.0.0.1:6379> zincrby user:rank 1 a
"2"
  • 返回指定排名范围的成员
1
2
3
4
5
6
7
8
9
10
11
12
$ zrange key start stop [WITHSCORES]
$ zrevrange key start stop [WITHSCORES]

> 示例
127.0.0.1:6379> zrange user:rank 0 1
1) "a"
2) "c"
127.0.0.1:6379> zrevrange user:rank 0 1 WITHSCORES
1) "b"
2) "10"
3) "c"
4) "5"
  • 返回指定分数范围的成员
1
2
3
4
5
6
$ zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
$ zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]


# zrangebyscore按照分数从低到高,zrevrangebyscore反之。
# min和max支持开区间和闭区间,以及无限小(-inf)和无限大(+inf)。
  • 返回指定分数范围的成员数量
1
$ zcount key min max
  • 删除指定排名范围的升序成员
1
$ zremrangebyrank key start stop
  • 删除指定分数范围的升序成员
1
$ zremrangebyscore key min max

2.2 集合间操作

  • 交集
1
$ zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
  • numkeys:做交集计算键的个数。
  • [WEIGHTS weight]:每个键的权重,在做交集时,每个键的每个成员会将自己的分数乘以这个权重,默认权重为1
  • [AGGREGATE SUM|MIN|MAX]:计算成员交集,分数按照最小值最大值做汇总,默认是SUM
  • 并集
1
$ zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
  • 差集

没有差集

3. 内部编码

3.1 ziplist(压缩列表)

当有序集合的元素个数小于zset-max-ziplist-entries(默认128个),同时每个元素的值都小于zset-max-ziplist-value(默认64字节),Redis会使用ziplist作为列表的内部实现,减少内存使用。

3.2 skiplist(跳跃表)

当无法满足ziplist条件时,Redis会使用skiplist的方式以增加读写效率。

4. 使用场景

4.1 排行榜

4.2 历史搜索记录

文章目录
  1. Redis基本命令的使用-有序集合
  2. 1. 简介
  3. 2. 命令
    1. 2.1 集合操作
    2. 2.2 集合间操作
  4. 3. 内部编码
    1. 3.1 ziplist(压缩列表)
    2. 3.2 skiplist(跳跃表)
  5. 4. 使用场景
    1. 4.1 排行榜
    2. 4.2 历史搜索记录