世界上最伟大的投资就是投资自己的教育

首页Redis
随风 · 练气

Redis 学习笔记系列文章之 Redis 发布与订阅 (九)

随风发布于2371 次阅读

redis 在 2.8.0 版本之后出了一个新功能,叫Pub/Sub,也叫"发布与订阅"

在这篇文章中不仅要介绍它是如何用的,更重要的是要介绍它的应用场景。

在之前介绍websocket 之用 tubesock 在 rails 实现聊天室 (五)的时候,就用 redis 的 pub/sub 实现过聊天室。相关的代码是这样的:

redis_thread = Thread.new do
  Redis.new.subscribe "chat" do |on|
    on.message do |channel, message|
      tubesock.send_data message
    end
  end
end

tubesock.onmessage do |m|
  Redis.new.publish "chat", m
end

说到这个发布与订阅,必须说到一个词叫"channel"(通道)。接收消息者在通道上订阅消息,而发布消息者在通道上发布消息,发布者和接收者就是这样来交互信息的。

比如,我现在有一个客户端 a,在订阅通道room,它就一直在等待,直到有消息到来,而我又开了另一个客户端 b,它在通道room上发布了一条消息“hello",客户端 a 马上就可以收到消息"hello"。而类似 a 这样的客户端有很多个。这种方式就是可以实现聊天室的。因为它像广播消息,有一个消息出来了,每个只要订阅通道的客户端就会收到。

我们来实现一下。

首先用redis-cli进入 redis 的客户端命令交互界面。

输入SUBSCRIBE room,表示订阅通道"room"

127.0.0.1:6379> SUBSCRIBE room
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "room"
3) (integer) 1

现在再开启另一个redis-cli客户端。

在通道"room"通道 上发送一条信息"hello"

> publish room hello

先前的客户端会收到这样的消息:

1) "message"
2) "room"
3) "hello"

这样就完成了整个订阅与发布的流程。

publish那个客户端一直停在那,它没有退出,只要给它发送消息,它就可以接收消息。

当然,像publish那个客户端可以开启多个,只要订阅"room"这个通道的客户端都会收到相同的消息。

还需要注意的一个点就是当没有任何订阅的客户端时,进行publish时,数据是不会被存储起来的。

也就是说,下次有人订阅的时候,是收不到消息的。

127.0.0.1:6379> publish room hello
(integer) 0

redis 的订阅与发布比较常见的应用就是聊天室,当然还有其他的,比如做一个推送系统。

手机等客户端可以用 redis 订阅一个通道,然而后台可以给通道发布消息,这样,所有的手机客户端都可以通过通道得到后台发布的消息。

这样子实现,又能利用 redis 的快速和高性能的特点,也避免了传统方式的轮循作法。

完结。

本站文章均为原创内容,如需转载请注明出处,谢谢。

0 条回复
暂无回复~~
相关小书
redis入门与应用教程

redis入门与应用教程

redis从入门开始讲起,通过应用来深入理解redis

发表于

喜欢
统计信息
    学员: 29974
    视频数量: 1996
    文章数量: 526

© 汕尾市求知科技有限公司 | Rails365 Gitlab | 知乎 | b 站 | csdn

粤公网安备 44152102000088号粤公网安备 44152102000088号 | 粤ICP备19038915号

Top