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

Redis每日一练(23):LSET和LINDEX命令

原创 AlbertS 2019-12-24
2002

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

前言

前两篇笔记学习了列表分别从两端添加元素和弹出元素,实际上这个列表类型还可以实现随机存取,貌似一转身又从 list 变成了 vector,可以按照索引来获取元素和设置元素。

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

LSET

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

作用

设置指定索引位置的元素,如果索引在列表中不存在,那么 Redis 会给出报错信息。

看到这个命令的时间复杂度,可以想象,还是在首尾添加元素快,如果通过索引设置指定位置的元素的值,貌似是通过遍历实现。

练习

使用 LPUSH 命令插入几个元素后,再通过 LSET 命令设置元素的值:

127.0.0.1:6379> LPUSH cache a 3 now test
(integer) 4
127.0.0.1:6379> LPUSH cache bg
(integer) 5
127.0.0.1:6379> LRANGE cache 0 -1
1) "bg"
2) "test"
3) "now"
4) "3"
5) "a"
127.0.0.1:6379> LSET cache 0 zz
OK
127.0.0.1:6379> LSET cache 4 end
OK
127.0.0.1:6379> LRANGE cache 0 -1
1) "zz"
2) "test"
3) "now"
4) "3"
5) "end"
127.0.0.1:6379>

测试当指定的列表不存在或者指定的索引不存在时:

127.0.0.1:6379> LSET cachelist 0 zz
(error) ERR no such key
127.0.0.1:6379> LRANGE cache 0 -1
1) "zz"
2) "test"
3) "now"
4) "3"
5) "end"
127.0.0.1:6379> LSET cache 6 go
(error) ERR index out of range
127.0.0.1:6379>

通过上面的测试发现,当指定的键不存在时报错ERR no such key,当指定的索引超过范围时报错ERR index out of range

LINDEX

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

作用

这个命令就是返回指定索引的元素,第一个元素的索引是0,第二个是1,依次类推,也可以使用负数索引,-1表示最后一个元素索引,-2表示倒数第二个元素的索引。

当指定的索引不存在或者指定的键不存在时返回nil,当指定的键不是list时会给出报错信息。

这个命令的名字感觉起的很奇怪,为什么叫 LINDEX 而不叫 LGET 呢? 我感觉 LGET 更符合他的含义,虽然是通过 index 获取元素,但是本质上是get啊!

练习

使用 RPUSH 命令创建列表并插入元素,然后使用 LINDEX 命令指定索引的元素:

127.0.0.1:6379> RPUSH cache z x c v
(integer) 4
127.0.0.1:6379> RPUSH cache 2 d 4
(integer) 7
127.0.0.1:6379> LRANGE cache 0 -1
1) "z"
2) "x"
3) "c"
4) "v"
5) "2"
6) "d"
7) "4"
127.0.0.1:6379> LINDEX cache 3
"v"
127.0.0.1:6379> LINDEX cache 5
"d"
127.0.0.1:6379>

当指定的索引不存在或者键不存在或者键不是一个list时:

127.0.0.1:6379> LRANGE cache 0 -1
1) "z"
2) "x"
3) "c"
4) "v"
5) "2"
6) "d"
7) "4"
127.0.0.1:6379> LINDEX cache 10
(nil)
127.0.0.1:6379> DEL cache
(integer) 1
127.0.0.1:6379> LINDEX cache 0
(nil)
127.0.0.1:6379> SET cache test
OK
127.0.0.1:6379> LINDEX cache test
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379>

总结

  1. LSET 命令可以修改列表中指定索引位置的元素,若索引不存在会报错。
  2. LINDEX 命令可以获取指定索引位置的元素,当索引不存在或者键不存在会返回nil。

2019-12-9 20:32:46

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

评论