Redis–list类型
有点像C++的vector,可以 O(1) 的进行 头插/头删/尾插/尾删,也可以通过下标获取对应的元素(O(N))。可以充当栈和队列,其底层有点像deque。
list里每个元素都是string类型。一个list 里的元素可以重复。
元素是有序的:[1,2,3]和[3,2,1] 是不同的列表。
题外话:很多时候同一个词有很多种理解!!如:栈/堆(数据结构里的,操作系统里的,JVM里的);同步(多线程里的互斥与同步,I/O中的同步与异步)
基本命令
1. lpush && lpop
l:left,从左侧插入删除,也就是头插头删
# 支持头插多个元素,依次头插,最后头插的元素在最前面。key不存在会创建一个 lpush key element [element ...] # count 表示删除几个元素 redis6.2以后支持 lpop key [count]
2. rpush && rpop
r:right,从右侧插入删除,尾插尾删
# 支持尾插多个元素,依次尾插,最后尾插的元素在最后面。key不存在会创建一个 rpush key element [element ...] rpop key [count]
3. lrange
l:list
查看某一范围的元素,支持负数。(-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 (少用)
阻塞式的pop 。当 pop时该list是空的,就会阻塞等待一段时间(可以自己设置)。
主要用来作为 消息队列 使用。
# 可以对多个key进行pop,从第一个key开始找,一旦有一个list里有元素可以pop就返回,后面的key不会进行删除 # 若多个客户端都阻塞等待一个key,那么当key有数据时最先调用的那个客户端会获得pop权,解除阻塞 # timeout 为阻塞时间,单位是秒,redis6以后支持设置成小数。 blpop key1 [key2 ...] timeout brpop key1 [key2 ...] timeout
list类型内部编码
redis4之前是 ziplist和linkedlist两类。ziplist节省空间,但是操作效率低,当数据较少时使用。
redis4之后合并了,只有一个 quicklist,这整体是一个linkedlist,其中每一个元素是一个 ziplist。保证每个ziplist存储元素不多,再整体连接起来。
list类型的应用场景
1. 作为消息队列(作为 阻塞式生产者消费者模型)
在实际中 消息队列 有专业的软件,即使是用redis来作为消息队列,也不会使用list类型,而是用stream类型。
这里借助 lpush 和brpop (或者反过来) 就可以实现基于轮询方案的 阻塞式生产者消费者模型。
当有多个list作为交易场所时就可以实现分频道的消息队列。
2. 用作数据列表
相当于vector的用处。
者反过来) 就可以实现基于轮询方案的 阻塞式生产者消费者模型。
当有多个list作为交易场所时就可以实现分频道的消息队列。
[外链图片转存中…(img-pS0xiRHE-1700646003032)]
2. 用作数据列表
相当于vector的用处。