Redis-list列表

发布于:2025-06-26 ⋅ 阅读:(20) ⋅ 点赞:(0)

1.介绍:

列表相当于列表或者顺序表,用来存储有序的元素,可以进行头插(lpush),头删(lpop)作为栈使用,还可以进行尾插(rpush),尾删(rpop)作为队列使用。列表中的每个字符串称为“元素”,一个列表最多存储2^32-1个元素;列表还有多种操作命令,是一种比较灵活的数据结构。

特点:

1.列表元素是有序的,因此可以通过下标获取到指定的元素;

(此处的有序指的是有顺序之分,而不是升序/降序的意思)

2.列表中的元素是可以重复的。

2.常用命令

lpush:

将一个或多个元素从左侧插入(头插)list中。

语法: lpush key elm [elm ...]

时间复杂度:O(N),N为插入元素的个数。

返回值:插入后list的长度。

lpushx:

当key存在时,从左侧插入(头插)一个或多个元素到list中,不存在时,直接返回。

语法: lpushx key elm [lem...]

时间复杂度:O(N),N为插入元素的个数。

返回值:插入后list的长度。

rpush:

将一个或多个元素从右侧插入(尾插)list中。

语法: rpush key elm [elm ...]

时间复杂度:O(N),N为插入元素的个数。

返回值:插入后list的长度。

rpushx:

当key存在时,从右侧插入(尾插)一个或多个元素到list中,不存在时,直接返回。

语法: rpushx key elm [lem...]

时间复杂度:O(N),N为插入元素的个数。

返回值:插入后list的长度。

lrange:

语法: lrange key start end

作用:获取list中从start到end区间的所有元素,左闭右闭。

时间复杂度:O(N),N为元素的个数

返回值:指定区间的元素。

注:

此处Redis的查询的下标不像java或C++,当访问下标越界时,就会报错;此处的区间是可以越界的,当区间不合法时,Redis会尽可能的返回对应的内容。

lrange key 0 -1:表示查询列表key的所有元素。

lpop:

语法:lpop key

作用:从list的左侧删除元素(头删);

时间复杂度:O(1)

返回值:删除的元素或nil

rpop:

语法:rpop key

作用:从list的右侧删除元素(尾删);

时间复杂度:O(1)

返回值:删除的元素或nil

lindex:

语法:lindex key index

作用:获取list从左边第index位置的元素。

时间复杂度:O(N),N为list中元素的个数。

返回值:取出的元素或nil.

linsert:

语法:linsert key <before|after> pivot elm

作用:往pivot元素的前面或后面插入元素elm;

时间复杂度:O(N),N为list中元素的个数。

返回值:插入后list的长度

当列表中有多个基准时,从左往右找,找到第一个符合基准值的位置即可:

llen:

语法:llen key

作用:获取列表key的长度

时间复杂度:O(1)

返回值:list的长度

lrem:

语法:lrem key count elm

作用:删除列表中count个elm元素,

当count>0时,从前往后删;count<0时,从后往前删;count=0时,删除列表中所有elm元素。

时间复杂度:O(1)

返回值:删除的元素个数

ltrim:

语法:ltrim key start end

作用:保留[start,end]区间的元素,其余元素都删除。

时间复杂度:O(1)

返回值:list的长度

lset:

语法:lset key index elm

作用:根据下标,修改元素,将index位置的元素修改成elm

时间复杂度:O(1)

返回值:ok/err

3.有关阻塞的命令:

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应⾮阻塞版本的作⽤基本⼀致,
阻塞的特点:

1.当队列不为空的时候,和非阻塞版本一样;当队列中没有元素时,非阻塞版本返回nul,阻塞版本就会根据设置的阻塞时间执行,先阻塞一段时间,期间Redis可以执行其他命令,一旦列表不为空,就会停止阻塞,执行pop操作。(并不会无休止的阻塞)

2.如果命令中设置了多个键,就会从左到右遍历键,一旦获取到元素,就会执行弹出元素,进行返回。

3.当多个客户端对一个键执行pop时,先执行命令的客户端会得到弹出的元素。

blpop:

lpop的阻塞版本,

语法:blpop key [key....] timeout

当列表为空时,就会执行timeout时间的阻塞;

时间复杂度:O(1)

返回值:取出的元素或nil

brpop:

rpop的阻塞版本,

语法:brpop key [key....] timeout

当列表为空时,就会执行timeout时间的阻塞,timeout的时间单位为秒;

时间复杂度:O(1)

返回值:取出的元素或nil

此时k2为空,阻塞版本删除元素,就会进入阻塞状态.

通过另一个redis客户端向k2中插入元素:

敲下回车执行后,阻塞的进程就会立即停止,返回删除的元素,和剩余的阻塞时间.

4.内部编码:

列表的内部编码有两种:

ziplist(压缩列表)和linkedlist(链表)。

分配规则:

1.当元素个数较少,且没有大元素时,内部编码为 ziplist;

2.当元素个数超过512时,或元素长度超过64字节时,内部编码为 linkedlist;

(ziplist作为列表的内部编码用来减少内存消耗)

5.使用场景

redis可以使用lpush和brpop命令组合实现经典的阻塞式生产者-消费者模型,生产者使用lpush从左侧插入元素,多个消费者使用brpop从右侧取出元素,只有一个消费者能够抢到元素。


网站公告

今日签到

点亮在社区的每一天
去签到