版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议
前言
今天这两个关于 list 类型的命令有些不同了,LREM是按值删除,LINSERT 是按基准值插入,这两个命令在之前没有什么可以参考的,但是可以看看 LPUSH 和 RPUSH 这两个分别在首尾插入的命令,简单的做个参考吧。
这篇笔记中的2个命令分别是 LREM 、 LINSERT ,可以参考:
- 《Redis每日一练(21):LPUSH和LRANGE命令》 中的 LPUSH 命令
- 《Redis每日一练(22):LPOP、RPUSH和RPOP命令》 中的 RPUSH 命令
LREM
- 最早出现版本:1.0.0
- 时间复杂度:O(N+M)(N是列表长度,N是移除的元素数量)
- 命令参数:LREM key count element
- 操作类型:lists
- 官方文档
作用
这个命令就是从列表中删除指定值的元素,看似简单,实际上却又有很多种情况。
当参数 count 大于0时,该命令会列表头开始向列表尾遍历,删除 count 个值为 element 的元素。
当参数 count 小于0时,该命令会列表尾开始向列表头遍历,删除 -count 个值为 element 的元素。
当参数 count 等于0时,该命令会移除列表中所有值为 element 的元素。
该命令返回删除的元素个数,对与不存的的键默认为空列表,返回0,但是如果操作的键不是 list 会报错。
练习
首先创建一个新的列表插入测试数据,先尝试 count > 0 的情况:
127.0.0.1:6379> LPUSH cache a 1 b 1 c 1 d 1 f 1 g 1 h 1 i 1
(integer) 16
127.0.0.1:6379> LRANGE cache 0 -1
1) "1"
2) "i"
3) "1"
4) "h"
5) "1"
6) "g"
7) "1"
8) "f"
9) "1"
10) "d"
11) "1"
12) "c"
13) "1"
14) "b"
15) "1"
16) "a"
127.0.0.1:6379> LREM cache 3 1
(integer) 3
127.0.0.1:6379> LRANGE cache 0 -1
1) "i"
2) "h"
3) "g"
4) "1"
5) "f"
6) "1"
7) "d"
8) "1"
9) "c"
10) "1"
11) "b"
12) "1"
13) "a"
127.0.0.1:6379>
在上个列子的基础上,测试 count < 0 的情况:
127.0.0.1:6379> LREM cache -2 1
(integer) 2
127.0.0.1:6379> LRANGE cache 0 -1
1) "i"
2) "h"
3) "g"
4) "1"
5) "f"
6) "1"
7) "d"
8) "1"
9) "c"
10) "b"
11) "a"
127.0.0.1:6379>
然后在上个例子的基础上再测试一下 count = 0 的情况:
127.0.0.1:6379> LREM cache 0 1
(integer) 3
127.0.0.1:6379> LRANGE cache 0 -1
1) "i"
2) "h"
3) "g"
4) "f"
5) "d"
6) "c"
7) "b"
8) "a"
LINSERT
- 最早出现版本:2.2.0
- 时间复杂度:O(1)(对于每一个元素来说)
- 命令参数:LINSERT key BEFORE|AFTER pivot element
- 操作类型:lists
- 官方文档
作用
这个命令就是往 list 中插入一个元素,插入的位置既不是头也不是尾,而是根据基准元素插入到这个基准元素之前或者之后,具体位置根据参数设定。
当列表中找不到基准元素或者指定的键不存在时不进行任何操作,当指定的键不是列表时会给出报错信息。
改命令返回成功插入后列表的元素个数,当未找到基准元素时返回-1。
练习
使用 LPUSH 命令同样创建一个列表,然后尝试在一个元素的前面插入元素:
127.0.0.1:6379> LPUSH alist a b c
(integer) 3
127.0.0.1:6379> LINSERT alist BEFORE b 1
(integer) 4
127.0.0.1:6379> LRANGE alist 0 -1
1) "c"
2) "1"
3) "b"
4) "a"
127.0.0.1:6379>
使用 LPUSH 命令同样创建一个列表,然后尝试在一个元素的后面插入元素:
127.0.0.1:6379> LPUSH bllist z x c
(integer) 3
127.0.0.1:6379> LINSERT bllist AFTER x 3
(integer) 4
127.0.0.1:6379> LRANGE bllist 0 -1
1) "c"
2) "x"
3) "3"
4) "z"
127.0.0.1:6379>
在上一个例子的基础上,指定一个不存在的基准元素,没有任何元素会被插入:
27.0.0.1:6379> LINSERT bllist AFTER zz 100
(integer) -1
127.0.0.1:6379> LRANGE bllist 0 -1
1) "c"
2) "x"
3) "3"
4) "z"
127.0.0.1:6379>
总结
- LREM 命令会删除列表中等于指定元素值的元素,至于删除的顺序和个数根据 count 参数的不同而有所差异。
- LINSERT 命令会在列表中插入元素,插入的位置是列表中基准元素的前面或后面,如果找不到基准元素会返回-1.
2019-12-11 20:31:57