O(S+N),S为偏移量start,N为指定区间内元素的数量。
返回值:
一个列表,包含指定区间内的元素。
127.0.0.1:6379>rpush fp-language lisp # 插入一个值到列表fp-language
(integer)1
127.0.0.1:6379>lrange fp-language 0 0
1)"lisp"
127.0.0.1:6379>rpush fp-language scheme
(integer)2
127.0.0.1:6379>lrange fp-language 0 1
1)"lisp"
2)"scheme"
?
11、lrem
lremkey count value
根据参数count的值,移除列表中与参数value相等的元素。
count的值可以是以下几种:
count> 0: 从表头开始向表尾搜索,移除与value相等的元素,数量为count。
count< 0: 从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。
count= 0: 移除表中所有与value相等的值。
时间复杂度:
O(N),N为列表的长度。
返回值:
被移除元素的数量。
因为不存在的key被视作空表(empty list),所以当key不存在时,lrem命令总是返回0。
#先创建一个表,内容排列是
#morning hello morning helllo morning
127.0.0.1:6379>lpush greet "morning"
(integer)1
127.0.0.1:6379>lpush greet "hello"
(integer)2
127.0.0.1:6379>lpush greet "morning"
(integer)3
127.0.0.1:6379>lpush greet "hello"
(integer)4
127.0.0.1:6379>lpush greet "morning"
(integer)5
?
127.0.0.1:6379>lrange greet 0 4 # 查看所有元素
1)"morning"
2)"hello"
3)"morning"
4)"hello"
5)"morning"
?
127.0.0.1:6379>lrem greet 2 morning # 移除从表头到表尾,最先发现的两个morning
(integer)2 # 两个元素被移除
?
127.0.0.1:6379>llen greet # 还剩3个元素
(integer)3
?
127.0.0.1:6379>lrange greet 0 2
1)"hello"
2)"hello"
3)"morning"
?
127.0.0.1:6379>lrem greet -1 morning # 移除从表尾到表头,第一个morning
(integer)1
?
127.0.0.1:6379>llen greet
(integer)2
?
127.0.0.1:6379>lrange greet 0 1
1)"hello"
2)"hello"
?
127.0.0.1:6379>lrem greet 0 hello # 移除表中所有hello
(integer)2 # 两个hello被移除
?
127.0.0.1:6379>llen greet
(integer)0
?
12、lset
lsetkey index value
将列表key下标为index的元素的值甚至为value。
更多信息请参考lindex操作。
当index参数超出范围时,返回一个错误。
时间复杂度:
对头元素或尾元素进行lset操作,复杂度为O(1)。
其他情况下,为O(N),N为列表的长度。
返回值:
操作成功返回ok,否则返回错误信息。
127.0.0.1:6379>lpush job "cook food"
(integer)1
127.0.0.1:6379>lrange job 0 0
1)"cook food"
127.0.0.1:6379>lset job 0 "play game"
OK
127.0.0.1:6379>lrange job 0 0
1)"play game"
?
13、ltrim
ltrimkey start stop
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
举个例子,执行命令ltrim list 0 2,表示只保留列表list的前三个元素,其余元素全部删除。
下标(index)参数start和stop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。
你也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。
当key不是列表类型时,返回一个错误。
ltrim命令通常和lpush命令或rpush命令配合使用,举个例子:
lpushlog newest_log
ltrimlog 0 99这个例子模拟了一个日志程序,每次将最新日志newest_log放到log列表中,并且只保留最新的100项。注意当这样使用ltrim命令时,时间复杂度是O(1),因为平均情况下,每次只有一个元素被移除。
注意ltrim命令和编程语言区间函数的区别
假如你有一个包含一百个元素的列表list,对该列表执行ltrim list 0 10,结果是一个包含11个元素的列表,这表明stop下标也在ltrim命令的取值范围之内(闭区间),这和某些语言的区间函数可能不一致,比如Ruby的Range.new、Array#slice和Python的range()函数。
超出范围的下标
超出范围的下标值不会引起错误。
如果start下标比列表的最大下标end(llen list减去1)还要大,或者start > stop,ltrim返回一个空列表(因为ltrim已经将整个列表清空)。
如果stop下标比end下标还要大,Redis将stop的值设置为end。
时间复杂度:
O(N),N为被移除的元素的数量。
返回值:
命令执行成功时,返回ok。
#情况1:一般情况下标
127.0.0.1:6379>lrange alpha 0 -1 # 建立一个5元素的列表
1)"h"
2)"e"
3)"l"
4)"l"
5)"o"
?
127.0.0.1:6379>ltrim alpha 1 -1 # 删除索引为0的元素
OK
127.0.0.1:6379>lrange alpha 0 -1 # "h"被删除
1)"e"
2)"l"
3)"l"
4)"o"
#情况2:stop下标比元素的最大下标要大
127.0.0.1:6379>ltrim alpha 1 10086
OK
127.0.0.1:6379>lrange alpha 0 -1
1)"l"
2)"l"
3)"o"
#情况3:start和stop下标都比最大下标要大,且start < sotp
127.0.0.1:6379>ltrim alpha 10086 200000
OK
127.0.0.1:6379>lrange alpha 0 -1 # 整个列表被清空,等同于DEL alpha
(emptylist or set)
#情况4:start > stop
127.0.0.1:6379>lrange alpha 0 -1 # 在新建一个列表
1)"h"
2)"u"
3)"a"
4)"n"
5)"g"
6)"z"
127.0.0.1:6379>ltrim alpha 100