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

相关推荐
abigalexy3 分钟前
深入Redis集群模式-分布式缓存架构
redis·分布式
blurblurblun23 分钟前
Redis实战(7)-- 高级特性 Redis Stream数据结构与基础命令
数据库·redis·缓存
༺๑Tobias๑༻1 小时前
Linux下Redis常用命令
linux·前端·redis
永卿0011 小时前
mysql 日志机制
数据库·mysql
先鱼鲨生1 小时前
etcd 的安装与使用
数据库·etcd
crossoverJie3 小时前
StarRocks 如何在本地搭建存算分离集群
数据库·后端
转身後 默落3 小时前
05.Redis 图形工具RDM
redis
潇凝子潇3 小时前
如何在不停机的情况下,将MySQL单库的数据迁移到分库分表的架构上?
数据库·mysql·架构
Tapdata3 小时前
什么是 Operational Data Hub?它因何而生,又为何能够在当下成为技术共识?
数据库
这里有鱼汤4 小时前
普通人做量化,数据库该怎么选?
数据库·后端