代码改变世界

4、数据类型二:Lists

2016-07-03 13:41  宏愿。  阅读(414)  评论(0编辑  收藏  举报

 

1、关于list的组织形式

列表数据类型(Lists)可以存储一个有序的字符串列表,常用的操作时向列表两段添加元素,或者获取列表的某一个片段。列表类型的底层实现是一个双向链表(double linked list),所以向列表两端添加元素的时间复杂度为O(1),读取两端元素也非常快。同理,元素越是靠近中间位置,其读取速度越慢。

列表数据类型的组织形式如下:

              图1. list组织结构图

用双向链表(双向箭头)将许多的字符串组织成了一个list(方括号)。

 

2、list的命令集

LPUSH key value [value ...]
LPUSHX key value
RPUSH key value [value ...]
RPUSHX key value

LPOP key
BLPOP key [key ...] timeout
RPOP key
BRPOP key [key ...] timeout

RPOPLPUSH source destination
BRPOPLPUSH source destination timeout

LINSERT key BEFORE|AFTER pivot value
LREM key count value

LINDEX key index
LSET key index value
LLEN key

LRANGE key start stop

 ①、LPUSH key value [value ...] / RPUSH key value [value ...] / LPOP key / RPOP key

功能:类似于压栈和出栈操作,只是可以从两个方法分别进行。注意,空的列表key是不会存在的,即通过POP操作将所有列表中的value全部弹出时,key便会自动删除。

时间复杂度:O(1)

example:

 

 

②、LPUSHX key value / RPUSHX key value

功能:在做LPUSH之前或RPUSH之前首先检查key是否存在,如果存在则将value作push操作,否则不执行任何操作。

时间复杂度:O(1)

example:

 

③、BLPOP key [key ...] timeout / BRPOP key [key ...] timeout

功能:阻塞式弹出命令。如果key不存在,则等待,直到超时为止。

时间复杂度:O(1),不阻塞的情况下与LPOP或RPOP时间一样。

example

在第一个客户端中检测list不存在,使用阻塞的BLPOP list 300,这是阻塞时间为300秒。由于list为空,所有命令行不返回:

在第二个客户端中push一个list,此时list中有值了:

一旦list中有值出现,便返回:

 

④、RPOPLPUSH source destination / BRPOPLPUSH source destination timeout

功能:source通过RPOP命令弹出一个元素,并且将该元素通过LPUSH压入到destination中。BRPOPLPUSH是阻塞式命令。

时间复杂度:O(1)

example

 

 ⑤、LINSERT key BEFORE|AFTER pivot value

功能:向list中插入一个value值,插入的位置参考pivot。如果key不存在,则不作任何操作。如果pivot不存在,则返回-1

时间复杂度:O(N),其中N是找到pivot之前需要查找的value个数

example

 

⑥、LREM key count value

功能:删除key列表中前count个值等于value的元素。count取值:

    count > 0,则删除从左到右的前count个值等于value的元素

    count < 0,则删除从右到左的前count个值等于value的元素

    count = 0,则删除列表中所有值等于value的元素

时间复杂度:O(N),N表示列表的长度。

example

 

⑦、LSET key index value

功能:将列表中在index位置的元素值设置为value。

时间复杂度:O(N),N是列表的长度。如果设置第一个元素或最后一个元素,则时间复杂度为O(1)。 

example