list类型存储结构如下,它区分正数索引、负数索引。索引可以帮我定位到具体几个元素,类似java中List的下标。
redis list结构

api

命令 说明
LPUSH key value [value …] 往key的列表中的左边放入一个元素,key不存在则新建
RPUSH key value [value …] 往key的列表中的右边放入一个元素,key不存在则新建
LPOP key 从key的列表中的左边弹出一个元素
RPOP key 从key的列表中的右边弹出一个元素
LRANGE key start stop 获取列表下标为start到stop中的元素
BLPOP key[key…] timeout 阻塞的从key的列表中的左边弹出一个元素,timeout=0,一直阻塞
BRPOP key[key…] timeout 阻塞的从key的列表中的右边弹出一个元素,timeout=0,一直阻塞
1
2
3
4
5
6
7
127.0.0.1:6379> LPUSH user ally far jayden
(integer) 3
127.0.0.1:6379> LPOP user
"jayden"
127.0.0.1:6379> LRANGE user 0 -1
1) "far"
2) "ally"

lrange user 0 -1当你的key经过多次修改之后,你不知道有多少个值时,想拿到所有的值,使用该语句。0代表正数索引的开始,-1代表负数索引的结束。

应用场景

实现消息队列

由于list的BLPOP命令的特性,我们是不是可以实现一个简单消息队列,其实在github,你可以找到类似的基于redis的消息队列框架,实现思路图如下。
list实现消息队列
生产者在队列的左边push消息进去,而消费者使用BRPOP阻塞的监听队列,有消息到达时,消费者就会马上收到。

新浪/twitter用户消息列表

far关注了ally,jayden…当他们发推文的时候,far在首页需要倒叙的显示出来。
先回想一下,如果是关系型数据,你怎么实现。
你将你所有的关注的人的微博使用关联查询关联起来,然后倒序?或者维护一张消息关系表,发微博时将哪些关注你的人都维护在这张消息关系表中?那么像eason这样的热点用户,关注的人可能有几千万,那么你怎么去维护消息的关系。

看看使用redis怎么处理

  1. ally发微博,消息id为10086
    1
    LPUSH msgline::{farId} 10086
  2. jayden发微博,消息id为10087
    1
    LPUSH msgline::{farId} 10087
  3. far登陆时,查看消息
    1
    2
    # 第一页,每页10
    LRANGE msgline::{farId} 0 1*10
    那么用redis存储这么多数据,合适吗?传言,新浪微博组建了160T的redis集群来干这么一件事情。但是可以断定先期新浪微博就是这样实现的。