redis妙用-list类型
条评论
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 key[key…] timeout | 阻塞的从key的列表中的左边弹出一个元素,timeout=0,一直阻塞 |
BRPOP key[key…] timeout | 阻塞的从key的列表中的右边弹出一个元素,timeout=0,一直阻塞 |
1 | 127.0.0.1:6379> LPUSH user ally far jayden |
lrange user 0 -1
当你的key经过多次修改之后,你不知道有多少个值时,想拿到所有的值,使用该语句。0代表正数索引的开始,-1代表负数索引的结束。
应用场景
实现消息队列
由于list的BLPOP命令的特性,我们是不是可以实现一个简单消息队列,其实在github,你可以找到类似的基于redis的消息队列框架,实现思路图如下。
生产者在队列的左边push消息进去,而消费者使用BRPOP阻塞的监听队列,有消息到达时,消费者就会马上收到。
新浪/twitter用户消息列表
far关注了ally,jayden…当他们发推文的时候,far在首页需要倒叙的显示出来。
先回想一下,如果是关系型数据,你怎么实现。
你将你所有的关注的人的微博使用关联查询关联起来,然后倒序?或者维护一张消息关系表,发微博时将哪些关注你的人都维护在这张消息关系表中?那么像eason这样的热点用户,关注的人可能有几千万,那么你怎么去维护消息的关系。
看看使用redis怎么处理
- ally发微博,消息id为10086
1
LPUSH msgline::{farId} 10086
- jayden发微博,消息id为10087
1
LPUSH msgline::{farId} 10087
- far登陆时,查看消息那么用redis存储这么多数据,合适吗?传言,新浪微博组建了160T的redis集群来干这么一件事情。但是可以断定先期新浪微博就是这样实现的。
1
2# 第一页,每页10条
LRANGE msgline::{farId} 0 1*10
- 本文链接:https://www.ofcoder.com/2019/05/15/middleware/redis%E5%A6%99%E7%94%A8-list%E7%B1%BB%E5%9E%8B/
- 版权声明:Copyright © 并发笔记 - ofcoder.com. Author by far.
分享