Logo
活死人の行知路

三、Redis常用命令


📅 | 📝 1820 字
#redis #DBA

1通用命令

  • keys *: 遍历所有 key,* 为通配符,统计Redis中的所有键。
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> set python good
OK
127.0.0.1:6379> set java best
OK
127.0.0.1:6379> keys *
1) "java"
2) "python"
3) "hello"
127.0.0.1:6379> dbsize
(integer) 3

  • keys [pattern]:使用正则遍历所有key。
127.0.0.1:6379> mset hello world hehe haha php golang python his
OK
127.0.0.1:6379> keys *
1) "java"
2) "hehe"
3) "hello"
4) "python"
5) "php"
127.0.0.1:6379> keys he*
1) "hehe"
2) "hello"
127.0.0.1:6379> keys he[h-l]*
1) "hehe"
2) "hello"
127.0.0.1:6379> keys ph?
1) "php"

keys 命令使用注意: keys 不推荐在生产环境中使用。

  • keys 命令时间复杂度为 O(n),生产环境中键值对一般非常多,一次执行比较慢;
  • Redis是单线程命令,keys 命令执行会阻塞其他命令;
  • keys 命令取出所有的数据没什么意义。

如果真有要扫描所有的key的需求,比如将长期不用的 Key 输出出来,来提高内存的使用率,这种场景怎么使用呢? 除了使用 scan 命令以外还可以使用 热备从节点。主从复制 也就是从节点可以复制主节点的数据,可以认为主节点有什么数据,从节点也有什么数据,主节点加了什么数据,从节点就会立刻有什么样的数据,一般来说从节点不会给生产环境使用,就可以在从节点上执行一些比较重的命令,也就不会造成生产级别的危害。


  • dbsize: 计算 key 的总数。
# 删除所有key,仅测试演示使用
127.0.0.1:6381> FLUSHDB
OK
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4
OK
127.0.0.1:6379> dbsize
(integer) 4
127.0.0.1:6379> sadd myset a b c d e
(integer) 5
127.0.0.1:6379> dbsize
(integer) 5

dbsize 命令使用注意: dbsize 是可以在线上使用的。

  • 可能有人会认为 dbsize 会计算所有的键值总数,会把键值字典或者什么全局的表遍历一遍,实际上不是这样的。
  • 而是Redis内置了一个计数器,会实时更新数据库的key的总数,所以说 dbsize 可以在线上随便使用,它的时间复杂度是 O(1)。

  • exists key:检查 key 是否存在,存在返回1,不存在返回0,时间复杂度为O(1),可在线上使用。
127.0.0.1:6379> set a b
OK
127.0.0.1:6379> exists a
(integer) 1
127.0.0.1:6379> del a
(integer) 1
127.0.0.1:6379> exists a
(integer) 0

  • del key:删除指定的 key-value,也可以删除多个,成功删除返回 1,如果key 压根就不存在返回 0
127.0.0.1:6379> set a b
OK
127.0.0.1:6379> get a
"b"
127.0.0.1:6379> del a
(integer) 1
127.0.0.1:6379> get a
(nil)

  • expire key seconds:key 在指定秒数后过期,另外还可设置在某个时间戳过期、设置在多少毫秒内过期、设置在多少毫秒的时间戳过期。
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> expire hello 20
(integer) 1
127.0.0.1:6379> ttl hello
(integer) 17
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> ttl hello
(integer) 1
127.0.0.1:6379> ttl hello
(integer) -2
127.0.0.1:6379> get hello
(nil)

-2 表示这个 key 已经不存在了,已经超过了20s,在 expire 内部会将它执行 del 命令过期删除


  • ttl key:查看 key 剩余过期时间
  • persist key:去掉key的过期时间,过期时间就没了
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> expire hello 20
(integer) 1
127.0.0.1:6379> ttl hello
(integer) 17
127.0.0.1:6379> persist hello
(integer) 1
127.0.0.1:6379> ttl hello
(integer) -1
127.0.0.1:6379> get hello
"world"

-1 表示 key 存在,但没有设置过期时间。


  • type key:返回key的类型,类型有 string、hash、list、set、zset、none,none 表示在一个不存在的 key上执行type命令。
127.0.0.1:6379> set a b
OK
127.0.0.1:6379> type a
string
127.0.0.1:6379> sadd myset 1 2 3
(integer) 3
127.0.0.1:6379> type myset
set

  • 时间复杂度
命令时间复杂度
keysO(n)
dbsizeO(1)
delO(1)
existsO(1)
expireO(1)
typeO(1)

2字符串

2.1键值结构

Redis 所有的 key 都是字符串,value 就是常见的5种类型。value 可以是字符串、数字、二进制、json等。

keyvalue
helloworld
counter1
bits10111101
json{“product”: {“id”: “10000”, “name”: “jack”}}

注意

字符串的 value 不能大于 512MB。这个限制其实足够大了,如果真的要存一个值几百MB,首先在取的时候会消耗网络流量,其次读取的时候也非常慢,因为它有一定的网络开销,这个对于单线程来说也不是特别好,所以一般建议 key-value 在100KB以内。

2.2使用场景

  • 缓存
  • 计数器
  • 分布式锁
  • …

2.3命令(重点)

  • get key:获取 key 对应的 value,时间复杂度O(1)。
  • set key value:设置 key 对应的 value,时间复杂度O(1)。不管key是否存在都会设置,当重复设置时,后值覆盖前值。
  • del key:删除指定 key-value,时间复杂度O(1)。
# 首先判断 key 是否存在
127.0.0.1:6379> get hello
(nil)
# 对不存在的 key 设置
127.0.0.1:6379> set hello world
OK
# 获取
127.0.0.1:6379> get hello
"world"
# 再对已存在key进行设置
127.0.0.1:6379> set hello redis
OK
# 获取,发现原值已被覆盖
127.0.0.1:6379> get hello
"redis"
# 删除
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)

  • incr key:计数,key对应的value自增1,如果key不存在,value初始值为0,自增后get(key)=1,时间复杂度O(1)。
  • decr key:计数,key对应的value自减1,如果key不存在,value初始值为0,自减后get(key)=-1,时间复杂度O(1)。
  • incrby key k:计数,key对应的value自增k,如果key不存在,自增后get(key)=k,时间复杂度O(1)。
  • decrby key k:计数,key对应的value自减k,如果key不存在,自减后get(key)=-k,时间复杂度O(1)。

注意:如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

# 获取一个不存在的 key
127.0.0.1:6379> get counter
(nil)
# 自增
127.0.0.1:6379> incr counter
(integer) 1
127.0.0.1:6379> get counter
"1"
# 指定增量自增
127.0.0.1:6379> incrby counter 99
(integer) 100
# 自减
127.0.0.1:6379> decr counter
(integer) 99
# 指定增量自减
127.0.0.1:6379> decrby counter 99
(integer) 0
127.0.0.1:6379> get counter
"0"
# 设置一个错误的类型
127.0.0.1:6379> set hello world
OK
# 返回一个错误
127.0.0.1:6379> incr hello
(error) ERR value is not an integer or out of range

使用场景

  • 计数:如记录网站每个用户的个人主页访问量,比如 incr userid:pageview;
  • 缓存:如缓存视频基本信息,原始信息保存于 MySQL 中,为提供访问效率或并发量,将缓存信息保存于Redis中;
  • 分布式ID生成器:如多实例部署时通过Redis的原子单线程特点来获取一个自增的ID。

  • set key value:无论key是否存在都会设置,时间复杂度O(1)。
  • setnx key value:SET if Not eXists。当key不存在时才设置value,可理解为添加操作。当key已存在时,虽然设置失败但无报错(返回0)。时间复杂度O(1)。
  • set key value xx:当key存在时才设置,可以理解成更新操作,时间复杂度O(1)。
# 设置一个不存在key
127.0.0.1:6379> exists java
(integer) 0
127.0.0.1:6379> set java good
OK
# 设置一个已存在的key,返回0表示未设置成功
127.0.0.1:6379> setnx java bad
(integer) 0
# 更新一个已存在的key的value值
127.0.0.1:6379> set java best xx
OK
127.0.0.1:6379> get java
"best"
127.0.0.1:6379> exists php
(integer) 0
# 设置一个不存在的key的value
127.0.0.1:6379> setnx php best
(integer) 1
# 更新一个已存在的key的value
127.0.0.1:6379> set php easy xx
OK
127.0.0.1:6379> get php
"easy"
127.0.0.1:6379> exists lua
(integer) 0
# 更新一个不存在的key的值,更新失败
127.0.0.1:6379> set lua hehe xx
(nil)

  • mget key1 [key2 …]:批量获取key,原子操作,时间复杂度O(n)。
  • mset key1 value1 [key2 value2 key3 value3 …]:批量设置key-value,时间复杂度O(n)。
127.0.0.1:6379> mset hello world golang best php good
OK
127.0.0.1:6379> mget hello golang php
1) "world"
2) "best"
3) "good"

n次get 与 1次mget

需要执行n次get操作才能达到mget效果。其中最主要的是网络时间,我们的客户端和服务端一般都是不同的机器,它们在不同的机房甚至不同的地区,所以网络时间是个很大的开销,而命令时间本身开销很小,因为redis的执行速度非常快。

所以像 mget 操作就可以省去大量的网络时间,我们可以将一批命令批量的传给服务端,服务端会通过网络一次性将结果返回给我们,很多情况下这种方式效率是很高的。

但是需要注意 mget key的数量不是无限的。


  • getset key newvalue:为key设置新值并返回旧的value,时间复杂度O(1)。
  • append key value:将 value 追加到旧的value,时间复杂度O(1)。
  • strlen key:返回字符串的长度(注意中文),时间复杂度O(1)。
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> getset hello redis
"world"
127.0.0.1:6379> append hello ", mysql"
(integer) 12
127.0.0.1:6379> get hello
"redis, mysql"
127.0.0.1:6379> strlen hello
(integer) 12
127.0.0.1:6379> set china "中国"
OK
127.0.0.1:6379> strlen china
(integer) 6

  • incrbyfloat key 3.4:增加key对应的值3.4,没有自减命令,但是可以提供一个负数来达到递减效果,时间复杂度O(1)。
  • getrange key start end:获取字符串指定下标所有的值,时间复杂度O(1)。
  • setrange key index value:设置执行下标所有对应的的值,时间复杂度O(1)。
127.0.0.1:6379> incr counter
(integer) 1
127.0.0.1:6379> incrbyfloat counter 1.1
"2.1"
127.0.0.1:6379> get counter
"2.1"
127.0.0.1:6379> set hello javabest
OK
127.0.0.1:6379> getrange hello 0 2
"jav"
127.0.0.1:6379> setrange hello 4 p
(integer) 8
127.0.0.1:6379> get hello
"javapest"

2.4小结

命令含义时间复杂度
set key value设置key-valueO(1)
get key获取key-valueO(1)
del key删除key-valueO(1)
setnx、setxx根据key是否存在设置key-valueO(1)
incr、decr计数O(1)
mget、mset批量获取、设置key-valueO(n)

3哈希

3.1键值结构

key-value 结构,key 永远是字符串类型,value 分为两个部分:field 和 value,field 表示属性,value 表示具体值。

比如将 user:1:info 作为一个key,用户信息作为值。

可以往 hash 中添加一个新的值,也就是添加一个新的属性。

Hash 可以把一个key看做是一张表的表名,每个属性可以看做是关系型数据库的一张表的列,值就是每个列对应的值。

Hash 特点是 Mapmap,key-value 的结构,value 又是一个 map的结构,这个 map 也是一个key-value。

注意。哈希的value的属性不能相同。

3.2命令

所有hash命令都是以 h 开头。

  • hget key field:获取hash key 对应的 field 的value,时间复杂度O(1)。
  • hset key field value:设置hash key 对应的field的value,时间复杂度O(1)。
  • hdel key field:删除hash key对应的field的value,时间复杂度O(1)。
  • hgetall key:获取对应key对应的所有field与value,时间复杂度O(n)。
127.0.0.1:6379> hset user:1:info age 30
(integer) 1
127.0.0.1:6379> hget user:1:info age
"30"
127.0.0.1:6379> hset user:1:info name jack
(integer) 1
# 获取哈希所有属性和值
127.0.0.1:6379> hgetall user:1:info
1) "age"
2) "30"
3) "name"
4) "jack"
127.0.0.1:6379> hdel user:1:info age
(integer) 1
127.0.0.1:6379> hgetall user:1:info
1) "name"
2) "jack"

  • hexists key field:判断hash key是否有field,时间复杂度O(1)。
  • hlen key:获取hash key field的数量,时间复杂度O(1)。
127.0.0.1:6379> hgetall user:1:info
1) "name"
2) "jack"
3) "age"
4) "30"
127.0.0.1:6379> hexists user:1:info name
(integer) 1
127.0.0.1:6379> hexists user:1:info address
(integer) 0
127.0.0.1:6379> hlen user:1:info
(integer) 2

  • hmget key field1 field2 … fieldN:批量获取hash key的一批field对应的值。
  • hmset key field1 value1 field2 value2 … fieldN valueN:批量设置hash key的一批field value,时间复杂度O(n)。
127.0.0.1:6379> hmset user:2:info name tom age 20 sex 1
OK
127.0.0.1:6379> hlen user:2:info
(integer) 3
127.0.0.1:6379> hmget user:2:info name age
1) "tom"
2) "20"

  • hgetall:返回hash key对应所有的field和value,时间复杂度O(n)。
  • hvals key:返回hash key对应的所有field的value,时间复杂度O(n)。
  • hkeys key:返回hash key对应的所有field,时间复杂度O(n)。
127.0.0.1:6379> hgetall user:2:info
1) "name"
2) "tom"
3) "age"
4) "20"
5) "sex"
6) "1"
127.0.0.1:6379> hvals user:2:info
1) "tom"
2) "20"
3) "1"
127.0.0.1:6379> hkeys user:2:info
1) "name"
2) "age"
3) "sex"
  • hsetnx key field value:设置hash key对应的field的value(如field已经存在,则失败),时间复杂度O(1)。
  • hincrby key field inCounter:hash key对应的field的value自增inCounter,时间复杂度O(1)。
  • hincrbyfloat key field floatCounter:hincrby浮点数版,时间复杂度O(1)。

小心使用hgetall

hgetall 会返回所有的field和value,如果hash里面存了很多属性,比如1w条,每次使用hgetall的时候就要注意了,可能会比较慢,因为redis使用的是单线程,一般情况下,不会出现这种需要取出1w条的情况,而是取出部分属性。

3.3小结

  • string VS hash
stringhash
gethget
set、setnxhset、hsetnx
delhdel
incr、incrby、decr、decrbyhincrby
msethmset
mgethmget
  • 时间复杂度
命令时间复杂度
hget、hset、hdelO(1)
hexistsO(1)
hincrbyO(1)
hgetall、hvals、hkeysO(n)
hmget、hmsetO(n)

4列表类型

4.1键值结构

value 是个有序队列,可以进行左边的添加或左边的弹出,右边的添加或右边的弹出。

还可以计算列表的长度,删除列表中指定元素,还可以获取列表中的子列表,还可以根据索引来获取列表指定元素。

列表特点是列表是有序的、可重复的,根据插入的顺序最终决定遍历的顺序,另外还可以左右两边插入弹出。

4.2命令

所有列表命令都是以 l 开头。

  • rpush key value1 value2 … valueN:从列表右边插入元素(1-N个)。
  • lpush key value1 value2 … valueN:从列表左边插入元素(1-N个)。
  • linsert key before|after value newValue:从列表指定的值前|后插入新值。
127.0.0.1:6379> rpush listkey c b a
(integer) 3
127.0.0.1:6379> lpush listkey c b a
(integer) 6
127.0.0.1:6379> lrange listkey 0 10
1) "a"
2) "b"
3) "c"
4) "c"
5) "b"
6) "a"
# 在第一个满足条件的b之前插入了golang
127.0.0.1:6379> linsert listkey before b golang
(integer) 7
# 在第一个满足条件的b之后插入了php
127.0.0.1:6379> linsert listkey after b php
(integer) 8
127.0.0.1:6379> lrange listkey 0 10
1) "a"
2) "golang"
3) "b"
4) "php"
5) "c"
6) "c"
7) "b"
8) "a"

  • lpop key:从列表左侧弹出一个元素,时间复杂度O(1)。
  • rpop key:从列表右侧弹出一个元素,时间复杂度O(1)。
127.0.0.1:6379> lpop listkey
"a"
127.0.0.1:6379> lrange listkey 0 10
1) "golang"
2) "b"
3) "php"
4) "c"
5) "c"
6) "b"
7) "a"
127.0.0.1:6379> rpop listkey
"a"
127.0.0.1:6379> lrange listkey 0 10
1) "golang"
2) "b"
3) "php"
4) "c"
5) "c"
6) "b"
127.0.0.1:6379>

  • lrem key count value:根据counte的值,从列表中删除所有与value相等的项
  1. count > 0,从左到右,删除最多count个value相等的项
  2. count < 0,从右到左,删除最多Math.abs(count)个value相等的项
  3. count = 0,删除所有value相等的项

时间复杂度为O(n)。

127.0.0.1:6379> rpush listkey a c a c b f
(integer) 6
127.0.0.1:6379> lrange listkey 0 19
1) "a"
2) "c"
3) "a"
4) "c"
5) "b"
6) "f"
# 删除所有值为a的元素
127.0.0.1:6379> lrem listkey 0 a
(integer) 2
127.0.0.1:6379> lrange listkey 0 10
1) "c"
2) "c"
3) "b"
4) "f"
# 从右到左,删除值为c的元素
127.0.0.1:6379> lrem listkey -1 c
(integer) 1
127.0.0.1:6379> lrange listkey 0 10
1) "c"
2) "b"
3) "f"

  • ltrim key start end:按照索引范围修剪列表,只保留指定范围内的列表元素。索引从0开始。时间复杂度为O(n)。
127.0.0.1:6379> rpush listkey a b c d e f
(integer) 6
127.0.0.1:6379> lrange listkey 0 10
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
# 保留下标索引为1~4的元素。
127.0.0.1:6379> ltrim listkey 1 4
OK
# 此时索引也发生了变化,
127.0.0.1:6379> lrange listkey 0 10
1) "b"
2) "c"
3) "d"
4) "e"
# 保留索引0~2的元素
127.0.0.1:6379> ltrim listkey 0 2
OK
127.0.0.1:6379> lrange listkey 0 10
1) "b"
2) "c"
3) "d"

  • lrange key start end:包含end,获取列表指定索引范围所有元素。索引从左到右从0开始,索引从右到左从-1开始
127.0.0.1:6379> rpush listkey a b c d e f
(integer) 6
127.0.0.1:6379> lrange listkey 0 10
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
# 索引从右到左从-1开始,但是start~end仍然是按小到大的顺序
127.0.0.1:6379> lrange listkey -1 -3
(empty list or set)
127.0.0.1:6379> lrange listkey -3 -1
1) "d"
2) "e"
3) "f"
127.0.0.1:6379> lrange listkey 0 2
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> lrange listkey 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"

  • lindex key index:获取列表指定索引的元素
127.0.0.1:6379> lrange listkey 0 10
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> lindex listkey 0
"a"
127.0.0.1:6379> lindex listkey -1
"f"

  • llen key:获取列表长度,时间复杂度为O(1)。
127.0.0.1:6379> lrange listkey 0 10
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> lindex listkey -1
"f"
127.0.0.1:6379> llen listkey
(integer) 6

  • lset key index newValue:设置列表指定索引值为newValue。
127.0.0.1:6379>
127.0.0.1:6379> lrange listkey 0 10
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> lset listkey 2 golang
OK
127.0.0.1:6379> lrange listkey 0 10
1) "a"
2) "b"
3) "golang"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379>

  • blpop key timeout:b表示阻塞,blpop表示阻塞弹出,timeout是阻塞超时时间,timeout=0为永远阻塞,也就是一直死等,一直等到有需要的元素插入然后快速返回,时间复杂度为O(1)。
  • brpop key timeout:rpop 阻塞版本,timeout是阻塞超时时间,timeout=0为永远阻塞,也就是一直死等,一直等到需要的元素插入然后快速返回,时间复杂度为O(1)。

4.3TIPS

想做一个类似栈或队列的功能,可以参考以下公式:

  1. LPUSH + LPOP = Stack
  2. LPUSH + RPOP = Queue
  3. LPUSH + LTRIM = Capped Collection (固定数量的列表)
  4. LPUSH +BRPOP = Message Queue

5集合类型

5.1键值结构

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。集合对象的编码可以是 intset 或者 hashtable。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

特点

  • 集合中元素无序
  • 集合元素无重复
  • 支持集合间操作

5.2命令

所有列表命令都是以 s 开头。

  • sadd key elements:向集合key添加element(如果element已经存在,添加失败),时间复杂度为O(1)。
  • srem key element:将集合key中的element移除掉,时间复杂度为O(1)。
  • sinter
  • sdiff
  • sunion
# 向集合添加元素
127.0.0.1:6379> sadd user:1:follow a b c d
(integer) 4
# 计算集合大小
127.0.0.1:6379> scard user:1:follow
(integer) 4
# 判断元素 b 是否在集合中
127.0.0.1:6379> sismember user:1:follow b
(integer) 1
# 从集合中随机挑count个元素,这是随机挑选2个元素
127.0.0.1:6379> srandmember user:1:follow 2
1) "b"
2) "d"
# 从集合中随机弹出一个元素
127.0.0.1:6379> spop user:1:follow
"d"
# 获取集合所有元素
127.0.0.1:6379> smembers user:1:follow
1) "c"
2) "b"
3) "a"

注意

smembers 集合元素是无序的,但是需要小心使用,如果集合元素非常多,可能会阻塞Redis。 spop 是从集合中弹出元素,每次只弹出一个。 srandmember 不会破坏集合,并且可以返回多个元素。

5.3TIPS

  1. SADD = Tagging
  2. SPOP/SRANDMEMBER = Rrandom Item
  3. SADD + SINTER = Social Graph4
  4. sdiff|sinter|sunion + store destkey 将差集、交集、并集结果保存在destkey中

6有序集合类型

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。

6.1键值结构

集合 VS 有序集合

集合有序集合
无重复元素无重复元素
无序有序
elementscore + element

列表 VS 有序集合

列表有序集合
有重复元素无重复元素
有序有序
elementscore + element

6.2命令

所有列表命令都是以 z 开头。

  • zadd key score element:可以是多对,添加score和element,时间复杂度O(logN)。
127.0.0.1:6379> zadd user:1:grade 225 tom
(integer) 1
127.0.0.1:6379> zadd user:1:grade 220 jack
(integer) 1
  • zrem key element(可以是多个):删除元素,时间复杂度O(1)。
127.0.0.1:6379> zrem user:1:grade tom
(integer) 1
  • zscore key element:返回元素的分数,时间复杂度O(1)。
127.0.0.1:6379> zscore user:1:grade tom
"225"
  • zincrby key increScore element:增加或减少元素的分数,时间复杂度O(1)。
127.0.0.1:6379> zincrby user:1:grade 9 tom
"234"
  • zcard key:返回元素的总个数,时间复杂度O(1)。
127.0.0.1:6379> zcard user:1:grade
(integer) 2
  • zrange key start end [WITHSCORES]:返回指定索引范围内的升序元素[分值]。时间复杂度O(log(n) + m)。
127.0.0.1:6379> zrange user:1:grade 1 3 withscores
1) "tom"
2) "234"
  • zrangebyscore key minScore maxScore [WITHSCORES]:返回指定分数范围内的升序元素[分值]
127.0.0.1:6379> zrangebyscore user:1:grade 40 300 withscores
1) "jack"
2) "220"
3) "tom"
4) "234"
  • zcount key minScore maxScore:返回有序集合内在指定分数范围内的个数。时间复杂度O(log(n) + m)。
127.0.0.1:6379> zcount user:1:grade 200 221
(integer) 1
  • zremrangebyrank key start end:删除指定排名内的升序元素。O(log(n) + m)。
127.0.0.1:6379> zremrangebyrank user:1:grade 1 2
(integer) 1
  • zremrangebyscore key minScore maxScore:删除指定分数内的升序元素时间复杂度O(log(n) + m)。
127.0.0.1:6379> zremrangebyscore user:1:grade 90 230
(integer) 1