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

相关推荐
IvorySQL13 分钟前
聚焦六大功能:PostgreSQL 18 新特性深度解析
数据库·postgresql·开源
饿了我会自己捡代码吃21 分钟前
【MySQL】使用C/C++链接mysql数据库
c语言·数据库·mysql
gb421528737 分钟前
DDD 与传统三层架构的详细对比
数据库·架构
不是三毛没有半1 小时前
Mysql 简单的语句回顾
数据库·mysql·oracle
abcefg_h1 小时前
MySQL查询详细介绍
数据库·mysql
whn19772 小时前
批量获取oracle的AWR报告方法
数据库·oracle
小旺不正经3 小时前
数据库表实现账号池管理
数据库·后端·算法
sanx183 小时前
一站式电竞平台解决方案:数据、直播、源码,助力业务飞速启航
前端·数据库·apache·数据库开发·时序数据库
学IT的周星星3 小时前
《MyBatis变形记:当SQL遇上“智能管家“》
数据库·sql·mybatis