版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议
前言
继续学习操作 list 类型的命令,本来认为这些加“X”的命令处理起来会麻烦一点,结果看文档的时候发现 LPUSHX 和 RPUSHX 命令居然比 LPUSH 和 RPUSH 命令还要简单,接着是更加简单的获取列表长度的 LLEN 命令,鉴于这几个命令都太简单了,所以临时多学一个 LTRIM ,接下来看一下具体的用法吧。
这篇笔记中的4个命令分别是 LPUSHX 、 RPUSHX 、LLEN 、 LTRIM ,可以参考:
- 《Redis每日一练(21):LPUSH和LRANGE命令》 中的 LPUSH 命令
- 《Redis每日一练(22):LPOP、RPUSH和RPOP命令》 中的 RPUSH 命令
- 《Redis每日一练(18):HSETNX、HSTRLEN和HLEN命令》 中的 HLEN 命令
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>
复制
总结
- LPUSHX 命令可以在列表头部插入元素,当且仅当指定的键是一个列表时才能插入成功,返回列表元素个数,否则返回0
- RPUSHX 命令可以在列尾部部插入元素,当且仅当指定的键是一个列表时才能插入成功,返回列表元素个数,否则返回0
- LLEN 命令可以获取列表的长度,当指定的列表不存在是返回0
- LTRIM 命令可以根据指定的索引截取列表元素作为最终的结果,成功截取返回OK。
2019-12-10 20:22:24