Redis中的List数据类型

发布于:2025-09-08 ⋅ 阅读:(21) ⋅ 点赞:(0)

这里的list相当于数组或者顺序表,但是并非是一个简单的数组,而是更像双端队列

List的指令:

1.LPUSH key element  [element ......]

这是头插,一次可以插入一个元素,也可以同时插入多个元素。

时间复杂度是O(1),返回值是list的长度。但是操作的key已经存在,而且value不是list,那么下面操作就会报错。

第二个命令,就是查看list指定范围的,LRANGE

2.LRANGE key start stop

这里的start和stop是闭区间。同时下标也支持负数。

-1代表倒数第一个,以此类推。

3.LPUSHX key element [element.....]

x代表EXISTS,存在的意思。如果key不存在,则不能成功头插成功,返回0。

返回结果还是key对应list的长度。

4.RPUSH key element [element .....]

在尾部插入元素。

5.RPUSHX key element [element ....]

上面解释过了x的意思,x代表EXISTS,存在的意思。如果key不存在,则不能成功尾插成功,返回0。

6.LPOP key 头删 RPOP key尾删

返回的是删除的元素。

不存在就返回nil

注意:
如果搭配rpush和lpop,就可以把list当成队列使用。

如果搭配rpush和rpop,就相当于把list当成栈使用。

7.lindex key index

获取index下标的元素

如果不存在该下标,则返回nil

8.LINSERT key BEFORE/AFTER index element

   这里的index并不是下标,而是list其中的元素。

    element是指要插入的元素。

before/after代表要插在index之前还是之后。

返回值是list的长度。

如果使用了不存在的元素就会返回nil

9.LLEN key

查看list中的元素的个数,如果不存在该key,则返回0

10.LREM key count element

rem代表remove删除的意思。element代表删除的元素。

这里的count有不同的情况。

当count>0,则代表从左往右删除对应个数的element

当count<0,则代表从右往左删除对应个数的element

当count=0,则代表删除所有的的element

                      

11.LTRIM key start stop

保留start和stop区间内的元素,其他的元素全部删除。

即使越界了也可以删除成功。

12.LSET key index element

index是下标,这个指令是根据下标修改元素。

如果使用了不存在的下标,就会直接报错

List阻塞版指令:

BLPOP key [key ...] timeout   从左侧弹出第一个元素

BRPOP key [key ...] timeout   从右侧弹出最后一个元素

B代表是block(阻塞),使用blpop和brpop可以显式的设置阻塞时间(不一定是无休止的阻塞)

阻塞时只支持“队列为空”的情况,不考虑‘“队列满的情况”,因为满这个不好定义。

针对空列表进行处理

如果处理非空的列表

针对多个key进行操作

此时blpop阻塞中

List内部编码格式:

ziplist压缩列表 把数据按照更加紧凑的压缩形式进行表示,节省空间

linkedlist链表

上面的编码格式是之前的Redis使用的,现在的Redis使用的是quicklist,相当于链表和压缩列表的结合。

整体还是一个链表,但是每个节点是一个压缩列表。

这是关于Redis里面的具体配置数据。

也可以通过object encoding key进行查看具体的内部编码格式。

List的应用场景:

1.把List作为数组这样的结构,用来储存多个元素。

可以用来表示学生和班级的关系,Redis提供的查询能力不像MySQL这么强大。

2.使用Redis作为消息队列(生产者消费者模型)

谁先执行的这个brpop命令,谁就能先拿到新来的元素。

这样就构成了一个“轮询”的效果。

比如消费者执行顺序是 1 2 3 ,此时当新元素到达后,就会按照执行brpop的命令的先后来决定谁获取到的。

消费者1先拿到元素后,就从brpop中返回了,这个命令就执行完了,如果消费者1还想继续消费,就要重新执行brpop,然后就要“排队”到消费者3后面。

如果还有消费者4要消费,就更要“排队”了。这就是轮询的效果

3.微博TimeLine

1.有序性与插入效率:微博TimeLine需要按发布时间进行排序,List从lpush或者Rpush命令,能在O(1)的时间插入到头部或者尾部,保证时间不混乱。

2.高效的范围查询:用户查看TimeLine时,通常是加载最新的N条记录,或者翻看历史动态。List的LRANGE key start stop指令可以在O(k)的时间内查询到k条记录。无需全量遍历,反应速率快

3.天然的顺序维护:每条微博的插入都按照时间顺序进行插入,无需额外维护排序逻辑。且插入时已经按照时间排序了,不需要后续再进行排序。简化了TimeLine实现逻辑。


网站公告

今日签到

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