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从右侧取出元素,只有一个消费者能够抢到元素。