Redis---list类型

list的实现并非一个简单的数组,而是个接近于"双端队列"(std::deque)

列表中的元素是有序的,这里的有序不是指的"顺序",而是指的,因顺序变更得到的结果与变更之前是不等价的

列表中元素是可以重复的,hash中元素是不以重复的,意思是一个列表中可以有多个相同的值

LPUSH

对列表进行头插

操作格式:

lpush key element element...

返回值:

插入后list的长度

时间复杂度:

O(1)

举个例子:

cpp 复制代码
lpush key1 element1 element2 element3

LRANGE

获取从strent到end区间所有的元素,左闭右闭,下标支持负数

操作格式:

lange key start end

举个例子:

cpp 复制代码
lpush key1 element1 element2 element3
//获取还列表上的全部数据
lrange key 0 -1

如果取的数值越界了怎么办?

redis的做法,是直接尽可能的获取给定区间元素,如果给定区间越界,就会尽可能的获取对应内容

LPUSHX

如果key存在则完成头插操作,如果key不存在,则返回空,与EX特性比较相似

返回值:

插入后list的长度

时间复杂度:

O(1)

RPUSH/RPUSHX

X--->exists

与LPUSH/LPUSHX一样

LPOP

头删

操作格式:

lpop key count

在redis6.2版本,新增的count属性,原先是没有的,表示一次删除几个元素举个例子:

返回值:

删除的元素,或者为nil

时间复杂度:

O(1)

举个例子:

cpp 复制代码
lpush key1 element1 element2 element3
lpop key1 3

RPOP

尾删

操作格式:

rpop key count

注意:

在redis6.2版本,新增的count属性,原先是没有的,表示一次删除几个元素举个例子:

cpp 复制代码
rpush key1 element1 element2 element3
rpop key1 3

LINDEX

获取从左数第index位置的元素

操作格式:

lindex key index

返回值:

取出的元素或者nil

时间复杂度:

O(N),N为删除元素的个数,效率上一般情况下可以理解为O(1)

举个例子:

cpp 复制代码
lpush key element1 element2 element3 element4 element5
//取下标为前5的元素,并不拿第5个元素,这里的5可以理解为,拿前5个元素
lindex key1 5

LINSERT

进行任意位置的插入

操作格式:

linsert key <beffore | after> pivot element

pivot:在什么位置插入

<beffore | after>:在该位置的前或者后插入

举个例子:

cpp 复制代码
linsert key before 4 100
返回值:

list新长度

万一插入的列表中,基准值存在多个怎么办?

linsert进行插入的时候,要根据基准值,找到对应的位置,从左往右找,找到第一个复合基准值的位置即可

时间复杂度:

O(N),因为需要遍历列表,N表示列表的长度

LLEN

获取list的长度

操作格式:

llen key

返回值:

list的长度,若该key不存在,长度返回0

时间复杂度:

O(1)

LREM

rem--->remove

删除多个相同元素的值

操作格式:

lrem key count element

时间复杂度:

O(N + M),N是元素个数,M是你要删除的个数,可以理解为O(N)

count > 0,含义为从左往右找

count < 0,含义为从右往左找

count = 0,含义为element的全部元素

举个例子:

cpp 复制代码
rpush key1 1234
lrem key1 -1 2

LTRM

保留start到end之间的元素,区间外的全部被删除

操作格式:

ltrem key start end

时间复杂度:

O(N)

举个例子:

cpp 复制代码
lpush key1 1 2 3 4 5
ltrem key 2 5

LSET

根据下标,修改元素

操作格式:

lset key index element

时间复杂度:

O(N)

举个例子:

cpp 复制代码
lset key1 0 3

lset插入越界值的话会报错

阻塞版本命令

BLPOP/BRPOP

在list中有元素的时候,与lpop/rpop并无区别,但是在没有元素的时候,会进行阻塞等待,在等待期间redis可以执行其他命令,同时可以设置阻塞时间,不需要进行无休止的等待

blpop/brpop都是可以同时去尝试删除多个key列表上的元素,多个key对应多个list,这么多个list哪个有元素了,执行删除,立刻返回,并不是将所有的key都删除一遍,而是多个中成功删除一次就行

返回值:

被删除的元素

操作格式:

blpop/brpop keykey... timeout

timeout:单位是秒,redis6中单位允许设置成小数,redis5中时间只能设置成整数

举个例子:

cpp 复制代码
lpush key 1 2 3 4 5
bloop key  10

该组命令主要用途是做"消息队列"

list内部编码

在早些版本list的内部编码为

ziplist:

当存储内容长度小于配置的长度字节数,默认64字节,且元素个数也小于配置长度,默认为512个元素时选用ziplist作为list的内部编码

原因:

要求内容元素长度较短的原因是,因为会对内容进行压缩,那么就一定涉及到解压缩,内容过长就意味着解压缩时间过长,就会影响效率,所以在这时还不容不进行压缩使用linklist效率高

元素少就更好理解了,元素数量过多,就意味着遍历到目标元素的时间越长,进而影响效率

linkedlist

正常的链表格式

现在使用的编码格式quicklist

quicklist相当于链表和压缩链表的结合,整体还是一个链表,链表的每个节点是一个压缩列表

list应用场景

2.使用list做消息队列

3.可以实现栈,队列

相关推荐
人工智能培训2 小时前
世界模型内嵌,感知交互跃迁
大数据·数据库·人工智能·神经网络·生成对抗网络
隔壁阿布都2 小时前
ClickHouse完整指南
服务器·数据库·clickhouse
TDengine (老段)2 小时前
TDengine JOIN 完整语法 — Inner/Outer/ASOF/Window 全语法详解
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
ai_coder_ai2 小时前
编写自动化脚本,在自己后端服务中使用云原生Baas服务进行编码和解码相关操作
数据库·云原生·自动化
hehelm3 小时前
AI 大模型接入 SDK —项目概述
linux·服务器·网络·数据库·c++
xiaofeichaichai3 小时前
NestJS 实战:JWT 登录认证、Token 刷新与安全退出
redis·nestjs·jwt·twitter
Database_Cool_3 小时前
阿里云 Lindorm vs Elasticsearch 检索存储一体对比:多模数据库一站式方案首选
数据库·阿里云
大郭鹏宇4 小时前
下篇:LangChain Agent 智能体从入门到实战(二)—— 记忆管理、中间件与最佳实践
网络·数据库·人工智能
Icoolkj4 小时前
ICOOLKJ 前后端分离项目完整部署文档(MySQL8.4+Redis+JDK21+Nginx+HTTPS+自动同步演示库)
redis·nginx·https