Redis中的Stream数据类型作为消息队列的尝试
xlen "nba_match_001"
,也就是上面写入的10条消息正向查询
xrange "nba_match_001" # 查询所有消息
xrange "nba_match_001" - + # -表示最小值, +表示最大值
xrange "nba_match_001" 1562980142175-0 + # 指定最小消息id的列表
xrange "nba_match_001"- 1562980142175-0 # 指定最大消息id的列表
反向查询
xrevrange "nba_match_001"
xrevrange "nba_match_001" + -
xrevrange "nba_match_001" + 1562980142175-0
xrevrange "nba_match_001" 1562980142175-0 -
1.6 删除消息
xdel stream_name id,删除消息并不是真正的物理删除,队列的长度不变,指示标记当前消息被删除
3 多消费者xgroup
:消费组,每个组中的消费者独立消费stream中的消息3.1 创建消费组
对消息队列"nba_match_001"创建了两个消费组,一个是cg1,一个是cg2,比如网页客户端与app客户端
每个消费组(consumer group)的状态都是独立的,相互不受影响。也就是说同一份stream内部的消息会被每个消费组都消费到。
同一个消费组(consumer group)可以挂接多个消费者(consumer),这些消费者之间是竞争关系,任意一个消费者读取了消息都会使游标last_delivered_id往前移动。
每个消费者者有一个组内唯一名称。
关于消费组,可能不太好理解,举个例子就比较清楚
假设有2个消费组cg1,cg2,对于cg1,其组内共有3个消费者c1,、c2、c3。一个消息队列*有5条消息a,b,c,d,e,那么一种可能的消费方式如下
a -> c1
b -> c2
c -> c3
d -> c1
e -> c2
也就是说3个消费者,对于消息的消费是互斥的,消费的消息是没有交集的
而对于cg2,同样可以消费a,b,c,d,e这5条消息,不依赖于cg1消费组以及消费情况,同理,具体怎么消费,取决于其组内的消费者数量
就好比体育直播的客户端,正常情况下,网页客户端可以收到所有的直播消息,手机app客户端也可以收到所有的直播消息一样,不同消费组间对消息的消费互不干扰。
4 多个生产者和多个消费者
这种情况类似以上,不用的是增加了多个消费者,在上面的基础上做了扩展。
其实不难想象,文字直播插播的广告消息,可能是类似如下结构,是另外一个独立的生产者,与文字直播员一样生成写入消息到队列,然后客户端看到的就是夹杂了广告的直播。
目前就个人认识而言,stream数据类型实现消息队列并不完美,最大的问题就是单点压力问题:这里是说单点压力,而不是单点故障,stream类型数据,其实从逻辑上看,是一个key值(stream_name),跟着一系列value(消息),这些消息只能存储在一个redis实例中,如何缓解多个消费者对单个key值中的消息消费压力?说来说去,不就是想说kafka的partition么……
相关文章:
-
-
由于一般的修改ini文件来完成无密码登录数据库容易造成较大风险,所以使用修改启动服务参数的方式来更新user表,达到无密码登陆的目的。 1.关闭系统... [阅读全文]
-
Samba服务 samba是一个网络服务器,用于Linux和Windows之间共享文件。 samba端口号 samba (启动时会预设多个端口) 数... [阅读全文]
-
熟悉MySQL的人,都知道InnoDB存储引擎,如大家所知,Redo Log是innodb的核心事务日志之一,innodb写入Redo Log后就会... [阅读全文]
-
Redis的List数据类型作为消息队列,已经比较合适了,但存在一些不足,比如只能独立消费,订阅发布又无法支持数据的持久化,相对前两者,Redis ... [阅读全文]
-
可以使用 window.location 获取当前页面url。以下是一些简单应用。 ... [阅读全文]
-
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论