Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

一个列表最多可以包含 232 – 1 个元素 (4294967295, 每个列表超过40亿个元素)。

可以用成 栈,队列,阻塞队列

127.0.0.1:6379> LPUSH list one two three  //左插入一个元素
 (integer) 3
 127.0.0.1:6379> LRANGE list 0 -1
 1) "three"
 2) "two"
 3) "one"
 127.0.0.1:6379> RPUSH list four //右插入一个元素
 (integer) 4
 127.0.0.1:6379> LRANGE list 0 -1
 1) "three"
 2) "two"
 3) "one"
 4) "four"
 127.0.0.1:6379> LPOP list //左取出一个元素
 "three"
 127.0.0.1:6379> RPOP list //右取出一个元素
 "four"
 127.0.0.1:6379> LRANGE list 0 -1
 1) "two"
 2) "one"
 127.0.0.1:6379> lindex list 0 //根据下标取出元素
 "two"
 127.0.0.1:6379> lindex list 1
 "one"
 127.0.0.1:6379> LLEN list
 (integer) 2
======================================
 127.0.0.1:6379> LREM list 1 one //删除一个指定数量的元素
 (integer) 1
 127.0.0.1:6379> Lrange list 0 -1
 1) "three"
 2) "three"
 3) "two"
 127.0.0.1:6379> LREM list 2 three //删除一个指定数量的元素-2个three
 (integer) 2
 127.0.0.1:6379> Lrange list 0 -1
 1) "two"
======================================
 127.0.0.1:6379> LPUSH mylist A B C D E
 (integer) 5
 127.0.0.1:6379> LRANGE mylist 0 -1
 1) "E"
 2) "D"
 3) "C"
 4) "B"
 5) "A"
 127.0.0.1:6379> LTRIM mylist 3 4  //截取出指定范围的元素
 OK
 127.0.0.1:6379> LRANGE mylist 0 -1
 1) "B"
 2) "A"
======================================
 127.0.0.1:6379> RPUSH mylist A B C D
 (integer) 4
 127.0.0.1:6379> LRANGE mylist 0 -1
 1) "A"
 2) "B"
 3) "C"
 4) "D"
 127.0.0.1:6379> RPOPLPUSH mylist mylist2 //从源列表尾部取出,插入到指定列表
 "D"
 127.0.0.1:6379> LRANGE mylist 0 -1
 1) "A"
 2) "B"
 3) "C"
 127.0.0.1:6379> LRANGE mylist2 0 -1
 1) "D"
======================================
 127.0.0.1:6379> EXISTS LIST
 (integer) 0
 127.0.0.1:6379> lset list 0 item0 //根据指定下标设置该位置元素的值,成功会覆盖原值,空链表则无法成功
 (error) ERR no such key
 127.0.0.1:6379> LPUSH list tony
 (integer) 1
 127.0.0.1:6379> LRANGE list 0 -1
 1) "tony"
 127.0.0.1:6379> LSET list 0 chris
 OK
 127.0.0.1:6379> LRANGE list 0 -1
 1) "chris"
 127.0.0.1:6379> LPUSH list tony tom
 (integer) 3
 127.0.0.1:6379> LSET list 1 item1
 OK
 127.0.0.1:6379> LRANGE list 0 -1
 1) "tom"
 2) "item1"
 3) "chris"
======================================
 127.0.0.1:6379> RPUSH list A B C D
 (integer) 4
 127.0.0.1:6379> LRANGE list 0 -1
 1) "A"
 2) "B"
 3) "C"
 4) "D"
 127.0.0.1:6379> LINSERT list before B chris //在指定元素名 before|after 位置中插入元素
 (integer) 5
 127.0.0.1:6379> LRANGE list 0 -1
 1) "A"
 2) "chris"
 3) "B"
 4) "C"
 5) "D"
 127.0.0.1:6379> LINSERT list after B tony
 (integer) 6
 127.0.0.1:6379> LRANGE list 0 -1
 1) "A"
 2) "chris"
 3) "B"
 4) "tony"
 5) "C"
 6) "D"
======================================
BLPOP key1 [key2 ] timeout
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

BRPOP key1 [key2 ] timeout
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

BRPOPLPUSH source destination timeout
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

总结

  • 实际上是一个链表,左端右端中间都可以插入值
  • 如果key不存在,创建新的链表,存在则新增内容
  • 如果移除所有值,空链表也表示不存在
  • 两端插入或改动效率最高,中间元素相对效率偏低

lpush + lpop = Stack(栈)

        lpush + rpop = Queue(队列)

        lpush + ltrim = Capped Collection(有限集合)

        lpush + brpop = Message Queue(消息队列)

应用场景:

  1. 队列,(消息队列有专门的应用,比Redis实现的更好)
    1. Redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的”抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。
  2. 文章列表或者数据分页展示的应用。
    1. 比如,我们常用的博客网站的文章列表,当用户量越来越多时,而且每一个用户都有自己的文章列表,而且当文章多时,都需要分页展示,这时可以考虑使用redis的列表,列表不但有序同时还支持按照范围内获取元素,可以完美解决分页查询功能。大大提高查询效率。