List类型
-
创建list:
rpush key element [element …]
lpush key element [element …]127.0.0.1:6379> lpush l1 a b c d (integer) 4 127.0.0.1:6379> rpush l2 1 2 3 4 (integer) 4
-
查询list:lrange key start stop
其中start从0开始,查询结果包含start和end127.0.0.1:6379> lrange l1 0 -1 1) "d" 2) "c" 3) "b" 4) "a" 127.0.0.1:6379> lrange l2 0 -1 1) "1" 2) "2" 3) "3" 4) "4"
-
获取列表中元素的个数:llen key
127.0.0.1:6379> llen l1 (integer) 4
-
获取列表中指定下标的元素:lindex key index
127.0.0.1:6379> lindex l2 0 "1" 127.0.0.1:6379> lindex l2 1 "2"
-
修改list:lset key index element
127.0.0.1:6379> lset l1 2 foo OK 127.0.0.1:6379> lrange l1 0 -1 1) "d" 2) "c" 3) "foo" 4) "a"
-
截取指定范围的值后,再把截取出的值赋给list:ltrim key start stop
127.0.0.1:6379> lrange l1 0 -1 1) "d" 2) "c" 3) "b" 4) "a" 127.0.0.1:6379> ltrim l1 1 2 OK 127.0.0.1:6379> lrange l1 0 -1 1) "c" 2) "b"
-
删除并返回链表左侧的元素:lpop key
127.0.0.1:6379> lpop l1 "c" 127.0.0.1:6379> lrange l1 0 -1 1) "b"
-
删除并返回链表右侧的元素:rpop key
127.0.0.1:6379> lrange l1 0 -1 1) "d" 2) "c" 3) "b" 4) "a" 127.0.0.1:6379> rpop l1 "a"
-
删除并返回链表左侧的元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,则一直阻塞等待:blpop key [key …] timeout
127.0.0.1:6379> blpop l1 1 1) "l1" 2) "d" 127.0.0.1:6379> blpop l1 1 1) "l1" 2) "c" 127.0.0.1:6379> blpop l1 1 1) "l1" 2) "b" 127.0.0.1:6379> blpop l1 1 (nil) (1.08s)
-
brpop key [key …] timeout删除并返回链表右侧的元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,则一直阻塞等待
127.0.0.1:6379> brpop l1 1 1) "l1" 2) "a" 127.0.0.1:6379> brpop l1 1 1) "l1" 2) "b" 127.0.0.1:6379> brpop l1 1 (nil) (1.08s)
-
删除key中count个数的element元素:lrem key count element
lrem list 0 a 删除list中的所有a元素lrem list 1 a 从左向右,删除list中的1个a元素lrem key count element127.0.0.1:6379> lrem list1 2 a (integer) 2 127.0.0.1:6379> lrange list1 0 -1 1) "d" 2) "c" 3) "b" 4) "d" 5) "c" 6) "b"
-
从右向左删除key中的count个element元素:lrem key count element
127.0.0.1:6379> lrange l1 0 -1 1) "d" 2) "c" 3) "b" 4) "a" 5) "d" 6) "c" 7) "b" 127.0.0.1:6379> lrem l1 2 b (integer) 2 127.0.0.1:6379> lrange l1 0 -1 1) "d" 2) "c" 3) "a" 4) "d" 5) "c"
list类型底层采取双向链表存储结果实现
利用list的命令,可以实现一些常用的数据结构
Stack = LPUSH + LPOP --> FILO
Queue = LPUSH +RPOP
Blocking MQ(阻塞队列)= LPUSH + BRPOP
关于redis中的list数据类型要注意的地方
- 它是一个字符串链表,可以从left或right端添加值
- 如果键不存在,则创建新的链表
- 如果键已存在,则新增内容
- 如果值全部移除,则对应的键也就消失了
- 操作链表中的头元素和尾元素效果都很高,但是如果操作的是链表中间的元素,效率就很低
- list可以对数据进行分页操作,通常第一页的数据来自于redis的list,第2页及更多的信息是通过数据库来获取的