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.可以实现栈,队列

相关推荐
sky_81061336 分钟前
Oracle ERP 各模块业务管理功能及底层表说明
数据库·oracle
YMatrix 官方技术社区2 小时前
CittaBase vs. Neo4j :原生图性能实测与混合检索实践
数据库·功能测试·ymatrix
闲猫3 小时前
LangChain / Integrations / Integrations by component / Tool
java·数据库·langchain
xqqxqxxq3 小时前
SQL 连接查询技术笔记
数据库·笔记·sql
消失的旧时光-19433 小时前
第六篇:Redis Hash——一个用户对象应该保存成 JSON,还是保存成 Hash?
redis·json·哈希算法
Databend3 小时前
从万亿级大模型到全线应用:Databend Cloud 助力头部 AI 企业构建全链路 Trace 数据管道
大数据·数据库·sql
MC皮蛋侠客4 小时前
SQLAlchemy 系列(十一):从 1.x 到 2.x——渐进迁移与数据访问层治理
数据库·python
1001101_QIA4 小时前
工控机网络配置
开发语言·数据库·php
ClouGence4 小时前
加一张临时表,OceanBase Oracle 写入居然快了 30 倍!
数据库·sql·oracle