列表 List 相当于数组或者顺序表。
对于List来说,两侧都可以插入和删除,时间复杂度是O(1)。
有很多的操作,比如 llen 可以获取List的长度,lrem 可以删除元素 ,lrange可以去一个字符串 , lindex可以根据下标来取到具体的元素。
LPUSH LRANGE
LPUSH:将一个或者多个元素从左侧放入(头插)到list中。
LRANGE:查询指定区间中的元素。
LPUSH key element [element]
LRANGE key start stop
例如,插入的顺序是,4,3,2,1,那么此时list中的数字顺序为1,2,3,4
查询的时候,查询的是 0 到 -1 ,-1也就是指的是最后一个数字
要是此时只有8个元素,但是我们LRANGE key 0 100的时候,会尽可能的把所有的元素都显示出来,能尽可能获取则获取。
RPUSH
和LPUSH相对,R开头的是尾插。
RPUSHX
检测key是否存在,不存在则插入失败。
LPOP RPOP
删除操作,一个是从头删除,一个是从尾删除
搭配使用 RPUSH LPOP 就相当于队列。
搭配使用 RPUSH RPOP 就相当于栈。
LINDEX
给定下标,获取到对应的元素。
LINDEX key index
如果下标非法,返回的就是nil。并且LINDEX支持负数下标。
LINSERT
在指定位置插入元素。返回值是插入之后,得到的新元素的
LINSERT key <BEFORE | AFTER > pivot element
要是插入的是before 4,此时list中有两个4,会插入到第一个4的前面。后面的4不会处理。
LLEN
获取到当前key的长度,如果当前key不存在,则返回0。
LREM
LREM key count element
count表示要删除的个数,element表示要删除的值
- 如果count > 0 ,代表从左往右删除element,删完count的数量为止
- 如果count < 0 ,代表从右往左删除element,删完count的数量为止
- 如果count = 0 ,代表删除所有的element
LTRIM
LTRIM key start stop
保留start和stop之间的元素,剩下的删除。
LSET
LSET key index element
根据下标,修改元素。
BLPOP LPOP
LPOP 在之前已经有过介绍,是删除操作。,那加上了B的是什么操作呢?
BLPOP是 Blocking LPOP的缩写,也就是阻塞删除。要是list中没有元素,BLPOP会一直等待列表中有元素添加后,再删除。因此,这个命令通常实现在生产者 - 消费者模型,消费者等待生产者添加元素后再删除。
- BLPOP 在列表为空时会阻塞,直到有元素可以被弹出。
- LPOP 在列表为空时立即返回空值,不会等待。
小结:
操作类型 | 命令 | 时间复杂度 | 说明 |
---|---|---|---|
添加 | rpush | O(k),k是元素个数 | 将一个或多个值插入到列表的尾部 |
添加 | lpush | O(k),k是元素个数 | 将一个或多个值插入到列表的头部 |
查找 | linsert | O(n),n是pivot距离头尾的距离 | 在列表中的元素pivot前或后插入value |
查找 | lrange | O(s+n),s是start偏移量,n是start到end | 获取列表中指定范围内的元素 |
查找 | lindex | O(n),n是索引的偏移量 | 获取列表中指定索引的元素 |
查找 | llen | O(1) | 获取列表的长度 |
查找 | lpop | O(1) | 移除列表的第一个元素并返回 |
查找 | rpop | O(1) | 移除列表的最后一个元素并返回 |
删除 | lrem | O(k),k是元素个数 | 根据参数count移除列表中与value匹配的元素 |
删除 | ltrim | O(k),k是元素个数 | 保留列表中指定范围内的元素 |
修改 | lset | O(n),n是索引的偏移量 | 设置列表中指定索引的元素值为value |
阻塞 | blpop | O(1) | 阻塞直到列表中有元素可弹出 |
阻塞 | brpop | O(1) | 阻塞直到列表中有元素可弹出 |
内部编码
列表类型的内部编码有两种:Ziplist 和 Linkedlist
在redis 3.2版本引入了一种新的列表数据结构,用来替代 Ziplist 和 Linkedlist :
Quicklist,快速列表,是一种双向列表,每一个节点都是一个Ziplist ,并且结合了 Ziplist 的内存效率和 Linkedlist的性能。因为 Quicklist 整体是一个链表,链表的每一个节点都是一个压缩列表。
让每个压缩列表都不会太大,同时再把多个压缩列表通过链表的结构连接起来。