这里有新鲜出炉的 Redis 命令参考,程序狗速度看过来!
Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。
发布订阅在应用级其作用是为了减少依赖关系,通常也叫观察者模式。主要是把耦合点单独抽离出来作为第三方,隔离易变化的发送方和接收方。下面这篇文章主要给大家介绍了关于 Redis 发布订阅和实现. NET 客户端的相关资料, 需要的朋友可以参考下
前言
发布订阅在设计模式中也可以说是观察者模式,针对这个模式是处理对象间一对多的依赖关系的,当一个对象发生变化,其它依赖他的对象都要得到通知并更新。
然而它也有自己的缺点,就是当主题发生一系列的变化时,观察者都要做批量的更新,如果这样的更新成本很高,那么解决方法就是根据种类需求通知,而不能盲目的通知所有的观察者。
那针对这个缺点,一般的情况下,你没有需求谁订阅一个跟自己无关的消息推送呢?这也正好说明推送的消息需要整理而不能一窝蜂的什么消息都往一个通道里面抛,要分而治之,合理的设计发布通道的用途,也合理的订阅通道。
那么如此一来,升级到系统项目级别,他别给我们又带来啦,莫大的好处,便是:剥离系统耦合,减少单线功能的依赖关系,又正迎合啦高内聚,松耦合的系统架构设计。
Redis 中的发布 / 订阅功能
这一节参考官方文档:https://redis.io/topics/pubsub
首先我准备啦 1 个 redis 服务,3 个客户端,如下图所示:
然后打开官方文档,首先可以看到以下 6 个命令,对,就只有这 6 个命令,只要你能掌握理解,发散思维灵活运用。吐纳,吐纳,那么道于此,生一,生二、生三,生万物,根本不在话下!!C,C,C,WC, 小伙,以后拯救世界就看你啦。
下面我们使用这几个命令,做一个演示,便于你理解。
1、2 个客户端订阅 order.create 通道消息,如下:
2、最后一个客户端发布往 order.create 通道发布消息。如下:
3、你会立马发现订阅此通道的另外 2 个客户端有信息输出出来,如下:
简单不,一个发布订阅的基础功能以及完事啦。
那如果你对其他一些发布订阅管理系统比较了解的话,你立马会想到一个功能,类似 rabbitmq 中的 topic 类型的匹配功能。那 redis 中有吗,就这 6 个命令,答案是有的。使用的命令为 psubscribe。
- 127.0.0.1 : 6379 > psubscribe * ---订阅所有通道127.0.0.1 : 6379 > psubscribe order. * ---订阅通道名称以order.开头的所有通道消息
那又如何取消订阅过的通道呢?
- 127.0.0.1 : 6379 > unsubscribe order.create---取消订阅127.0.0.1 : 6379 > punsubscribe order. * ---取消订阅通道名称以order.开头的所有通道消息
如何查看订阅信息呢?
- 127.0.0.1 : 6379 > pubsub channels---查看当前服务器订阅的所有通道127.0.0.1 : 6379 > pubsub channels order. * ---查看订阅通道名称以order.开头的所有通道127.0.0.1 : 6379 > pubsub numsub order.create user---查看订阅order.create和user通道的订阅者数量,支持查询多个通道
呀,到此为止,6 个命令已经用完啦。就是这么任性,对,你潜心修炼 10 多分钟已经学会啦 redis 中最上层的发布订阅技能。你可以出关,打败天下无敌手啦。
StackExchange.Redis 实现 redis 中的发布订阅功能
那这一节呢,我也实在说不出怎么讲更合理点,我就上一个示例,你自己把代码拷贝去,玩玩吧。上代码。
- static void Main(string[] args) {
- Console.WriteLine("请输入发布订阅类型?");
- var type = Console.ReadLine();
- if (type == "publish") {
- while (true) {
- Console.WriteLine("请输入要发布向哪个通道?");
- var channel = Console.ReadLine();
- Console.WriteLine("请输入要发布的消息内容.");
- var message = Console.ReadLine();
- sub.Publish(channel, message);
- }
- } else {
- Console.WriteLine("请输入您要订阅哪个通道的信息?");
- var channelKey = Console.ReadLine();
- sub.Subscribe(channelKey, (channel, message) = >{
- Console.WriteLine("接受到发布的内容为:" + message);
- });
- Console.WriteLine("您订阅的通道为:<< " + channelKey + " >> ! 一切就绪,等待发布消息!勿动,一动就没啦!!");
- Console.ReadKey();
- }
- }
运行起来几个实例,来玩一玩。如下,5 个,1 个发布信息,4 个订阅信息,其中 2 个订阅 zhanglonghao 通道,2 个订阅 bokeyuan 通道。
第一次我发布消息到 zhanglonghao 通道,发布的消息为:hello shuaige !!如下:
可以看出只有订阅 zhanglonghao 通道的才接受到啦消息。
那再往 bokeyuan 通道里面发送,hello bokeyuan !
到此为止,自己玩去吧。
总结
来源: http://www.phperz.com/article/17/0717/332863.html