概要
Redis中的list类型相当于双端队列,支持头插,头删,尾插,尾删,并且列表中的内容是可以重复的。
如果搭配使用rpush和lpop,那么就相当于队列
如果搭配使用rpush和rpop,那么就相当于栈
lpush
向列表中头插一个或多个元素,返回list的长度。如果key已经存在,并且对应的value不是list类型,则报错
当插入多个元素时,是一次头插,例如插入1,2,3,4,那么列表中是4,3,2,1
演示:
lrange
查看list指定区间内的元素,前闭后闭,支持负数(-1就相当于倒数第一个元素),下标从0开始,因此查看全部元素就是0,-1
演示:
展示的元素前面的序号并不是下标,而是结果集专用的序号
需要注意的是,如果我们给的下标超出了list的范围,如果是其他语言,可能就会报错或者抛出异常。但是在Redis中会尽可能的获取对应的内容,这体现了Redis的鲁棒性
lpushx
从左侧插入,当key不存在,用法和lpush一致,当key存在,则插入失败,返回0
演示:
Rpush
向列表中尾插一个或多个元素,返回list的长度。如果key已经存在,并且对应的value不是list类型,则报错
演示:
rpushx
从右侧插入,当key不存在,用法和lpush一致,当key存在,则插入失败,返回0
演示:
lpop
头删list中的元素,返回取出的元素的值。当列表为空则返回nil
演示:
rpop
尾删list中的元素,返回取出的元素的值。当列表为空则返回nil
演示:
lindex
获取到指定位置的元素,时间复杂度为O(N),如果下标非法则返回nil
演示:
linsert
在list的指定处插入元素,如果是before就插入在基准值前面,如果是after就插入到基准值后面,基准值是在list中存在的值而非下标,时间复杂度是O(N)
演示:
如果存在多个相同的基准值,那么只插入到第一个基准值处
llen
获取列表的长度,如果key不存在则返回0
lrem
删除指定的值,count为要删除的个数
count的值 | 作用 |
---|---|
count > 0 | 从头到尾,删除count个指定的元素 |
count < 0 | 删除所有指定的元素 |
count = 0 | 从尾到头,删除count个指定的元素 |
演示:
ltrim
保留列表中start和stop之间的元素,删除两边的元素
演示:
lset
根据指定的下标,修改元素,如果下标越界,则报错
演示:
blpop/brpop
类似于阻塞队列,如果队列为空,尝试出队列,阻塞队列根据阻塞时间产生阻塞,期间Redis可以执行其他命令,直到队列不空,返回元素(如果超时了就返回nil)
命令中可以设置多个key,从左到右遍历key,哪个key的list中不空,则返回元素
演示:
队列不为空:
队列为空时:
先设置过期时间是100s
这边的客户端就阻塞了,启动另一个服务器,往队列里插入元素
这个服务器插入完元素,上一个服务器就返回元素了
内部编码
编码方式 | 细节 |
---|---|
ziplist 压缩列表 | 列表元素个数小于512个同时每个元素的长度小于64字节 |
linkedlist 俩表 | 不满足上述条件 |
上述编码方式是老版本的Redis使用的,新版本的Redis使用了quicklist,相当于链表和压缩列表的结合,整体是一个链表,每个链表的节点是一个压缩链表
应用场景
作为数组存储多个元素
例如sql中有下面这两张表
那么在Redis中可以通过以下关联关系进行组织数据
作为消息队列
这三个消费者谁先执行brpop命令,谁就可以先拿到新来的元素