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

相关推荐
czhc114007566319 分钟前
LINUX712 MYSQL;磁盘分区;NFS
数据库·mysql·adb
不太可爱的大白1 小时前
Mysql:分库分表
数据库·mysql
十五年专注C++开发1 小时前
hiredis: 一个轻量级、高性能的 C 语言 Redis 客户端库
开发语言·数据库·c++·redis·缓存
bianguanyue2 小时前
SQLite密码修改故障排查:RSA加密随机性导致的数据库匹配问题
数据库·sqlite·c#
亚马逊云开发者3 小时前
将 Go 应用从 x86 平台迁移至 Amazon Graviton:场景剖析与最佳实践
linux·数据库·golang
张先shen4 小时前
亿级流量下的缓存架构设计:Redis+Caffeine多级缓存实战
数据库·redis·缓存
~ 小团子4 小时前
每日一SQL 【各赛事的用户注册率】
数据库·sql
llm2009094 小时前
Jmeter的JDBC数据库连接
数据库·jmeter
betazhou5 小时前
SQL server之版本的初认知
数据库·oracle·goldengate·sql server·ogg·gdr
superonion06205 小时前
【DB2】load报错SQL3501W、SQL3109N、SQL2036N
数据库