目录
链表相当于数组或者是顺序表
在 list 中有下标的概念
list 是有序的
从左向右的下标是,从0开始,一直向后增加
从右向左的下标是,从最右边开始,下标为 -1 ,向左一直减少
链表中插入数据
lpush key value [value ...]
返回值是插入后,里面元素的总个数
lpush 是头插
可以一次插入多个元素
插入几个元素
- 127.0.0.1:6379> lpush key 111 222 333
- 3
继续插入到同一个 key里面
- 127.0.0.1:6379> lpush key 444 555 666
- 6
查看链表中的元素
lrange key start stop
返回值就是查到的元素
start 表示从那个位置开始
stop 表示从那个位置结束
这两个位置都是闭区间
其中这两个位置可以输入负数,负数表示的是从后面开始计算。
查看插入的全部数据
- 127.0.0.1:6379> lrange key 0 -1
- 666
- 555
- 444
- 333
- 222
- 111
0 表示从第 0 个位置开始,-1 表示到倒数第一个位置
上面查看插入的数据使用的是下标
既然是下标,那么就有可能会越界
那么 redis 对于越界是怎么样子的?
输入一段有问题的范围
- 127.0.0.1:6379> lrange key 0 6
- 666
- 555
- 444
- 333
- 222
- 111
继续输入有问题的范围
- 127.0.0.1:6379> lrange key 0 100
- 666
- 555
- 444
- 333
- 222
- 111
127.0.0.1:6379> lrange key 10 100 127.0.0.1:6379> lrange key 10 -100
上面的情况下 redis 并没有报错,而是讲你输入的范围里面有数据就取出来,没有数据就是空。
redis 这样设定,那么也就证明 redis 的容错能力跟强。
key 存在才插入
lpushx key value
返回值是插入后的总共元素个数
该命令是只有 key 存在才能插入
一次性也可以插入多个值
插入一个元素
- 127.0.0.1:6379> lpushx key 100
- 7
插入多个元素
- 127.0.0.1:6379> lpushx key 200 300
- 9
插入到不存在的 key 中
- 127.0.0.1:6379> lpushx key1 200 300
- 0
尾插
rpush key value [value ...]
返回值是插入后元素的所有个数
可以一次插入多个值
该命令是尾插
插入元素
- 127.0.0.1:6379> rpush key1 111 222 333
- 3
继续插入
- 127.0.0.1:6379> rpush key1 444 555 666
- 6
查看插入元素
- 127.0.0.1:6379> lrange key1 0 -1
- 111
- 222
- 333
- 444
- 555
- 666
尾插到存在的 key 中
rpushx key value
返回值是插入后元素的总个数
只能插入到存在的 key 中
可以插入多个元素
插入单个元素
- 127.0.0.1:6379> rpushx key1 100
- 7
插入多个元素
- 127.0.0.1:6379> rpushx key1 200 300
- 9
插入到不存在的 key 中
- 127.0.0.1:6379> rpushx key2 400
- 0
头删
lpop key
删除左侧元素
返回值就是删除掉的元素,如果没有元素,返回 nil
在 redis 6.2 以上版本该命令后面还有一个 count ,表示删除几个
删除元素
- 127.0.0.1:6379> lpop key1
- 111
查看
- 127.0.0.1:6379> lrange key1 0 -1
- 222
- 333
- 444
- 555
- 666
- 100
- 200
- 300
删除全部元素
- 127.0.0.1:6379> lpop key1
- 222
- 127.0.0.1:6379> lpop key1
- 333
- 127.0.0.1:6379> lpop key1
- 444
- 127.0.0.1:6379> lpop key1
- 555
- 127.0.0.1:6379> lpop key1
- 666
- 127.0.0.1:6379> lpop key1
- 100
- 127.0.0.1:6379> lpop key1
- 200
- 127.0.0.1:6379> lpop key1
- 300
- 127.0.0.1:6379> lpop key1
删除到最后删成了 nil,但是这里没有显示出来
尾删
rpop key
删除最右边的元素
剩下的特性和 lpop 一样
删除元素
- 127.0.0.1:6379> lpush key 111 222 333
- 3
- 127.0.0.1:6379> rpop key
- 111
查看删除后的结果
- 127.0.0.1:6379> lrange key 0 -1
- 333
- 222
全部删除
- 127.0.0.1:6379> rpop key
- 222
- 127.0.0.1:6379> rpop key
- 333
- 127.0.0.1:6379> rpop key
全部删除后,就变成 nil 了
上面的 list 可以灵活使用lpush 或者 rpush 或者 rpop 或者 lpop ,就可以达到栈或者队列的效果
返回指定位置的元素
lindex key index
返回值是指定位置的元素
下标从 0 开始
如果指定位置不在范围内,那么久返回 nil
index 还可以是负数,负数表示从后向前的位置
先插入元素
- 127.0.0.1:6379> lpush key 10 20 30 40 50
- 5
- 127.0.0.1:6379> lrange key 0 -1
- 50
- 40
- 30
- 20
- 10
查看元素
- 127.0.0.1:6379> lindex key 3
- 20
输入负数
- 127.0.0.1:6379> lindex key -1
- 10
查看不存在的位置
127.0.0.1:6379> lindex key 10
插入在指定元素前或者后
linsert key BEFORE|AFTER pivot value
返回值就是插入后的总共元素个数,如果该元素不存在,那么返回 -1
pivot 表示插入该基准值
BEFORE | AFTER 表示插入到该基准值的前或者后
由于list 可以重复,所以基准值可能存在多个,但是 redis 是从左边开始查找,遇到的第一个基准值
插入指定元素前面
- 127.0.0.1:6379> linsert key before 30 99
- 6
- 127.0.0.1:6379> lrange key 0 -1
- 50
- 40
- 99
- 30
- 20
- 10
插入到指定元素后面
- 127.0.0.1:6379> lrange key 0 -1
- 50
- 40
- 99
- 30
- 88
- 20
- 10
插入到不存在的位置
- 127.0.0.1:6379> linsert key after 100 10
- -1
返回 list 里面元素的个数
llen key
返回值是返回 key 对应 list 里面的元素个数,如果没有对应的 key,则返回 0
查看 key 里面的元素个数
- 127.0.0.1:6379> llen key
- 7
查看不存在的 key
- 127.0.0.1:6379> llen key1
- 0
删除指定元素 count 个
lrem key count value
value 表示要删除的元素
count 表示删除几个值为 value 的元素
但是 count 可以为 0 和 负数
count > 0 表示:从左往右开始删除 count 个元素
count < 0 表示:从右往左开始删除 count 个元素
count = 0 表示:删除值为 value 的全部元素
返回值就是删除成功的元素的个数
构建一个 list
- 127.0.0.1:6379> rpush key 1 2 3 4
- 4
- 127.0.0.1:6379> rpush key 1 2 3 4
- 8
- 127.0.0.1:6379> rpush key 1 2 3 4
- 12
- 127.0.0.1:6379> rpush key 1 2 3 4
- 16
- 127.0.0.1:6379> lrange key 0 -1
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
删除从左往右数的 2 个 1
- 127.0.0.1:6379> lrem key 2 1
- 2
查看
- 127.0.0.1:6379> lrange key 0 -1
- 2
- 3
- 4
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
重新构造案例
- 127.0.0.1:6379> flushall
- OK
- 127.0.0.1:6379> rpush key 1 2 3 4
- 4
- 127.0.0.1:6379> rpush key 1 2 3 4
- 8
- 127.0.0.1:6379> rpush key 1 2 3 4
- 12
- 127.0.0.1:6379> rpush key 1 2 3 4
- 16
删除从右往左数的 2 个 1
- 127.0.0.1:6379> lrem key -2 1
- 2
查看
- 127.0.0.1:6379> lrange key 0 -1
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 2
- 3
- 4
- 2
- 3
- 4
重新构造案例
删除全部的 1
- 127.0.0.1:6379> lrem key 0 1
- 4
查看
- 127.0.0.1:6379> lrange key 0 -1
- 2
- 3
- 4
- 2
- 3
- 4
- 2
- 3
- 4
- 2
- 3
- 4
删除指定范围的元素
ltrim key start stop
start 表示起始位置
stop 表示终止位置
这两个位置是闭区间
但是这里并不是删除 start ~ stop 中间的元素,而是保留该闭区间的元素,删除该范围外的所有元素
这两个位置同样可以为负数
返回值,删除成功
构建案例
- 127.0.0.1:6379> rpush key 1 2 3 4 5 6 7 8
- 8
删除 保留下标从 2 开始到 下标 5 的所有元素
- 127.0.0.1:6379> ltrim key 2 5
- OK
查看
- 127.0.0.1:6379> lrange key 0 -1
- 3
- 4
- 5
- 6
修改指定位置的元素
lset key index value
index 可以为负数
如果超出范围,则或报错
返回值,删除成功的话,返回 ok
构建案例
- 127.0.0.1:6379> rpush key 1 2 3 4 5 6 7 8
- 8
修改 index 为 5 的元素,修改为 60
- 127.0.0.1:6379> lset key 5 60
- OK
查看
- 127.0.0.1:6379> lrange key 0 -1
- 1
- 2
- 3
- 4
- 5
- 60
- 7
- 8
修改不存在的范围
- 127.0.0.1:6379> lset key 10 0
- ERR index out of range
这两个命令也是删除,功能基本和 lpop 和 rpop 的功能额基本相同
但是 blpop 和 brpop 是阻塞删除
如果 list 中有元素,那么 blpop 和 brpop 和 lpop 和 rpop 的功能一样
但是如果 list 中没有元素, 那么 lpop 和 rpop 就会返回 nil
而 blpop 和 brpop 则会阻塞
但是阻塞本本会根据 timeout,阻塞一段时间,期间 redis 可以执行其他命令
timeout 也是可以自行设置的
虽然说是阻塞,但是 blpop 和 brpop 并不会对 redis 产生负面影响
对于同一个元素来说,哪一个客户端先调用了 pop ,那么就先被哪一个客户端获取到
blpop key [key ...] timeout
brpop key [key ...] timeout
可以删除多个 key 里面的元素
timeout 的单位是 秒
返回值是一个而二元组
构建案例
- 127.0.0.1:6379> rpush key 1 2 3 4 5
- 5
对一个非空 key 进行操作
- 127.0.0.1:6379> blpop key 0
- key
- 1
这里看到返回值其实是一个二元组,是哪一个 key 里面删除的,删除的元素是哪个。
对空 key 进行操作
127.0.0.1:6379> blpop key1 5 对空 key 操作,这里就会阻塞5秒,然后返回 nil
对空 key 操作,然后又其他客户端插入数据
127.0.0.1:6379> blpop key1 100 刚开始是阻塞的
由其他客户端插入数据后
- 127.0.0.1:6379> rpush key1 10
- 1
阻塞删除的客户端立马返回数据
- 127.0.0.1:6379> blpop key1 100
- key1
- 10
其中 brpop 和 blpop 的阻塞时一样的,所以这里也就不演示了
ziplist: 压缩链表
linkedlist: 普通链表
但是这是之前的 list 采用的编码方式
现在的 list 采用的编码方式时 quicklist
quicklist 是一个链表,该链表里面的每个元素都是 ziplist
二 quicklist 里面的 ziplist 的长度都不会太长
无序集合
集合就是把一些右有关联的数据放到一起
集合中的元素是有序的!例如:[1,2,3] 和 [2,1,3] 是不同的
集合中的元素是不能重复的(唯一的)
集合中的每个元素也都是 string 类型的
向一个集合添加元素
sadd key member [member ...]
该命令可以一次添加一个元素,也可以一次添加多个元素
返回值就是本次添加成功的个数
添加元素
- 127.0.0.1:6379> sadd key 1 2 3 4
- (integer) 4
表示我们添加成功 4 个元素
添加重复元素
- 127.0.0.1:6379> sadd key1 1 1 2 3 4
- (integer) 4
这次添加了两个 1,下面显示我们添加了4 个元素,显然是重复的 1 值添加了一个
查看集合中的元素
smembers key
返回值就是对应 key 中所有的元素
如果没有返回空
查看
- 127.0.0.1:6379> smembers key
- 1) "1"
- 2) "2"
- 3) "3"
- 4) "4"
查看一个元素是否在集合中
sismember key member
返回值0 或者 1
0 表示没有
1 表示有
查看元素是否存在
- 127.0.0.1:6379> sismember key 1
- (integer) 1
- 127.0.0.1:6379> sismember key 100
- (integer) 0
随机删除一个 key 里面的元素
spop key [count]
count 表示删除几个元素,如果不写,就代表随机删除1 个,写了的话,那么就是我们写的个数
返回值,删除的元素
如果删除没有的 key 那么返回 nil
构建案例
- 127.0.0.1:6379> sadd key 1 2 3 4
- (integer) 4
删除一个值
- 127.0.0.1:6379> spop key
- "1"
删除全部的值
- 127.0.0.1:6379> spop key
- "1"
- 127.0.0.1:6379> spop key
- "3"
- 127.0.0.1:6379> spop key
- "2"
- 127.0.0.1:6379> spop key
- "4"
这就是删除的顺序,那么下一次我们还是随机删除吗?我们的随即删除是真随机还是对不同的集合删除的顺序不同?下面我们试一下。
重新构建
- 127.0.0.1:6379> sadd key 1 2 3 4
- (integer) 4
全部删除
- 127.0.0.1:6379> spop key
- "2"
- 127.0.0.1:6379> spop key
- "1"
- 127.0.0.1:6379> spop key
- "4"
- 127.0.0.1:6379> spop key
- "3"
这一次我们的删除顺序是和上一次时不同的,实际上,在官方文档里面也是表明了,redis 的spop 的删除就是随机删除。
获取集合中元素的个数
scard key
随机获得一个数
srandmember key [count]
count 为 获取到随机数的个数
返回值就是获取到的随机值
随机获取一个
- 127.0.0.1:6379> srandmember key
- "4"
将一个元素从一个集合移动到另一个集合
smove source destination member
该命令就表示把 memeber 从 source 移动到 destination
返回值,移动成功,返回 1,否则返回 0
移动元素
- 127.0.0.1:6379> smove key key1 1
- (integer) 1
- 127.0.0.1:6379> smove key key1 2
- (integer) 1
查看
- 127.0.0.1:6379> smembers key
- 1) "3"
- 2) "4"
- 127.0.0.1:6379> smembers key1
- 1) "1"
- 2) "2"
- 3) "5"
- 4) "6"
- 5) "7"
- 6) "8"
那么如果从 souce 里面移动的元素到 destination 里面有重复元素呢?
- 127.0.0.1:6379> sadd key 1
- (integer) 1
- 127.0.0.1:6379> sadd key1 1 2 3 4
- (integer) 4
将 1 从 key 里面移动到 key1 里面
- 127.0.0.1:6379> smove key key1 1
- (integer) 1
查看
- 127.0.0.1:6379> smembers key
- (empty list or set)
- 127.0.0.1:6379> smembers key1
- 1) "1"
- 2) "2"
- 3) "3"
- 4) "4"
那么如果 souce 里面没有要移动的元素呢?
- 127.0.0.1:6379> sadd key 2 3 4
- (integer) 3
- 127.0.0.1:6379> sadd key1 5 6 7 8
- (integer) 4
将 1 从 souce 移动到 destination 里面
- 127.0.0.1:6379> smove key key1 1
- (integer) 0
这里移动失败返回 0
删除集合中的元素
srem key member [member ...]
可以一次删除多个值
返回值就是删除成功的个数
构建案例
- 127.0.0.1:6379> sadd key 1 2 3 4
- (integer) 4
删除一个值
- 127.0.0.1:6379> srem key 4
- (integer) 1
删除多个值
- 127.0.0.1:6379> srem key 1 2 3
- (integer) 3
求多个集合的交集
sinter key [key ...]
返回值就是求到的交际的元素
构建案例
- 127.0.0.1:6379> sadd key1 1 2 3 4
- (integer) 4
- 127.0.0.1:6379> sadd key2 3 4 5 6
- (integer) 4
求交集
- 127.0.0.1:6379> sinter key1 key2
- 1) "3"
- 2) "4"
也是求交集
sinterstore destination key [key ...]
但是返回值不同,这个命令的返回值是交集元素的个数
destination 表示求到的交集存储到该key 里面
求交集
- 127.0.0.1:6379> sinterstore key3 key1 key2
- (integer) 2
查看
- 127.0.0.1:6379> smembers key3
- 1) "3"
- 2) "4"
查询集合的并集
sunion key [key ...]
返回值就是查询到的集合的并集
查询并集
- 127.0.0.1:6379> sunion key1 key2
- 1) "1"
- 2) "2"
- 3) "3"
- 4) "4"
- 5) "5"
- 6) "6"
也是查询并集
sunionstore destination key [key ...]
但是返回值不同,该命令返回值是查询到并集的个数
destination 是查询到的并集存储的 key
查看并集
- 127.0.0.1:6379> sunionstore key4 key1 key2
- (integer) 6
查询
- 127.0.0.1:6379> smembers key4
- 1) "1"
- 2) "2"
- 3) "3"
- 4) "4"
- 5) "5"
- 6) "6"
查询集合的差集
sdiff key [key ...]
返回值就是查询到的差集
查询差集
- 127.0.0.1:6379> sdiff key1 key2
- 1) "1"
- 2) "2"
由于 A 和 B 的差集 与 B 和 A 的差集是不同的,所以我们换一下位置
- 127.0.0.1:6379> sdiff key2 key1
- 1) "5"
- 2) "6"
查询差集
sdiffstore destination key [key ...]
返回值是查询到差集的个数
destination 是查询到的差集的存放的 key
查询差集
- 127.0.0.1:6379> sdiffstore key5 key1 key2
- (integer) 2
查询
- 127.0.0.1:6379> smembers key5
- 1) "1"
- 2) "2"
intset:整数集合,当元素均为整数,并且元素个数不是很多的时候,使用 intset
hashtable:哈希表
有序结合(升序或者降序)
排序规则:给 zset 引入了一个数属性 分数(score),浮点类型
每个 member 都会安排一个分数
进行排序的时候,就是一宅次数的分数大小来进行升序或者降序排序
里面的元素是不可以重复的,但是分数可以重复
zset 主要还是存储 member ,分数只是一个辅助
添加 zadd 类型元素
zadd key [NX|XX] [CH] [INCR] score member [score member ...]
[] 表示可选项
zadd 不仅有 member 还有 score ,所以在添加元素的时候还需要添加 score
NX 表示如果没有 member 那么就插入,有的话就不插入
XX 表示如果有 member 那么就跟新 score 否则就不跟新
如果 NX 和 XX 都不带的话,表示如果没有member 就插入 ,有的话就跟新 score
INCR 表示跟新 score 为新值,可以指定新值进行自增或者自减
CH 表示修改了分值的成员数量,包括添加新的成员和跟新了已存在的成员的分值
添加元素
- 127.0.0.1:6379> zadd key 98 貂蝉 99 林黛玉 97 女儿国王
- 3
查看 zadd 类型数据
zrange key start stop [WITHSCORES]
返回值就是查到的数据
start 和 stop 为范围,可以为负数
WITHSOCORES 表示显示的时候带上分数
查询
- 127.0.0.1:6379> zrange key 0 -1
- 女儿国王
- 貂蝉
- 林黛玉
带分数查询
- 127.0.0.1:6379> zrange key 0 -1 withscores
- 女儿国王
- 97
- 貂蝉
- 98
- 林黛玉
- 99
插入member 重复但是 score 不重复的值
- 127.0.0.1:6379> zadd key 100 林黛玉
- 0
查看
- 127.0.0.1:6379> zrange key 0 -1 withscores
- 女儿国王
- 97
- 貂蝉
- 98
- 林黛玉
- 100
NX:不存在即插入
- 127.0.0.1:6379> zadd key 110 貂蝉
- 0
查看
- 127.0.0.1:6379> zrange key 0 -1 withscores
- 女儿国王
- 97
- 林黛玉
- 100
- 貂蝉
- 110
XX :存在就修改,不存在不插入
- 127.0.0.1:6379> zadd key xx 95 大桥
- 0
查看
- 127.0.0.1:6379> zrange key 0 -1 withscores
- 女儿国王
- 97
- 林黛玉
- 100
- 貂蝉
- 110
CH:不存在插入,存在就修改 score
- 127.0.0.1:6379> zadd key ch 99 女儿国王
- 1
查看
- 127.0.0.1:6379> zrange key 0 -1 withscores
- 女儿国王
- 99
- 林黛玉
- 100
- 貂蝉
- 110
INCR:不存在插入,存在就修改 score,返回修改后的分数
- 127.0.0.1:6379> zadd key incr 66 廉颇
- 66
查看
- 127.0.0.1:6379> zrange key 0 -1 withscores
- 廉颇
- 66
- 女儿国王
- 99
- 林黛玉
- 100
- 貂蝉
- 110
获取当前 key 里面的元素个数
zcard key
返回在一定分数范围内的元素个数
zcount key min max
min 表示底分数线
max 表示高分数线
这两个分数线都是闭区间
如果想要是开区间,可以加 '('
min 和 max 还可以是 inf 和 -inf
查看所有人
- 127.0.0.1:6379> zrange key 0 -1 withscores
- 廉颇
- 66
- 西施
- 95
- 女儿国王
- 99
- 林黛玉
- 100
- 貂蝉
- 110
查看分数在 95 到 110 的人
- 127.0.0.1:6379> zcount key 95 110
- 4
不想包含 95
- 127.0.0.1:6379> zcount key (95 110
- 3
不想包含 110
- 127.0.0.1:6379> zcount key 95 (110
- 3
是的!上面并没有写错
两个都不想包含
- 127.0.0.1:6379> zcount key (95 (110
- 2
在说明一下,上面没有写错,就是这么个格式
使用 inf 和 -inf
- 127.0.0.1:6379> zcount key -inf inf
- 5
获取元素逆序的结果
zrevrange key start stop [WITHSCORES]
其他条件个 zrange 相同
查看逆序的元素
- 127.0.0.1:6379> zrevrange key 0 -1
- 貂蝉
- 林黛玉
- 女儿国王
- 西施
- 廉颇
也可以带 withscores
- 127.0.0.1:6379> zrevrange key 0 -1 withscores
- 貂蝉
- 110
- 林黛玉
- 100
- 女儿国王
- 99
- 西施
- 95
- 廉颇
- 66
该命令可以通过分数获得元素
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
limit offset count 可以限制获取到的个数
其余的和zrange 相同
获取元素
- 127.0.0.1:6379> zrangebyscore key 95 110
- 西施
- 女儿国王
- 林黛玉
- 貂蝉
剩下的就不进行示范了
删除有序集合中 score 最大的值
zpopmax key [count]
count 表示删除的个数,不写代表 1
返回值是删除后的元素(member 和 score)
删除一个元素
- 127.0.0.1:6379> zpopmax key
- 貂蝉
- 110
删除多个元素
- 127.0.0.1:6379> zpopmax key 2
- 林黛玉
- 100
- 女儿国王
- 99
阻塞删除分数最大的值
bzpopmax key [key ...] timeout
如果当前 key 有数据,那么就直接删除
如当前 key 没有数据,那么就会阻塞
timeout 表示超时时间,单位秒
如果没有数据,超出超时时间就会返回
返回值是 key 与 删除的元素还有 score
删除空 key
- 127.0.0.1:6379> flushall
- OK
- 127.0.0.1:6379> bzpopmax key 1
表示阻塞一秒,如果一秒内还没有数据,那么就会返回 nil
删除有数据的 key
- 127.0.0.1:6379> bzpopmax key 0
- key
- hello
- 1
删除 score 最小的值
zpopmin key [count]
该命令与 zpopmax 基本一样所以这里也就不多解释
阻塞删除 score 的最小值
bzpopmin key [key ...] timeout
该命令与 bzpopmax 一样,不解释
查看一个元素的排名
zrank key member
返回值是该元素的根据 score 的排名,默认升序
如果没有对应的 key 那么返回空
构建案例
- 127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu
- 3
查询元素
- 127.0.0.1:6379> zrank key zhangsan
- 0
- 127.0.0.1:6379> zrank key lisi
- 1
- 127.0.0.1:6379> zrank key oo
返回指定元素的排名
zrevrank key member
该命令和前面的 ZREVRANGE 是很相似的,都是从后往前
所以该命令获取到的排名是降序的排名
剩下的和 ZRANK 一样
删除指定的元素
zrem key member [member ...]
一次可以删除多个元素
返回值就是删除成功的元素个数
构建案例
- 127.0.0.1:6379> flushall
- OK
- 127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu 40 zhaoliu 50 tianqi
- 5
删除元素
- 127.0.0.1:6379> zrem key zhaoliu tianqi
- 2
查看是否删除
- 127.0.0.1:6379> zrange key 0 -1
- zhangsan
- lisi
- wangwu
删除一个范围内的元素
zremrangebyrank key start stop
根据下标的范围删除该范围内的元素
start 和 stop 是闭区间,也可以为负数
返回值是删除成功元素的个数
构建案例
- 127.0.0.1:6379> flushall
- OK
- 127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu 40 zhaoliu 50 tianqi
- 5
删除一个范围内的元素
- 127.0.0.1:6379> zremrangebyrank key 1 2
- 2
查看是否删除成功
- 127.0.0.1:6379> zrange key 0 -1
- zhangsan
- zhaoliu
- tianqi
删除一个范围的元素
zremrangebyscore key min max
不过这个范围是根据分数的范围
剩下的和上面的命令一样
构建案例
- 127.0.0.1:6379> flushall
- OK
- 127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu 40 zhaoliu 50 tianqi
- 5
删除元素
- 127.0.0.1:6379> zremrangebyscore key 30 50
- 3
查看是否被删除
- 127.0.0.1:6379> zrange key 0 -1
- zhangsan
- lisi
对指定元素的分数进行加一个值
zincrby key increment member
返回值就是该元素的分数增加指定分数后的分数
如果没有对应的 member 默认从 0 开始
构建案例
- 127.0.0.1:6379> flushall
- OK
- 127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu 40 zhaoliu 50 tianqi
- 5
对空member 进行增加
- 127.0.0.1:6379> zincrby key 1 sunba
- 1
查看
- 127.0.0.1:6379> zrange key 0 -1 withscores
- sunba
- 1
- zhangsan
- 10
- lisi
- 20
- wangwu
- 30
- zhaoliu
- 40
- tianqi
- 50
对指定元素进行增加一个值
- 127.0.0.1:6379> zincrby key 100 zhangsan
- 110
查看
- 127.0.0.1:6379> zrange key 0 -1 withscores
- sunba
- 1
- lisi
- 20
- wangwu
- 30
- zhaoliu
- 40
- tianqi
- 50
- zhangsan
- 110
对于 zset 在 6.2 版本后有 inter union zdiff 但是现在的测试版本是 5 系列的,所以并没有上述的命令,但是该版本有下面的两个命令:
求交集
zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
该命令就是求交集
求到的交集存储到 destination 中
numkeys 表示求交集的 key 一共有多少个
weights 表示权重
权重就是在求交集的时候,每个 key 里面的分数乘对应的权重
agreegate 表示求交集的时候分数如何处理,这里默认是分数求和,还可以取最大值,或者最小值
构建案例
- 127.0.0.1:6379> flushall
- OK
- 127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu
- 3
- 127.0.0.1:6379> zadd key1 15 zhangsan 25 lisi 35 zhaoliu
- 3
求交集,不带任何可选项
- 127.0.0.1:6379> zinterstore key2 2 key key1
- 2
查看求到的交集
- 127.0.0.1:6379> zrange key2 0 -1 withscores
- zhangsan
- 25
- lisi
- 45
如果什么都不带的话,就是默认,这里默认的分数就是 sum,不带权重的话,每个 key 的分数就是本身的分数
求交集,带权重
- 127.0.0.1:6379> zinterstore key3 2 key key1 weights 10 10
- 2
查看不到的交集
- 127.0.0.1:6379> zrange key3 0 -1 withscores
- zhangsan
- 250
- lisi
- 450
求交集,带aggregate
- 127.0.0.1:6379> zinterstore key4 2 key key1 aggregate max
- 2
查看求到的交集
- 127.0.0.1:6379> zrange key4 0 -1 withscores
- zhangsan
- 15
- lisi
- 25
求并集
zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
哪些参数和上面的那个命令的参数相同
下面也就不多演示了
ziplist:如果当前集合中的元素比较少,或者元素体积小,就会使用 ziplist
skiplist:如果当前元素个数比较多,或者是单个元素的提交较大,就会使用 skiplist