暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis每日一练(25):LREM和LINSERT命令

原创 AlbertS 2019-12-27
960

版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议

前言

今天这两个关于 list 类型的命令有些不同了,LREM是按值删除,LINSERT 是按基准值插入,这两个命令在之前没有什么可以参考的,但是可以看看 LPUSH 和 RPUSH 这两个分别在首尾插入的命令,简单的做个参考吧。

这篇笔记中的2个命令分别是 LREM 、 LINSERT ,可以参考:

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>

总结

  1. LREM 命令会删除列表中等于指定元素值的元素,至于删除的顺序和个数根据 count 参数的不同而有所差异。
  2. LINSERT 命令会在列表中插入元素,插入的位置是列表中基准元素的前面或后面,如果找不到基准元素会返回-1.

2019-12-11 20:31:57

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论