redis妙用-list类型

2020-10-22 10:13:14 浏览数 (1)

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

redis 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 keykey... timeout

阻塞的从key的列表中的左边弹出一个元素,timeout=0,一直阻塞

BRPOP keykey... timeout

阻塞的从key的列表中的右边弹出一个元素,timeout=0,一直阻塞

代码语言:txt复制
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实现消息队列list实现消息队列

    生产者在队列的左边push消息进去,而消费者使用BRPOP阻塞的监听队列,有消息到达时,消费者就会马上收到。

新浪/twitter用户消息列表

    far关注了ally,jayden...当他们发推文的时候,far在首页需要倒叙的显示出来。

    先回想一下,如果是关系型数据,你怎么实现。

    你将你所有的关注的人的微博使用关联查询关联起来,然后倒序?或者维护一张消息关系表,发微博时将哪些关注你的人都维护在这张消息关系表中?那么像eason这样的热点用户,关注的人可能有几千万,那么你怎么去维护消息的关系。

    看看使用redis怎么处理

  1. ally发微博,消息id为10086LPUSH msgline::{farId} 10086LPUSH msgline::{farId} 10087# 第一页,每页10条 LRANGE msgline::{farId} 0 1*10
  2. jayden发微博,消息id为10087
  3. far登陆时,查看消息

    那么用redis存储这么多数据,合适吗?传言,新浪微博组建了160T的redis集群来干这么一件事情。但是可以断定先期新浪微博就是这样实现的。

0 人点赞