Redis从入门到精通4:Redis中的消息机制
本节来介绍Redis中的消息机制。
1.消息的类型
Queue,队列:点对点。只能一对一发送和接收。
Topic,主题:广播。发给所有人,所有人都能收到。
2.常见的消息系统
Redis支持的消息发布系统,即Topic广播,不支持Queue。只支持字符串消息,不支持对象消息。
Apache Kakfa也是Topic消息类型的消息发布系统。主要用于实时计算系统中,作为缓存使用。例如在Storm的实时计算中使用Kakfa作为缓存。支持字符串消息,也支持对象消息。
JMS,即Java Messaging Service:Java消息服务,即支持Queue类型的消息,也支持Topic类型的消息。常见的JMS Server有:Apache JMS Server、Weblogic等等。支持字符串消息,也支持对象消息。传输对象消息时,该对象需要实现序列化,以在网络上传输。
这些消息系统都是异步通信机制。
3.Redis消息机制的体系结构

- Redis消息机制由消息的生产者、频道Broker、消息的消费者三部分组成;
- 一个生产者可以向多个频道发送消息;
- 一个频道可以接收来自多个生产者发来的消息,也可以被多个消费者订阅;
- 一个消费者可以订阅多个频道的消息;
4.发布消息和订阅消息
- publish channel名字 “消息内容”
- subcribe channel名字
- psubcribe channel名字*
5.命令行下演示消息机制
示例1:一个发布者可以发给多个订阅者。
发布者:
127.0.0.1:6379> publish mychannel1 hellworld
(integer) 2
注意:这里返回的2表示该消息已经被2个订阅者成功接收。
订阅者1:
127.0.0.1:6379> subcribe mychannel1
Reading messages... (press Ctrl-C to quit)
- "subcribe"
- "mychannel1"
- (integer) 1
- "message"
- "mychannel1"
- "helloworld"
订阅者2:
127.0.0.1:6379> subcribe mychannel1
- "subcribe"
- "mychannel1"
- (integer) 1
- "message"
- "mychannel1"
- "helloworld"
示例2:一个订阅者可以订阅多个发布者。
发布者1:
127.0.0.1:6379> publish mychannel1 hellworld
(integer) 1
发布者2:
127.0.0.1:6379> publish mychannel2 hellpredis
(integer) 1
订阅者:
127.0.0.1:6379> psubcribe mychannel*
- "psubcribe"
- "mychannel*"
- (integer) 1
- "pmessage"
- "mychannel*"
- "mychannel1"
- "helloworld"
- "pmessage"
- "mychannel*"
- "mychannel2"
- "helloredis"
6.Java API演示消息机制
//示例:使用Java API来接收channel1发送的消息
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
import redis.clients.jedis.Transaction;
public class TestRedis {
@Test
public void testMessage(){
//创建一个Redis客户端
Jedis client = new Jedis("192.168.126.110",6379);
//订阅频道channel1的消息
client.subcribe(new MyMessageConsumer(),"mychannel1");
}
//创建一个消息的接收者来接收消息
class MyMessageConsumer extends JedisPubSub{
@Override
public void onMessage(String channel, String message){
System.out.println("频道:"+channel+"\t消息是:"+message);
}
}
运行程序就能接收到channel1发布的消息。
总结:虽然Redis支持消息机制,但是它的消息机制功能太过于简单,远远比不上其他消息系统,比如Kafka等。因此,Redis最主要的用途还是作为缓存数据库使用。