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