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

Redis每日一练(24):LPUSHX、RPUSHX、LLEN、LTRIM命令

原创 AlbertS 2019-12-26
1076

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

前言

继续学习操作 list 类型的命令,本来认为这些加“X”的命令处理起来会麻烦一点,结果看文档的时候发现 LPUSHX 和 RPUSHX 命令居然比 LPUSH 和 RPUSH 命令还要简单,接着是更加简单的获取列表长度的 LLEN 命令,鉴于这几个命令都太简单了,所以临时多学一个 LTRIM ,接下来看一下具体的用法吧。

这篇笔记中的4个命令分别是 LPUSHX 、 RPUSHX 、LLEN 、 LTRIM ,可以参考:

LPUSHX

  • 最早出现版本:2.2.0
  • 时间复杂度:O(1)(对于每一个元素来说)
  • 命令参数:LPUSHX key element [element …]
  • 操作类型:lists
  • 官方文档

作用

这个命令与 LPUSH 命令作用一样,但是插入的条件不同。

LPUSHX 命令可以在列表的开始位置插入元素,但是指定的键必须存在且是一个列表,否则什么都不会发生,也不会报错,成功插入时返回列表元素个数,失败时返回0。

该命令在4.0及以上版本之后增加了多个参数的支持,可以一次性插入多个元素。

练习

使用 LPUSHX 命令无法创建一个列表,必须使用 LPUSH 或 RPUSH 命令创建完列表后才能使用 LPUSHX 进行插入:

127.0.0.1:6379> GET cache
(nil)
127.0.0.1:6379> LPUSHX cache 0
(integer) 0
127.0.0.1:6379> GET cache
(nil)
127.0.0.1:6379> LPUSH cache a b c
(integer) 3
127.0.0.1:6379> LPUSHX cache d
(integer) 4
127.0.0.1:6379> LPUSHX cache test
(integer) 5
127.0.0.1:6379> LRANGE cache 0 -1
1) "test"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379>
复制

RPUSHX

  • 最早出现版本:2.2.0
  • 时间复杂度:O(1)(对于每一个元素来说)
  • 命令参数:RPUSHX key element [element …]
  • 操作类型:lists
  • 官方文档

作用

这个命令与 LPUSHX 命令作用相对,同样是在指定的键必须存在且是一个列表的时候才能插入,否则什么操作也不会产生并且返回一个0,当成功插入时会返回列表中元素总个数。

该命令在4.0及以上版本之后增加了多个参数的支持,可以一次性插入多个元素,当前3.2.100版本只能一个一个插入了。

练习

使用 RPUSHX 命令同样无法创建一个列表,必须使用 LPUSH 或 RPUSH 命令创建完列表后才能使用 RPUSHX 进行插入:

127.0.0.1:6379> RPUSHX zlist one
(integer) 0
127.0.0.1:6379> GET zlist
(nil)
127.0.0.1:6379> RPUSH zlist one two three
(integer) 3
127.0.0.1:6379> RPUSHX zlist four
(integer) 4
127.0.0.1:6379> RPUSHX zlist ten
(integer) 5
127.0.0.1:6379> LRANGE zlist 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
5) "ten"
127.0.0.1:6379>
复制

LLEN

  • 最早出现版本:1.0.0
  • 时间复杂度:O(1)
  • 命令参数:LLEN key
  • 操作类型:lists
  • 官方文档

作用

返回列表的长度,若指定的键值不存在返回0,若指定的键不是一个 list,则 Redis 会给出错误信息。

练习

先查询一个不存在键的长度,插入数据后再查询,最后使用 LLEN 命令尝试查询其他类型的长度:

127.0.0.1:6379> GET zlist
(nil)
127.0.0.1:6379> LPUSH zlist a b c
(integer) 3
127.0.0.1:6379> LPUSH zlist test
(integer) 4
127.0.0.1:6379> LLEN zlist
(integer) 4
127.0.0.1:6379> SET name albert
OK
127.0.0.1:6379> LLEN name
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379>
复制

LTRIM

  • 最早出现版本:1.0.0
  • 时间复杂度:O(N)
  • 命令参数:LTRIM key start stop
  • 操作类型:lists
  • 官方文档

作用

截取索引指定范围内的元素作为一个新的列表,指定的键如果不是list而是其他类型则会报错,如果是一个不存在的键返回OK,不会产生任何操作。起始索引从0开始,第二个元素索引是1,依次递增,也可以使用负数索引,-1表示最后元素索引,-2表示倒数第二个,依次类推,该命令截取最后得到的列表包含端点元素。

如果起始索引大于结束索引得到的是一个空列表,如果结束索引大于列表结尾索引,则最大截取到列表末尾。

看到这个命令首先想到的是SQL中的trim函数,用来截取字符串前后的空格,后来看看 LTRIM 的这个命令又像是 Python 中的列表切片,只不过那个操作是生成一个副本,而 Redis 中的这个命令是作用在原列表上的。

练习

使用 LPUSH 命令先生成一个列表,然后使用 LTRIM 命令截取从索引2到索引4一共3个元素:

127.0.0.1:6379> LPUSH cache a b v  e r t
(integer) 6
127.0.0.1:6379> LPUSH cache test good
(integer) 8
127.0.0.1:6379> LRANGE cache 0 -1
1) "good"
2) "test"
3) "t"
4) "r"
5) "e"
6) "v"
7) "b"
8) "a"
127.0.0.1:6379> LTRIM cache 2 4
OK
127.0.0.1:6379> LRANGE cache 0 -1
1) "t"
2) "r"
3) "e"
127.0.0.1:6379>
复制

总结

  1. LPUSHX 命令可以在列表头部插入元素,当且仅当指定的键是一个列表时才能插入成功,返回列表元素个数,否则返回0
  2. RPUSHX 命令可以在列尾部部插入元素,当且仅当指定的键是一个列表时才能插入成功,返回列表元素个数,否则返回0
  3. LLEN 命令可以获取列表的长度,当指定的列表不存在是返回0
  4. LTRIM 命令可以根据指定的索引截取列表元素作为最终的结果,成功截取返回OK。

2019-12-10 20:22:24

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

评论