Redis--list类型

Redislist类型

有点像C++vector,可以 O(1) 的进行 头插/头删/尾插/尾删,也可以通过下标获取对应的元素(O(N))。可以充当栈和队列,其底层有点像deque

list里每个元素都是string类型。一个list 里的元素可以重复。

元素是有序的:[1,2,3]和[3,2,1] 是不同的列表。

题外话:很多时候同一个词有很多种理解!!如:栈/堆(数据结构里的,操作系统里的,JVM里的)同步(多线程里的互斥与同步,I/O中的同步与异步)

基本命令

1. lpush && lpop

lleft,从左侧插入删除,也就是头插头删

# 支持头插多个元素,依次头插,最后头插的元素在最前面。key不存在会创建一个
lpush key element [element ...]

# count 表示删除几个元素 redis6.2以后支持
lpop key [count]

2. rpush && rpop

rright,从右侧插入删除,尾插尾删

# 支持尾插多个元素,依次尾插,最后尾插的元素在最后面。key不存在会创建一个
rpush key element [element ...]

rpop key [count]

3. lrange

llist

查看某一范围的元素,支持负数。(-1表示倒数第一个元素…)

如果下标非法,就尽可能的满足要求,并不会出错。(更像python)

# [begin, end] 下标从0开始
lrange key begin end

4. lpushx && rpushx

key存在时才插入,否则不会自己创建,直接返回。

lpushx key element [element ...]
rpushx key element [element ...]

5. lindex

通过下标获取元素。O(N) N是list中的元素个数。

lindex key index

6. linsert

在指定位置插入元素。O(N)

# 在指定元素 pivot 前/后 插入元素element
# 当元素 pivot 有多个时,就从左向右找第一个 pivot 进行插入 
linsert key begin|after pivot element

7. llen

获取list的元素个数。

llen key

8. lrem

删除元素。

# count == 0 删除所有的element
# count > 0 从左向右删除count个 element
# count < 0 从右向左删除count个 element
lrem key count element

9. ltrim

按范围删除元素。

# 只保留[start, end] (左闭右闭) 区间的元素,把两边的删除
ltrim key start end

10. lset

根据下标修改元素。O(N)

下标越界就报错。

# 将index下标处的元素修改成 element
lset key index element

11. blpop && brpop (少用)

阻塞式的poppop时该list是空的,就会阻塞等待一段时间(可以自己设置)。

主要用来作为 消息队列 使用。

# 可以对多个key进行pop,从第一个key开始找,一旦有一个list里有元素可以pop就返回,后面的key不会进行删除

# 若多个客户端都阻塞等待一个key,那么当key有数据时最先调用的那个客户端会获得pop权,解除阻塞

# timeout 为阻塞时间,单位是秒,redis6以后支持设置成小数。
blpop key1 [key2 ...] timeout
brpop key1 [key2 ...] timeout

list类型内部编码

redis4之前是 ziplistlinkedlist两类。ziplist节省空间,但是操作效率低,当数据较少时使用。

redis4之后合并了,只有一个 quicklist,这整体是一个linkedlist,其中每一个元素是一个 ziplist。保证每个ziplist存储元素不多,再整体连接起来。

list类型的应用场景

1. 作为消息队列(作为 阻塞式生产者消费者模型)

在实际中 消息队列 有专业的软件,即使是用redis来作为消息队列,也不会使用list类型,而是用stream类型。

这里借助 lpushbrpop (或者反过来) 就可以实现基于轮询方案的 阻塞式生产者消费者模型。

当有多个list作为交易场所时就可以实现分频道的消息队列。

在这里插入图片描述

2. 用作数据列表

相当于vector的用处。
者反过来) 就可以实现基于轮询方案的 阻塞式生产者消费者模型。

当有多个list作为交易场所时就可以实现分频道的消息队列。

[外链图片转存中…(img-pS0xiRHE-1700646003032)]

2. 用作数据列表

相当于vector的用处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月球上的星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值