list类型存储结构如下,它区分正数索引、负数索引。索引可以帮我定位到具体几个元素,类似java中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 keykey... timeout | 阻塞的从key的列表中的左边弹出一个元素,timeout=0,一直阻塞 |
BRPOP keykey... timeout | 阻塞的从key的列表中的右边弹出一个元素,timeout=0,一直阻塞 |
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的消息队列框架,实现思路图如下。
生产者在队列的左边push消息进去,而消费者使用BRPOP阻塞的监听队列,有消息到达时,消费者就会马上收到。
新浪/twitter用户消息列表
far关注了ally,jayden...当他们发推文的时候,far在首页需要倒叙的显示出来。
先回想一下,如果是关系型数据,你怎么实现。
你将你所有的关注的人的微博使用关联查询关联起来,然后倒序?或者维护一张消息关系表,发微博时将哪些关注你的人都维护在这张消息关系表中?那么像eason这样的热点用户,关注的人可能有几千万,那么你怎么去维护消息的关系。
看看使用redis怎么处理
- ally发微博,消息id为10086LPUSH msgline::{farId} 10086LPUSH msgline::{farId} 10087# 第一页,每页10条 LRANGE msgline::{farId} 0 1*10
- jayden发微博,消息id为10087
- far登陆时,查看消息
那么用redis存储这么多数据,合适吗?传言,新浪微博组建了160T的redis集群来干这么一件事情。但是可以断定先期新浪微博就是这样实现的。