这里的list相当于数组或者顺序表,但是并非是一个简单的数组,而是更像双端队列
List的指令:
1.LPUSH key element [element ......]
这是头插,一次可以插入一个元素,也可以同时插入多个元素。
时间复杂度是O(1),返回值是list的长度。但是操作的key已经存在,而且value不是list,那么下面操作就会报错。
第二个命令,就是查看list指定范围的,LRANGE
2.LRANGE key start stop
这里的start和stop是闭区间。同时下标也支持负数。
-1代表倒数第一个,以此类推。
3.LPUSHX key element [element.....]
x代表EXISTS,存在的意思。如果key不存在,则不能成功头插成功,返回0。
返回结果还是key对应list的长度。
4.RPUSH key element [element .....]
在尾部插入元素。
5.RPUSHX key element [element ....]
上面解释过了x的意思,x代表EXISTS,存在的意思。如果key不存在,则不能成功尾插成功,返回0。
6.LPOP key 头删 RPOP key尾删
返回的是删除的元素。
不存在就返回nil
注意:
如果搭配rpush和lpop,就可以把list当成队列使用。
如果搭配rpush和rpop,就相当于把list当成栈使用。
7.lindex key index
获取index下标的元素
如果不存在该下标,则返回nil
8.LINSERT key BEFORE/AFTER index element
这里的index并不是下标,而是list其中的元素。
element是指要插入的元素。
before/after代表要插在index之前还是之后。
返回值是list的长度。
如果使用了不存在的元素就会返回nil
9.LLEN key
查看list中的元素的个数,如果不存在该key,则返回0
10.LREM key count element
rem代表remove删除的意思。element代表删除的元素。
这里的count有不同的情况。
当count>0,则代表从左往右删除对应个数的element
当count<0,则代表从右往左删除对应个数的element
当count=0,则代表删除所有的的element
11.LTRIM key start stop
保留start和stop区间内的元素,其他的元素全部删除。
即使越界了也可以删除成功。
12.LSET key index element
index是下标,这个指令是根据下标修改元素。
如果使用了不存在的下标,就会直接报错
List阻塞版指令:
BLPOP key [key ...] timeout 从左侧弹出第一个元素
BRPOP key [key ...] timeout 从右侧弹出最后一个元素
B代表是block(阻塞),使用blpop和brpop可以显式的设置阻塞时间(不一定是无休止的阻塞)
阻塞时只支持“队列为空”的情况,不考虑‘“队列满的情况”,因为满这个不好定义。
针对空列表进行处理
如果处理非空的列表
针对多个key进行操作
此时blpop阻塞中
List内部编码格式:
ziplist压缩列表 把数据按照更加紧凑的压缩形式进行表示,节省空间
linkedlist链表
上面的编码格式是之前的Redis使用的,现在的Redis使用的是quicklist,相当于链表和压缩列表的结合。
整体还是一个链表,但是每个节点是一个压缩列表。
这是关于Redis里面的具体配置数据。
也可以通过object encoding key进行查看具体的内部编码格式。
List的应用场景:
1.把List作为数组这样的结构,用来储存多个元素。
可以用来表示学生和班级的关系,Redis提供的查询能力不像MySQL这么强大。
2.使用Redis作为消息队列(生产者消费者模型)
谁先执行的这个brpop命令,谁就能先拿到新来的元素。
这样就构成了一个“轮询”的效果。
比如消费者执行顺序是 1 2 3 ,此时当新元素到达后,就会按照执行brpop的命令的先后来决定谁获取到的。
消费者1先拿到元素后,就从brpop中返回了,这个命令就执行完了,如果消费者1还想继续消费,就要重新执行brpop,然后就要“排队”到消费者3后面。
如果还有消费者4要消费,就更要“排队”了。这就是轮询的效果
3.微博TimeLine
1.有序性与插入效率:微博TimeLine需要按发布时间进行排序,List从lpush或者Rpush命令,能在O(1)的时间插入到头部或者尾部,保证时间不混乱。
2.高效的范围查询:用户查看TimeLine时,通常是加载最新的N条记录,或者翻看历史动态。List的LRANGE key start stop指令可以在O(k)的时间内查询到k条记录。无需全量遍历,反应速率快
3.天然的顺序维护:每条微博的插入都按照时间顺序进行插入,无需额外维护排序逻辑。且插入时已经按照时间排序了,不需要后续再进行排序。简化了TimeLine实现逻辑。