LPUSH
LPUSH key value [value …]
将一个或多个值 value 插入到列表 key 的表头
如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。
如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
当 key 存在但不是列表类型时,返回一个错误。
在Redis 2.4版本以前的 LPUSH 命令,都只接受单个 value 值。
# 加入单个元素
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"
### LRANGE
LRANGE key start stop
返回列表 key
中指定区间内的元素,区间以偏移量 start
和 stop
指定。
下标(index)参数 start
和 stop
都以 0
为底,也就是说,以 0
表示列表的第一个元素,以 1
表示列表的第二个元素,以此类推。
你也可以使用负数下标,以 -1
表示列表的最后一个元素, -2
表示列表的倒数第二个元素,以此类推。
注意LRANGE命令和编程语言区间函数的区别
假如你有一个包含一百个元素的列表,对该列表执行 LRANGE list 0 10
,结果是一个包含11个元素的列表,这表明 stop
下标也在 LRANGE 命令的取值范围之内(闭区间),这和某些语言的区间函数可能不一致,比如Ruby的 Range.new
、 Array#slice
和Python的 range()
函数。
超出范围的下标
超出范围的下标值不会引起错误。
如果 start
下标比列表的最大下标 end
( LLEN list
减去 1
)还要大,那么 LRANGE 返回一个空列表。
如果 stop
下标比 end
下标还要大,Redis将 stop
的值设置为 end
。
-
可用版本:
- >= 1.0.0 时间复杂度:
-
O(S+N),
S
为偏移量start
,N
为指定区间内元素的数量。
返回值:
- 一个列表,包含指定区间内的元素。
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"
RPUSH
和 LPUSH 只不过顺序和 LPUSH 相反
LTRIM
127.0.0.1:6379> lpush list01 1 2 3 4 5 6 7 8 9
(integer) 9
127.0.0.1:6379> LRANGE list01 0 -1
1) "9"
2) "8"
3) "7"
4) "6"
5) "5"
6) "4"
7) "3"
8) "2"
9) "1"
127.0.0.1:6379> LTRIM list01 0 4
OK
127.0.0.1:6379> LRANGE list01 0 -1
1) "9"
2) "8"
3) "7"
4) "6"
5) "5"
RPOPLPUSH
命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:
- 将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
- 将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。
127.0.0.1:6379> LRANGE list01 0 -1
1) "9"
2) "8"
3) "7"
4) "6"
5) "5"
127.0.0.1:6379> LRANGE list02 0 -1
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> RPOPLPUSH list01 list02
"5"
127.0.0.1:6379> LRANGE list02 0 -1
1) "5"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> LRANGE list01 0 -1
1) "9"
2) "8"
3) "7"
4) "6"
LSET
LINSERT key BEFORE|AFTER pivot value
将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
当 pivot 不存在于列表 key 时,不执行任何操作。
当 key 不存在时, key 被视为空列表,不执行任何操作。
如果 key 不是列表类型,返回一个错误
127.0.0.1:6379> LRANGE list01 0 -1
1) "12"
2) "8"
3) "7"
4) "6"
127.0.0.1:6379> LINSERT list01 before 8 java
(integer) 5
127.0.0.1:6379> LRANGE list01 0 -1
1) "12"
2) "java"
3) "8"
4) "7"
5) "6"
127.0.0.1:6379> LINSERT list01 after 8 c++
(integer) 6
127.0.0.1:6379> LRANGE list01 0 -1
1) "12"
2) "java"
3) "8"
4) "c++"
5) "7"
6) "6"
性能总结
它是一个字符串链表,left、right都可以插入添加;
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全移除,对应的键也就消失了。
链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。