Redis数据结构之List

目录

    • 1.概述
    • 2.常见操作
      • [2.1 LPUSH/RPUSH/LRANGE](#2.1 LPUSH/RPUSH/LRANGE)
      • [2.2 LPOP/RPOP](#2.2 LPOP/RPOP)
      • [2.3 LINDEX](#2.3 LINDEX)
      • [2.4 LLEN](#2.4 LLEN)
      • [2.5 LREM](#2.5 LREM)
      • [2.6 LTRIM](#2.6 LTRIM)
      • [2.7 RPOPLPUSH](#2.7 RPOPLPUSH)
      • [2.8 LSET](#2.8 LSET)
      • [2.9 LINSERT](#2.9 LINSERT)

1.概述

  • List是简单的字符串列表,单key多个value,按照插入顺序排序。
  • 支持添加一个元素到列表的头部(左边)或者尾部(右边)

  • 它的底层实际是个双端链表,主要功能有push/pop等,用在栈,队列,消息队列等场景,left/right都可以插入添加,如果键不存在创建新的链表,键已存在,则新增内容,如果值全被移除了,对应的键也就消失了。

    双端链表两端操作的效率很高,通过索引下标的操作性能略有下降

  • 最多可以包含2³²-1个元素 (4294967295, 每个列表超过40亿个元素)。

2.常见操作

2.1 LPUSH/RPUSH/LRANGE

LPUSH将一个或多个值插入头部(左边),RPUSH是将一个或多个值插入尾部(右边)

案例:

text 复制代码
127.0.0.1:6379> lpush list1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> rpush list2 1 2 3 4 5
(integer) 5

LRANGE从头部开始遍历,获取元素,下标从0开始,0到-1是全部遍历

案例:

text 复制代码
127.0.0.1:6379> LRANGE list1 0 3
1) "5"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379> LRANGE list2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> LRANGE list1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"

不存在RRANGE命令

2.2 LPOP/RPOP

LPOP,从左侧弹出(移除)元素,RPOP从右侧弹出元素,被弹出的元素会被返回。

text 复制代码
127.0.0.1:6379> lrange list1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lpop list1 
"5"
127.0.0.1:6379> lpop list1 
"4"
127.0.0.1:6379> lpop list1 
"3"
127.0.0.1:6379> lpop list1 
"2"
127.0.0.1:6379> lpop list1 
"1"
text 复制代码
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> rpop list2
"5"
127.0.0.1:6379> rpop list2
"4"
127.0.0.1:6379> rpop list2
"3"
127.0.0.1:6379> rpop list2
"2"
127.0.0.1:6379> rpop list2
"1"

2.3 LINDEX

根据下标获取元素

text 复制代码
127.0.0.1:6379> rpush list1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lindex list1 0
"1"
127.0.0.1:6379> lindex list1 2
"3"

2.4 LLEN

元素个数,list.size();

text 复制代码
127.0.0.1:6379> lrange list1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> llen list1
(integer) 5

2.5 LREM

删除num个值是value的元素

text 复制代码
lrem key num value

例:

text 复制代码
127.0.0.1:6379> lpush list3 1 2 3 4 5 5 5 5 5 6 7 8
(integer) 12
127.0.0.1:6379> lrange list3 0 -1
 1) "8"
 2) "7"
 3) "6"
 4) "5"
 5) "5"
 6) "5"
 7) "5"
 8) "5"
 9) "4"
10) "3"
11) "2"
12) "1"
127.0.0.1:6379> lrem list3 2 5
(integer) 2
127.0.0.1:6379> lrange list3 0 -1
 1) "8"
 2) "7"
 3) "6"
 4) "5"
 5) "5"
 6) "5"
 7) "4"
 8) "3"
 9) "2"
10) "1"

2.6 LTRIM

截取指定范围的值后再赋给key

text 复制代码
LTRIM key start end

例:

text 复制代码
127.0.0.1:6379> rpush list1 1 2 3 4 5 6 
(integer) 6
127.0.0.1:6379> lrange list1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> LTRIM list1 3 5
OK
127.0.0.1:6379> lrange list1 0 -1
1) "4"
2) "5"
3) "6"

2.7 RPOPLPUSH

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

text 复制代码
RPOPLPUSH key source target

例:

text 复制代码
127.0.0.1:6379> lrange list1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> lrange list2 0 -1
1) "5"
2) "6"
3) "7"
4) "8"
127.0.0.1:6379> rpoplpush list1 list2
"4"
127.0.0.1:6379> lrange list1 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "5"
3) "6"
4) "7"
5) "8"

2.8 LSET

设置某个下标的值

text 复制代码
LSET key index value

例:

text 复制代码
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "5"
3) "6"
4) "7"
5) "8"
127.0.0.1:6379> lset list2  3 abc
OK
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "5"
3) "6"
4) "abc"
5) "8"

2.9 LINSERT

在某个已有值existValue前或后加个新的值newValue

text 复制代码
LINSERT key before|after existValue newValue

例:

text 复制代码
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "5"
3) "6"
4) "abc"
5) "8"
127.0.0.1:6379> LINSERT list2 before abc def
(integer) 6
127.0.0.1:6379> lrange list2 0 -1
1) "4"
2) "5"
3) "6"
4) "def"
5) "abc"
6) "8"
相关推荐
奋进的小暄2 小时前
数据结构(java)栈与队列
java·开发语言·数据结构
SnXJi_2 小时前
纷析云开源财务软件:企业财务数字化转型的灵活解决方案
java·gitee·开源·开源软件
pingzhuyan3 小时前
03(总)-docker篇 Dockerfile镜像制作(jdk,jar)与jar包制作成docker容器方式
java·docker·jar
caihuayuan44 小时前
Redis奇幻之旅(三)1.redis客户端与服务端
java·大数据·sql·spring·课程设计
匆匆整棹还5 小时前
关于tomcat乱码和idea中控制台乱码的问题
java·tomcat·intellij-idea
何似在人间5755 小时前
SpringAI+DeepSeek大模型应用开发——1 AI概述
java·人工智能·spring·springai
匹马夕阳6 小时前
Java开发中的设计模式之观察者模式详细讲解
java·观察者模式·设计模式
风铃儿~6 小时前
Java微服务注册中心深度解析:环境隔离、分级模型与Eureka/Nacos对比
java·分布式·微服务·面试
赤橙红的黄6 小时前
Spring Boot中接入DeepSeek的流式输出
java·服务器·javascript
小样vvv6 小时前
【AI】IDEA 集成 AI 工具的背景与意义
java·人工智能·intellij-idea