redis之list

1.LINDEX

返回列表key中,下标为index的元素

下标(index)参数starttop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。

你也可以使用负数下标,以-1表示列表的最后一个元元素,-2表示列表的倒数第二个元素,以此类推。

如果Key不是列表类型,返回 一个错误。

返回值:

列表中下标为index的元素。

如果index参数的值不在列表的区间范围内(out of range),返回nil

命令:

redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LINDEX mylist 0
"Hello"
redis> LINDEX mylist -1
"World"
redis> LINDEX mylist 3        # index不在 mylist 的区间范围内
(nil)

2.LINSERT

LINSERT key before|after pivot value

将值value插入到列表key当中,位于值pivot之前或之后。

pivot不存在于列表key时,不执行任何操作。

key不存在时,key被视为空列表,不执行任何操作。

如果key不是列表类型,返回一个错误。

返回值:

如果命令执行成功,返回插入操作完成之后,列表的长度。

如果没有找到pivot,返回-1

如果key不存在或或为空列表,返回0

命令:

redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSH mylist "World"
(integer) 2
redis> LINSERT mylist BEFORE "World" "There"
(integer) 3
redis> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"
# 对一个非空列表插入,查找一个不存在的 pivot
redis> LINSERT mylist BEFORE "go" "let's"
(integer) -1                                    # 失败
# 对一个空列表执行 LINSERT 命令
redis> EXISTS fake_list
(integer) 0
redis> LINSERT fake_list BEFORE "nono" "gogogog"
(integer) 0                                      # 失败

3.LLEN

LLEN key

返回列表key的长度

如果key不存在,则key被解释为一个空列表,返回0

如果key不是列表类型,返回一个错误。

返回值:

列表key的长度。

命令:

# 空列表
redis> LLEN job
(integer) 0
# 非空列表
redis> LPUSH job "cook food"
(integer) 1
redis> LPUSH job "have lunch"
(integer) 2
redis> LLEN job
(integer) 2
4.LPOP

LPOP key

移除并返回列表key的头元素。

返回值:

列表的头元素。

key不存在时,返回nil

命令:

redis> LLEN course
(integer) 0
redis> RPUSH course algorithm001
(integer) 1
redis> RPUSH course c++101
(integer) 2
redis> LPOP course  # 移除头元素并返回的是移除的头元素
"algorithm001"
5.LPUSH

LPUSH key value [value...]

将一个或多个值value插入到列表key的表头

如果有多个value值,那么各个value值按从左到右的顺序依次插入表头:比如说,对空列表mylist执行命令LPUSH a b c,列表的值将是c b a,这等同于原子性地执行LPUSH mylist a,LPUSH mylist b,LPUSH mylist c三个命令。

如果key不存在,一个空列表会被创建并执行LPUSH操作。

key存在但不是列表类型时,返回一个错误。

返回值:

执行LPUSH命令后,列表的长度。

命令:

# 加入单个元素
redis> LPUSH languages python
(integer) 1
# 加入重复元素
redis> LPUSH languages python
(integer) 2
redis> LRANGE languages 0 -1     # 列表允许重复元素
1) "python"
2) "python"
# 加入多个元素
redis> LPUSH mylist a b c
(integer) 3
redis> LRANGE mylist 0 -1
1) "c"
2) "b"
3) "a
6.LPUSHX

LPUSHX key value

将值value插入到列表key的表头,当且仅当key存在并且是一个非空列表

LPUSH命令相反,当key不存在时,LPUSHX命令什么也不做。

返回值:

LPUSHX命令执行之后,表的长度。

命令:

# 对空列表执行 LPUSHX
redis> LLEN greet                       # greet 是一个空列表
(integer) 0
redis> LPUSHX greet "hello"             # 尝试 LPUSHX,失败,因为列表为空
(integer) 0
# 对非空列表执行 LPUSHX
redis> LPUSH greet "hello"              # 先用 LPUSH 创建一个有一个元素的列表
(integer) 1
redis> LPUSHX greet "good morning"      # 这次 LPUSHX 执行成功
(integer) 2
redis> LRANGE greet 0 -1
1) "good morning"
2) "hello"
7.LRANGE

LRANGE key start stop

返回列表key中指定区间内的元素,区间以偏移量startstop指定。

下标(index)参数startstop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。

你也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。

超出范围的下标:

超出范围的下标值不会引起错误。

如果start下标比列表的最大下标end(LLEN list1)还要大,那么LRAGE返回一个空列表。

如果stop下标比end下标还要大,redisstop的值设置为end

返回值:

一个列表,包含指定区间内的元素。

命令:

redis> RPUSH fp-language lisp
(integer) 1
redis> LRANGE fp-language 0 0
1) "lisp"
redis> RPUSH fp-language scheme
(integer) 2
redis> LRANGE fp-language 0 1
1) "lisp"
2) "scheme"
8.LREM

LREM key count value

根据参数count的值,移除列表中与参数value相等的元素。

count的值可以是以下几种:

count>0:从表头开始向表尾搜索,移除与value相等的元素,数量为count

count<0:从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。

count=0:移除表中所有与value相等的值。

返回值:

被移除元素的数量

因为不存在的key被视作空表,所以当key不存在时,LREM命令总是返回0

命令:

# 先创建一个表,内容排列是
# morning hello morning helllo morning
redis> LPUSH greet "morning"
(integer) 1
redis> LPUSH greet "hello"
(integer) 2
redis> LPUSH greet "morning"
(integer) 3
redis> LPUSH greet "hello"
(integer) 4
redis> LPUSH greet "morning"
(integer) 5
redis> LRANGE greet 0 4         # 查看所有元素
1) "morning"
2) "hello"
3) "morning"
4) "hello"
5) "morning"
redis> LREM greet 2 morning     # 移除从表头到表尾,最先发现的两个 morning
(integer) 2                     # 两个元素被移除
redis> LLEN greet               # 还剩 3 个元素
(integer) 3
redis> LRANGE greet 0 2
1) "hello"
2) "hello"
3) "morning"
redis> LREM greet -1 morning    # 移除从表尾到表头,第一个 morning
(integer) 1
redis> LLEN greet               # 剩下两个元素
(integer) 2
redis> LRANGE greet 0 1
1) "hello"
2) "hello"
redis> LREM greet 0 hello      # 移除表中所有 hello
(integer) 2                  # 两个 hello 被移除
redis> LLEN greet
(integer) 0
9.LSET

LSET key index value

将列表key下标为index的元素的值设置为value

index参数超出范围,或对一个空列表(key不存在)进行LSET时,返回一个错误。

返回值:

操作成功返回OK,否则返回错误信息。

命令:

# 对空列表(key 不存在)进行 LSET
redis> EXISTS list
(integer) 0
redis> LSET list 0 item
(error) ERR no such key
# 对非空列表进行 LSET
redis> LPUSH job "cook food"
(integer) 1
redis> LRANGE job 0 0
1) "cook food"
redis> LSET job 0 "play game" #相当于对job的第一个元素进行重新设置值
OK
redis> LRANGE job  0 0
1) "play game"
# index 超出范围
redis> LLEN list                    # 列表长度为 1
(integer) 1
redis> LSET list 3 'out of range'
(error) ERR index out of range
10.LTRIM

LTRIM key start stop

对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间内的元素都将被删除。

举个例子,执行命令LTRIM list 0 2,表示只保留列表list的前三个元素,其余元素全部删除。

下标(index)参数startstop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。

你也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。

key不是列表类型时,返回一个错误。

LTRIM命令通常和LPUSH命令和RPUSH命令配合使用,举个例子:

LPUSH log newest_log
LTRIM log  0  99
这个例子模拟了一个日志程序,每次将最新日志 newest_log 放到 log 列表中,并且只保留最新的 100 项。注意当这样使用 LTRIM 命令时,时间复杂度时 o(1), 因为平均情况下,每次只有一个元素被移除。

超出范围的下标

超出范围的下标值不会引起错误。

如果 start 下标比列表的最大下标 end ( LLEN list 减去1 )还要大,或者start > stopLTRIM返回一个空列表(因为LTRIM已经将整个列表清空)

如果 stop 下标比 end 下标还要大,Redisstop的值设置为end

返回值:

命令执行成功时,返回OK

命令:

# 情况 1: 常见情况, start 和 stop 都在列表的索引范围之内
redis> LRANGE alpha 0 -1       # alpha 是一个包含 5 个字符串的列表
1) "h"
2) "e"
3) "l"
4) "l"
5) "o"
redis> LTRIM alpha 1 -1        # 删除 alpha 列表索引为 0 的元素
OK
redis> LRANGE alpha 0 -1       # "h" 被删除了
1) "e"
2) "l"
3) "l"
4) "o"
# 情况 2: stop 比列表的最大下标还要大
redis> LTRIM alpha 1 10086     # 保留 alpha 列表索引 1 至索引 10086 上的元素
OK
redis> LRANGE alpha 0 -1       # 只有索引 0 上的元素 "e" 被删除了,其他元素还在
1) "l"
2) "l"
3) "o"
# 情况 3: start 和 stop 都比列表的最大下标要大,并且 start < stop
redis> LTRIM alpha 10086 123321
OK
redis> LRANGE alpha 0 -1        # 列表被清空
(empty list or set)
# 情况 4: start 和 stop 都比列表的最大下标要大,并且 start > stop
redis> RPUSH new-alpha "h" "e" "l" "l" "o"     # 重新建立一个新列表
(integer) 5
redis> LRANGE new-alpha 0 -1
1) "h"
2) "e"
3) "l"
4) "l"
5) "o"
redis> LTRIM new-alpha 123321 10086    # 执行 LTRIM
OK
redis> LRANGE new-alpha 0 -1           # 同样被清空
(empty list or set)
11.BPOP
BPOP key
移除并返回列表key的尾元素。
返回值:
列表的尾元素。
当key不存在时,返回nil。
命令:
redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> RPOP mylist           # 返回被弹出的元素,即列表的尾元素
"three"
redis> LRANGE mylist 0 -1    # 列表剩下的元素
1) "one"
2) "two"

11.RPOP

RPOP key

移除并返回列表key的尾元素。

返回值:

列表的尾元素。

key不存在时,返回nil

命令:

redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> RPOP mylist           # 返回被弹出的元素,即列表的尾元素
"three"
redis> LRANGE mylist 0 -1    # 列表剩下的元素
1) "one"
2) "two"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值