1.Redis 发布订阅(了解)
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
2.开启Redis服务(虚拟系统CentOS7上运行)
3. dotnetCore 3.1 项目主要代码
1.订阅端(获取消息,根据消息执行一些操作)
using System;
using StackExchange.Redis;
namespace Sub
{
class Program
{
static void Main(string[] args)
{
//创建连接
using (ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("192.168.153.131:6379"))
{
ISubscriber sub = redis.GetSubscriber();
//订阅名为 messages 的通道
sub.Subscribe("redisChat", (channel, message) => {
//输出收到的消息
Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] {message}");
if (message == "yes")
{
todoSomething();
}
else
{
Console.WriteLine("未获取指定的信息,什么也不做!");
}
});
Console.WriteLine("已订阅 redisChat");
Console.ReadKey();
}
}
/// <summary>
/// 定义你要执行的操作
/// </summary>
public static void todoSomething()
{
Console.WriteLine("执行你要做的操作....");
Console.WriteLine("已经执行完你要做的操作。");
}
}
}
- 发布端(发布消息,触发源)
using System;
using StackExchange.Redis;
namespace Pub
{
class Program
{
static void Main(string[] args)
{
//创建连接
using (ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("192.168.153.131:6379"))
{
ISubscriber sub = redis.GetSubscriber();
Console.WriteLine("请输入任意字符,输入exit退出");
string input;
do
{
input = Console.ReadLine();
sub.Publish("redisChat", input);
} while (input != "exit");
}
}
}
}
项目中需要NuGet引入StackExchange包:
4.redis消息发布订阅的缺点
发布端可接受端必须同时保持在线连接,否则的话就会有消息遗漏。比如接收端掉线,在掉线期间发布端发布的消息并不会缓存下来等接收端上线后再接收,而是完全错过了就不再有。因此呢,对于想要使用MQ完成重要业务处理,这是不足取的,毕竟redis中的消息机制也不是专业的。专业的都会自动移步到rabbitMQ等专业的消息中间件了。
还有一种缺点,说是发布的消息频繁太多会造成堵塞以致于崩掉。这个倒没有去测试。也有说这个bug在新版本中已经修复了。