在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。
从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。
1、LPUSH key value1 [value2]
在列表头(左)加上一个或多个值的列表
127.0.0.1:6379> lpush mylist a b c (integer) 3 6379> lrange mylist 0 -1 1) "c" 2) b3) a"
LPUSH 就是在左边插入,插入 a b c 就是先 a -> b a -> c b a 。
2、RPUSH key value1 [value2]
在列表尾(右)加上一个或多个值的列表
rpush mylist a b c (integer) "
RPUSH 就是在右边插入,插入 a b c 就是先 a -> a b -> a b c
3、LPOP key
获取并取出列表中的第一个元素(左边第一个)
lpop mylist "
4、RPOP key
取出并获取列表中的最后一个元素(右边第一个)
rpop mylist "
5、LLEN key
获取列表的长度
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> llen mylist
(integer) 3
127.0.0.1:6379> rpush mylist d
(integer) 4
127.0.0.1:6379> llen mylist
(integer) 4
6、LRANGE key start stop
从一个列表获取元素,其中start/stop都是下标,并且都可以是负数,比如-1表示倒数第一个,-2表示倒数第二个。
"
7、LTRIM key start stop
修剪列表到指定的范围内
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> ltrim mylist 1 -1
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "b"
2) "c"
3) "d"
这里的 start/stop 也是下标,也可以是负数。
8、LREM key count value
根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
COUNT 的值可以是以下几种:
- count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
- count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
- count = 0 : 移除表中所有与 VALUE 相等的值。
127.0.0.1:6379> lrange mylist 0 -1 1) "a" 2) "b" 3) "c" 4) "a" 5) "a" 6) "d" 7) "e" 127.0.0.1:6379> lrem mylist 2 a (integer) 2 127.0.0.1:6379> lrange mylist 0 -1 1) "b" 2) "c" 3) "a" 4) "d" 5) "e"
上面的命令指示:在 mylist 列表,从左到右扫描,移除两个与 'a' 相等的值。
6、LINSERT key BEFORE|AFTER pivot value
在列表中的其他元素之后或之前插入一个元素
127.0.0.1:6379> rpush list1 foo
(integer) 1
127.0.0.1:6379> rpush list1 bar
(integer) 2
127.0.0.1:6379> linsert list1 before bar yes
(integer) 3
127.0.0.1:6379> lrange list1 0 -1
1) "foo"
2) "yes"
3) "bar"
8、LINDEX key index
从一个列表其索引获取对应的元素
127.0.0.1:6379> lrange mylist 0 -1 1) "a" 2) "b" 3) "c" 4) "d" 127.0.0.1:6379> lindex mylist 0 "a" 127.0.0.1:6379> lindex mylist 3 "d"
9、LSET key index value
在列表中的索引设置一个元素的值
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> lset mylist 0 aa
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "aa"
2) "b"
3) "c"
4) "d"
====================== 我是罪恶的分割线 ======================
RPOPLPUSH source destination
删除最后一个元素的列表,将其附加到另一个列表并返回它
BRPOPLPUSH source destination timeout
从列表中弹出一个值,它推到另一个列表并返回它;或阻塞,直到有可用
BLPOP key1 [key2] timeout
取出并获取列表中的第一个元素,或阻塞,直到有可用
BRPOP key1 [key2] timeout
取出并获取列表中的最后一个元素,或阻塞,直到有可用
LPUSHX key value
在前面加上一个值列表,仅当列表中存在