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

相关推荐
Elastic 中国社区官方博客6 小时前
搜索倍增器:推动收入、生产力和 AI 实现规模化
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
保定公民8 小时前
达梦数据库存储过程中的数组类型详解:基础数组与记录数组的差异化应用
数据库·达梦·存储过程·达梦数据库·dm8·dm
梦Arrebol8 小时前
Redis 内容及相关实验
数据库·redis
大模型码小白9 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
DBA大董10 小时前
TDengine3.0 DBA常用的运维命令和SQL2
运维·数据库·时序数据库·dba·tdengine
ManageEngineITSM11 小时前
什么是CMDB?配置管理数据库的定义、作用与建设方法一文讲清
大数据·数据库·人工智能·资产管理·变更管理
IvorySQL11 小时前
PostgreSQL 日报|PG19 外键快速路径隐患已修复(8 月 23 日)
数据库·postgresql
Elastic 中国社区官方博客11 小时前
OpenTelemetry Java 扩展:无需分叉 agent 即可自定义追踪
java·大数据·运维·开发语言·数据库·人工智能·elasticsearch
只爱喝胡辣汤11 小时前
Redis Intset(整数集合)技术文档
redis