Redis数据类型之list

上篇文章:

Redis数据类型之hashhttps://blog.csdn.net/sniper_fandc/article/details/149139615?fromshare=blogdetail&sharetype=blogdetail&sharerId=149139615&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

目录

[1 lpush、lpushx和lrange](#1 lpush、lpushx和lrange)

[2 rpush和rpushx](#2 rpush和rpushx)

[3 lpop和rpop](#3 lpop和rpop)

[4 lindex、linsert和llen](#4 lindex、linsert和llen)

[5 lrem](#5 lrem)

[6 ltrim和lset](#6 ltrim和lset)

[7 blpop和brpop](#7 blpop和brpop)

[8 list的使用场景](#8 list的使用场景)


list是列表,实际上更接近双端队列,支持头插、尾差、头删和尾删等基本操作,可以用来充当栈或队列的使用。

1 lpush、lpushx和lrange

命令:lpush key value1 value2 ...

头插插入list多个元素。时间复杂度O(N),N表示插入元素的个数。返回值是list的长度。如果key不存在就创建;如果key存在就头插。因为是头插,所以最后插入的元素会在list的第一个位置。

命令:lrange key start end

查询list下标范围start,end的元素。时间复杂度O(N),N表示查询元素的个数。返回值按下标顺序的各元素。同样,下标也支持负数下标(表示倒数第几个)。如果下标超出范围,redis就会尽可能纠正下标到正确范围

命令:lpushx key value1 value2 ...

如果key存在,头插插入list多个元素;否则不插入。时间复杂度O(N),N表示插入元素的个数。返回值是list的长度。

2 rpush和rpushx

命令:rpush key value1 value2 ...

尾插插入list多个元素。时间复杂度O(N),N表示插入元素的个数。返回值是list的长度。如果key不存在就创建;如果key存在就尾插。因为是尾插,所以最先插入的元素会在list的第一个位置。

命令:rpushx key value1 value2 ...

如果key存在,尾插插入list多个元素;否则不插入。时间复杂度O(N),N表示插入元素的个数。返回值是list的长度。

3 lpop和rpop

命令:lpop key

头删key的list的元素。时间复杂度O(1)。返回值是被删除的元素或nil。

命令:rpop key

尾删key的list的元素。时间复杂度O(1)。返回值是被删除的元素或nil。

可以搭配lpush和rpush实现队列或栈。(lpush和lpop)或(rpush和rpop)是栈,(lpush和rpop)或(rpush和lpop)是队列。

注意:在redis 6.2版本后引入count参数可以一次删除多个元素。比如lpop key count,连续头删key对应list的count个元素。

4 lindex、linsert和llen

命令:lindex key index

获取list中下标index的元素。时间复杂度O(N),N是list的长度,这里因为list的底层实现可能是链表,链表查询是O(N)的复杂度。返回值是查询的元素或nil。

命令:linsert key before | after element value

在element元素前(before)或后(after)插入value。时间复杂度O(N),N是list的长度。返回值是list的长度。

如果list中有重复的元素,就会从list头开始从左向右遍历找到第一个重复的元素进行插入:

命令:llen key

返回list的长度。时间复杂度O(1)。

5 lrem

命令:lrem key count element

删除list中count个元素element。时间复杂度O(N+M),N是list长度,M是删除的个数。如果count>0,从左往右删:

如果count<0,从右往左删:

如果count==0,删除全部满足value==element的元素:

6 ltrim和lset

命令:ltrim key start end

保留start,end的元素,其余的全部删除。时间复杂度O(N),N是list长度。

命令:lset key index element

把下标index的元素修改为element。时间复杂度O(N),N是list长度。如果下标越界则报错。

7 blpop和brpop

blpop和brpop是lpop和rpop的阻塞版本,即当list为空时,执行blpop和brpop会阻塞(在此期间redis服务器可以执行其他命令),直到超出设置的阻塞时间或list不空;如果list不空,执行效果就如同lpop和rpop。

blpop和brpop命令可以同时指定多个key,从左向右遍历key,只要有一个key的list弹出元素,就视为执行成功,命令立即返回。

如果多个客户端并发对一个key执行blpop或brpop,在list为空时,如果阻塞时间内list有新元素,则会优先给最先执行的命令返回元素。

命令:blpop key1 key2 ... timeout

返回值是二元组,包括哪个key和对应弹出的元素。

当list6和list7都没有元素了,此时再执行命令就会阻塞,直到其他客户端使用相关命令向list6或list7插入元素。

31.63s表示阻塞的时间。brpop命令类似,不再演示。

注意:timeout在redis 5设置时必须是整数的秒,但是redis 6以后就引入了小数的秒。

8 list的使用场景

list最常用于多个同属于一个元素的值的存储(一对多场景),比如一个班级有多个学生。还有个作用是作为消息队列使用:消息队列需要使用阻塞队列作为数据结构,而list的实现类似双端队列,提供两端的存和取。利用lpush和brpop(需要用到阻塞),可以实现生产者往阻塞队列放元素,消费者取元素,如果没有元素可取就阻塞等待。

在分布式系统中,往往需要解耦。对消息的传递也可以解耦,即利用多个频道,每个频道传递不同的消息,生产者负责往不同频道写消息,消费者负责从多个不同频道读消息,这里的多个频道就是多个list。

下篇文章:

Redis数据类型之sethttps://blog.csdn.net/sniper_fandc/article/details/149139848?fromshare=blogdetail&sharetype=blogdetail&sharerId=149139848&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

相关推荐
掉头发的王富贵1 小时前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
Nturmoils2 小时前
WHERE 条件别凭习惯写,常用查询先跑一遍
数据库
云技纵横4 小时前
一个 @Async 让循环依赖暴雷:Spring 代理的暗坑
redis
Databend1 天前
在 AWS 中国峰会逛了一天,我在 Databend 展台看到了 Agent 数据基础设施的新思路
数据库·人工智能·agent
犯困蛋挞yy1 天前
用Claude快速解决Redis代码报错反复无解的问题
redis
ClouGence2 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
飞将2 天前
从零实现数据库(2)——HashIndex + IndexManager
数据库
Nturmoils3 天前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
渣波3 天前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
倔强的石头_4 天前
KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测
数据库