前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Redis双向链表

Redis双向链表

作者头像
一个架构师
发布2022-06-20 19:44:31
发布2022-06-20 19:44:31
42600
代码可运行
举报
运行总次数:0
代码可运行

redis中的list是双向链表,能在列表的头部(左边)或者尾部(右边)操作元素.

它不仅可以作为链表使用;

还可以在头部进行压入和弹出操作作为使用;

在头部压入和尾部弹出作为队列或者阻塞队列使用;

下面是list相关常用命令

1. 在列表头部插入值

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> lpush key value1
(integer) 1
127.0.0.1:6379> lpush key value2
(integer) 2
127.0.0.1:6379> lpush key value3
(integer) 3
127.0.0.1:6379> lrange key 0 -1
1) "value3"
2) "value2"
3) "value1"

2. 在列表尾部插入值

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> rpush key value-1
(integer) 4
127.0.0.1:6379> rpush key value-2
(integer) 5
127.0.0.1:6379> lrange key 0 -1
1) "value3"
2) "value2"
3) "value1"
4) "value-1"
5) "value-2"

3. 在已存在的列表头部插入值,列表不存在时也不会新建列表

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379>
127.0.0.1:6379> lpushx key value4
(integer) 6
127.0.0.1:6379> lpushx key2 value4
(integer) 0
127.0.0.1:6379> lrange key 0 -1
1) "value4"
2) "value3"
3) "value2"
4) "value1"
5) "value-1"
6) "value-2"
127.0.0.1:6379> lrange key2 0 -1
(empty list or set)

4. 在已存在的列表尾部插入值,列表不存在时也不会新建列表

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> rpushx key value-3
(integer) 7
127.0.0.1:6379> lrange key 0 -1
1) "value4"
2) "value3"
3) "value2"
4) "value1"
5) "value-1"
6) "value-2"
7) "value-3"
127.0.0.1:6379> rpushx key2 value-3
(integer) 0
127.0.0.1:6379> lrange key2 0 -1
(empty list or set)

5. 获取列表指定范围内的元素

范围是从头部到尾部尾部选取 遍历方向是从头部到尾部,注意观察例子中几个空值的情况;

-n负数代表列表尾部第n个元素;

eg: -1代表列表尾部第一个元素

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> lrange key 0 -1
1) "value4"
2) "value3"
3) "value2"
4) "value1"
5) "value-1"
6) "value-2"
7) "value-3"
127.0.0.1:6379> lrange key 1 2
1) "value3"
2) "value2"
127.0.0.1:6379> lrange key 0 -1
1) "value4"
2) "value3"
3) "value2"
4) "value1"
5) "value-1"
6) "value-2"
7) "value-3"

从倒数第N个元素开始遍历

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> lrange key -1 2
(empty list or set)
127.0.0.1:6379> lrange key -1 -2
(empty list or set)
127.0.0.1:6379> lrange key -3 2
(empty list or set)
127.0.0.1:6379> lrange key -100 2
1) "value4"
2) "value3"
3) "value2"
127.0.0.1:6379> lrange key -10 -1
1) "value4"
2) "value3"
3) "value2"
4) "value1"
5) "value-1"
6) "value-2"
7) "value-3"
127.0.0.1:6379> lrange key -3 -1
1) "value-1"
2) "value-2"
3) "value-3"

6 .通过索引获取列表中的元素

代码语言:javascript
代码运行次数:0
复制

127.0.0.1:6379> lindex key 1
"value3"
127.0.0.1:6379> lindex key 2
"value2"
127.0.0.1:6379> lindex key 3
"value1"

7. 在列表的元素前或者后插入元素

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> linsert key before value4 before-value4
(integer) 8
127.0.0.1:6379> linsert key after value4 after-value4
(integer) 9
127.0.0.1:6379> lrange key 0 -1
1) "before-value4"
2) "value4"
3) "after-value4"
4) "value3"
5) "value2"
6) "value1"
7) "value-1"
8) "value-2"
9) "value-3"
127.0.0.1:6379>
127.0.0.1:6379> lpushx key value4
(integer) 10
127.0.0.1:6379> linsert key before value4 before-value4
(integer) 11
127.0.0.1:6379> linsert key after value4 after-value4
(integer) 12
127.0.0.1:6379> lrange key 0 -1
 1) "before-value4"
 2) "value4"
 3) "after-value4"
 4) "before-value4"
 5) "value4"
 6) "after-value4"
 7) "value3"
 8) "value2"
 9) "value1"
10) "value-1"
11) "value-2"
12) "value-3"

8. 通过索引设置列表元素的值

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> lset key 0 new-value1
ok
127.0.0.1:6379> lrange key 0 -1
 1) "new-value1"
 2) "value4"
 3) "after-value4"
 4) "before-value4"
 5) "value4"
 6) "after-value4"
 7) "value3"
 8) "value2"
 9) "value1"
10) "value-1"
11) "value-2"
12) "value-3"
127.0.0.1:6379> lset key -1 new-value-1
ok
127.0.0.1:6379> lrange key 0 -1
 1) "new-value1"
 2) "value4"
 3) "after-value4"
 4) "before-value4"
 5) "value4"
 6) "after-value4"
 7) "value3"
 8) "value2"
 9) "value1"
10) "value-1"
11) "value-2"
12) "new-value-1"

9. 获取列表长度,时间复杂度为O(1)

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> llen key
(integer) 12

10. 移出并获取列表的第一个元素

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> lpop key
"new-value1"
127.0.0.1:6379> llen key
(integer) 11
127.0.0.1:6379> lrange key 0 -1
 1) "value4"
 2) "after-value4"
 3) "before-value4"
 4) "value4"
 5) "after-value4"
 6) "value3"
 7) "value2"
 8) "value1"
 9) "value-1"
10) "value-2"
11) "new-value-1"

11. 移除列表的最后一个元素

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> rpop key
"new-value-1"
127.0.0.1:6379> lrange key 0 -1
 1) "value4"
 2) "after-value4"
 3) "before-value4"
 4) "value4"
 5) "after-value4"
 6) "value3"
 7) "value2"
 8) "value1"
 9) "value-1"
10) "value-2"
127.0.0.1:6379> lrange key 0 -1
 1) "value4"
 2) "after-value4"
 3) "before-value4"
 4) "value4"
 5) "after-value4"
 6) "value3"
 7) "value2"
 8) "value1"
 9) "value-1"
10) "value-2"
127.0.0.1:6379> llen key
(integer) 10

12. 移除列表中指定值元素

count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为count.

count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为count的绝对值.

count = 0 : 移除表中所有与 value 相等的值.

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> lrem key 2 value3
(integer) 1
127.0.0.1:6379> lrange key 0 -1
1) "value4"
2) "after-value4"
3) "before-value4"
4) "value4"
5) "after-value4"
6) "value2"
7) "value1"
8) "value-1"
9) "value-2"
127.0.0.1:6379> lrem key 0 value4
(integer) 2
127.0.0.1:6379> lrange key 0 -1
1) "after-value4"
2) "before-value4"
3) "after-value4"
4) "value2"
5) "value1"
6) "value-1"
7) "value-2"
127.0.0.1:6379> lrem key -1 value-2
(integer) 1
127.0.0.1:6379> lrange key 0 -1
1) "after-value4"
2) "before-value4"
3) "after-value4"
4) "value2"
5) "value1"
6) "value-1"

13. 删除列表指定区间之外的所有元素

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> ltrim key 2 3
ok
127.0.0.1:6379> lrange key 0 -1
1) "after-value4"
2) "value2"

14. 移除当前列表的最后一个元素,并将该元素添加到另一个列表并返回

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> rpoplpush key key2
"value2"
127.0.0.1:6379> lrange key 0 -1
1) "after-value4"
127.0.0.1:6379> lrange key2 0 -1
1) "value2"
127.0.0.1:6379>

15. 移出并获取列表的第一个元素, 如果列表没有元素会阻塞等待直到等待超时或发现可弹出元素为止。

与blpop类似的brpop,brpoplpush也是带超时时间的阻塞操作.

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> blpop key 10
1) "key"
2) "after-value4"

打开第二个客户端,并插入元素

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> lpush key1 v1
(integer) 1

第一个客户端弹出插入的元素

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> blpop key1 10
1) "key1"
2) "v1"
(3.61s)
127.0.0.1:6379>

当列表中不存在元素时,会等待超时并返回空值

代码语言:javascript
代码运行次数:0
复制
127.0.0.1:6379> blpop key1 10
(nil)
(10.04s)

了解了以上这些命令基本可以搞定你80%的工作了!~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从码农的全世界路过 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档