首页 文章 精选 留言 我的

精选列表

搜索[pub/sub],共3105篇文章
优秀的个人博客,低调大师

PHP使用Redis的Pub/Sub(发布订阅)命令

1.概念 名称 含义 channel 频道:生产者和消费者直接操作的对象 publish 生产者:向channel发送消息 subscribe 消费者:订阅一个或多个channel psubscribe 消费者:匹配订阅一个或多个channel punsubscribe 退订:匹配退订,无参数则退订全部channel unsubscribe 退订:退订指定的channel,无参数则退订全部channel pubsub 列出当前活动channel(至少有一个订阅) 2.注意事项 1.生产者publish消息时打开一个连接,publish后连接可以立即关闭2.channel只接收publish发送的消息,自身不存储消息,如果channel没有被订阅,则消息丢弃3.订阅的消费者需要一直在线,阻塞获取消息,连接断开表示立即退订 3.使用rawCommand命令实现发布订阅 rawCommand是php-redis扩展中提供的命令,可以向redis发送任何原生的命令1.消费者订阅Subscribe.php消费者需要创建redis长连接,并且设置set_time_limit和default_socket_timeout,以确保阻塞获取消息过程php不超时,socket连接不超时 <?php /** * Created by PhpStorm. * User: jmsite.cn * Date: 2019/1/23 * Time: 11:29 */ //设置php脚本执行时间 set_time_limit(0); //设置socket连接超时时间 ini_set('default_socket_timeout', -1); //声明测试频道名称 $channelName = "testPubSub"; $channelName2 = "testPubSub2"; try { $redis = new Redis(); //建立一个长链接 $redis->pconnect('192.168.75.132', 6379); //阻塞获取消息 while (true){ //构建命令参数 $param = array('subscribe', $channelName, $channelName2); //使用call_user_func_array回调执行命令 $ret = call_user_func_array(array($redis, 'rawCommand'), $param); //如果结果是消息结构 if (isset($ret[0]) && $ret[0] == 'message'){ //输出消息频道和消息内容 echo "channel:".$ret[1].",message:".$ret[2]."\n"; } else { //没有消息休眠1秒 sleep(1); } } } catch (Exception $e){ echo $e->getMessage(); } 2.生产者发送消息Publish.php <?php /** * Created by PhpStorm. * User: jmsite.cn * Date: 2019/1/23 * Time: 11:59 */ $channelName = "testPubSub"; $channelName2 = "testPubSub2"; //向指定频道发送消息 try { $redis = new Redis(); $redis->connect('192.168.75.132', 6379); for ($i=0;$i<5;$i++){ $data = array('key' => 'key'.$i, 'data' => 'testdata'); $param = array('publish', $channelName, json_encode($data)); $ret = call_user_func_array(array($redis, 'rawCommand'), $param); print_r($ret); } } catch (Exception $e){ echo $e->getMessage(); } 3.执行消费者订阅,开始阻塞获取消息php Subscribe.php4.执行生产者,开始发送消息php Publish.php php .\Publish.php 22222 #返回执行结果:频道的订阅数量 查看消费者终端 php .\Subscribe.php channel:testPubSub,message:{"key":"key0","data":"testdata"} channel:testPubSub,message:{"key":"key1","data":"testdata"} channel:testPubSub,message:{"key":"key2","data":"testdata"} channel:testPubSub,message:{"key":"key3","data":"testdata"} channel:testPubSub,message:{"key":"key4","data":"testdata"} 消费者获取到了生产者发送的消息。 4.直接使用php-redis扩展提供的方法实现发布订阅 1.消费者订阅Subscribe.php <?php /** * Created by PhpStorm. * User: jmsite.cn * Date: 2019/1/23 * Time: 11:29 */ //设置php脚本执行时间 set_time_limit(0); //设置socket连接超时时间 ini_set('default_socket_timeout', -1); //声明测试频道名称 $channelName = "testPubSub"; $channelName2 = "testPubSub2"; try { $redis = new Redis(); //建立一个长链接 $redis->pconnect('192.168.75.132', 6379); //阻塞获取消息 $redis->subscribe(array($channelName, $channelName2), function ($redis, $chan, $msg){ echo "channel:".$chan.",message:".$msg."\n"; }); } catch (Exception $e){ echo $e->getMessage(); } 2.生产者发送消息Publish.php <?php /** * Created by PhpStorm. * User: jmsite.cn * Date: 2019/1/23 * Time: 11:59 */ $channelName = "testPubSub"; $channelName2 = "testPubSub2"; //向指定频道发送消息 try { $redis = new Redis(); $redis->connect('192.168.75.132', 6379); for ($i=0;$i<5;$i++){ $data = array('key' => 'key'.$i, 'data' => 'testdata'); $ret = $redis->publish($channelName, json_encode($data)); print_r($ret); } } catch (Exception $e){ echo $e->getMessage(); } 3.执行消费者订阅,开始阻塞获取消息php Subscribe.php4.执行生产者,开始发送消息php Publish.php php .\Publish.php 22222 #返回执行结果:频道的订阅数量 查看消费者终端 php .\Subscribe.php channel:testPubSub,message:{"key":"key0","data":"testdata"} channel:testPubSub,message:{"key":"key1","data":"testdata"} channel:testPubSub,message:{"key":"key2","data":"testdata"} channel:testPubSub,message:{"key":"key3","data":"testdata"} channel:testPubSub,message:{"key":"key4","data":"testdata"} 消费者同样获取到了生产者发送的消息。退订和查看活动channel命令与生产者和消费者类似,只是参数不同而已。 原文地址: https://www.jmsite.cn/blog-586.html

优秀的个人博客,低调大师

redis,nodejs,php,pub/sub 实战: 微信语音识别

2015年5月22日 20:20:20 星期五 效果: 这边对微信说话, 浏览器端及时显示语音识别的文字 注意: 在连接socket.io时, 按下浏览器f12, 如果一直有请求不断的刷, 说明socket.io没有连接成功 代码: node.js server端 1 var module_path = '/usr/local/web/node/bin/node_modules/'; 2 var html = '<html> <head> <meta charset="utf-8"> <title>微信接口</title> <script src="http://cdn.bootcss.com/jquery/2.1.4/jquery.js"></script> <script src="http://cdn.bootcss.com/socket.io/1.3.5/socket.io.js"></script> </head> <body> <div id="voice"> 语音识别:<br><br> </div> <script type="text/javascript"> var voice = document.getElementById("voice"); var socket = io.connect("http://www.zhangzhibin.com:1337"); socket.on("hello", function(data){console.log(data); socket.emit("hello", {"status":"ok"}); }); socket.on("emit", function(data){var t = data+"<br>"; voice.innerHTML += t; socket.emit("emit", {"get":"data"}); }); </script> </body> </html>'; 3 //链接redis 4 var redis = require(module_path+'redis'); 5 var redis_client = redis.createClient(6379, '127.0.0.1'); 6 redis_client.auth('123456'); 7 redis_client.on('error', function(error){ 8 console.log('redis-error: ' + error); 9 }); 10 11 //创建服务器 12 var http = require('http'); 13 var url = require('url'); 14 var fs = require('fs'); 15 var ch = false; 16 var server = http.createServer(function (req, res) { 17 //获取请求参数 18 var objReqArg = url.parse(req.url, true).query; 19 ch = objReqArg.openid; 20 if (ch) { 21 redis_client.subscribe(ch, function(e){ 22 console.log('channel: '+ ch); 23 }); 24 }; 25 //返回 26 res.writeHead(200, {'Content-Type': 'text/html'}); 27 res.end(html); 28 29 }); 30 server.listen(1337, 'www.zhangzhibin.com'); 31 32 //创建服务器 33 var io = require(module_path + 'socket.io').listen(server); 34 io.sockets.on('connection', function(socket){ 35 socket.on('hello', function(data){ 36 console.log(data); 37 }); 38 socket.emit('hello', function(data){ 39 console.log(data); 40 }); 41 redis_client.on('message', function(error, msg){ 42 socket.emit('emit', msg); 43 }); 44 }); 45 46 console.log('Server running at http://www.zhangzhibin.com:1337'); 浏览器端html代码: 就是上边代码的第二行变量 var html='....' 1 <html> 2 <head> 3 <meta charset="utf-8"> 4 <title>微信接口</title> 5 <script src="http://cdn.bootcss.com/jquery/2.1.4/jquery.js"></script> 6 <script src="http://cdn.bootcss.com/socket.io/1.3.5/socket.io.js"></script> 7 </head> 8 <body> 9 <div id="voice"> 语音识别:<br><br> </div> 10 <script type="text/javascript"> 11 var voice = document.getElementById("voice"); 12 var socket = io.connect("http://www.zhangzhibin.com:1337"); 13 socket.on("hello", function(data){ console.log(data); socket.emit("hello", {"status":"ok"}); }); 14 socket.on("emit", function(data){ var t = data+"<br>"; voice.innerHTML += t; socket.emit("emit", {"get":"data"}); }); 15 </script> 16 </body> 17 </html> 微信端: 注意一点, 在语音回调函数中, 将语音识别的结果publish到某一个频道上即可 这时, 会触发上边第41行代码, 将文字发完浏览器端 下边是微信回调的代码: 1 public function voice() 2 { 3 // 每次发送消息都会post 来一份签名相关的数据 4 // $echostr = $this->checkSignature(); 5 // exit($echostr); 6 7 preg_match('#<FromUserName><!\[CDATA\[([a-zA-Z0-9_]+)\]#', $GLOBALS['HTTP_RAW_POST_DATA'], $matches1); 8 preg_match('#<Recognition><!\[CDATA\[([^\]]*)\]#', $GLOBALS['HTTP_RAW_POST_DATA'], $matches2); 9 $openid = !empty($matches1[1]) ? $matches1[1] : '0'; 10 $text = !empty($matches2[1]) ? $matches2[1] : '没听清...'; 11 12 $objRedis = iredis::getInstance(); 13 $objRedis->publish($openid, $text); 14 15 } 测试方法: 1. 关注我的微信公众号"xxx" 2. 发送消息"主播_username" 3. pc端打开http://www.zhangzhibin.com/wechat/index/zhubolist 4. 点击你刚才输入的用户名, 进入你的对话页面 5. 对微信发送语音消息, 即可在刚才的浏览器页面看到语音识别结果 冷知识点: php流处理 $_POST无法解释二进制流,需要用到$GLOBALS['HTTP_RAW_POST_DATA']或php://input $content=$GLOBALS['HTTP_RAW_POST_DATA'];//需要php.ini设置 $content=file_get_contents('php://input');//不需要php.ini设置,内存压力小

优秀的个人博客,低调大师

《Redis 8.10 + Spring Boot 实战》第10招 Pub/Sub 与 Streams——Redis 不只是缓存,也可以传递事件

晚上十点,运维群里又炸了:订单支付成功,积分没加上,库存也没扣,客户投诉电话打到爆。我是老李,在电商后端摸爬滚打多年,这种“消息丢了”的锅背过不少。以前我们总用 Redis 的发布订阅做广播,可它像大喇叭,喊完就没了,听没听到全凭运气。现在订单量上来,需要一套轻量又可靠的事件流,Redis Streams 刚好补上这个缺口。刚好 Redis 8.10 给 XREAD、XREADGROUP 增加了 MAXCOUNT、MAXSIZE 限制,趁热打铁写一篇实战复盘。

优秀的个人博客,低调大师

java支付宝开发-异常-01-"sub_code":"isv.invalid-app-id","sub_msg":"无效的AppID参数"

一、现象 无论请求哪个接口都报这个错误 二、异常原因 后来检查了一下,发现是因为 我支付宝网关写错了。沙箱环境和正式环境 的支付宝网关不同,如下 //支付宝网关名-正式环境 //public static final String OPEN_API_DOMAIN="https://openapi.alipay.com/gateway.do"; //支付宝网关名-沙箱环境 public static final String OPEN_API_DOMAIN="https://openapi.alipaydev.com/gateway.do"; 二、参考资料 1.蚂蚁金服沙箱测试:无效的AppID参数 2.invalid-app-id(无效的AppID)参数问题自查方案

优秀的个人博客,低调大师

GSA报告:Sub 1GHz频谱下LTE和5G全球应用现状

即将开播:5月20日,基于kubernetes打造企业级私有云实践 GSA发布报告认为,1GHz以下频段对于在所有城市/郊区/农村部署场景中扩展5G NR覆盖,确保跨不同地区的服务连续性,提高室内环境的服务质量以及帮助缩小数字鸿沟至关重要。移动运营商要求低于1 GHz的频谱,并且这些频段还将在创建专用网络的行业中发挥重要作用。基于这些原因,GSA预计在未来几年中,低于1GHz频谱的拍卖数量将会增加,并且使用已分配频谱许可证的5G NR部署也会有所增加。 GSA还发布了其他关键数据: 796家运营商已经在全球229个国家和地区推出了LTE网络。 169个国家/地区的501个运营商持有许可证,可使用低于1GHz的频谱启动LTE。 已知有155个国家/地区的389个运营商使用低于1 GHz的频谱启动了LTE网络。 12968台LTE设备支持1 GHz以下的一个或多个频段;此外,GSA已经确定了45个已宣布的5G设备,支持低于1 GHz的频段,其中20个已经投入商用。 40个国家/地区宣布了正式的(指定日期的)计划,以分配从现在到2022年1 GHz以下5G合适的频率(包括技术中立许可证或移动宽带服务许可证)。 其中有35个计划拍卖/分配700 MHz的频谱。 LTE使用了低于1 GHz频谱的几个关键频谱。许多相同的频段也用于基于2G或3G技术的网络和5G。 450 MHz(频段31):GSA已确定14家运营商正在投资450 MHz的LTE。他们中至少有十个在此频段启动了LTE。 600 MHz(频段71):确定有36家运营商在600 MHz频谱上进行投资,其中至少三家运营商已启动LTE服务。 700 MHz:200个运营商在关键的700 MHz频段上投资LTE: 已确定101家运营商在APT 700 MHz频谱上进行投资(频段28:703–748 / 758–803 FDD),其中包括99家拥有牌照的运营商,而57家GSA已确定已在该频段中启动了商用LTE服务。 GSA还确定了99家运营商在美国700 MHz频段之一(频段12、13、14或17)中投资LTE,它们之间覆盖699 MHz和798 MHz内的75 MHz。其中有81家使用其中一个频段启动了LTE网络。 20频段:(832–862 MHz / 791–821 MHz)是最常用的频段,有225个运营商在此频率范围内投资LTE,其中包括198个据认为已启动网络,25个其他许可运营商以及另外两个规划网络。

优秀的个人博客,低调大师

汇编(四)字的存储、DS和[address]、字的传送、mov、add、sub指令、数据段

寄存器(内存访问) 3.1 内存中字的存储 把0地址开始存放 4e20 0号单元是低地址单元,1号单元是高地址单元 0 20 1 4e 2 12h 任何两个地址连续的内存单元,n号单元和n+1号单元,可以将他们看成两个内存单元,也可以看成一个地址为n的字单元中的高位字节单元和低位字节单元 高位单元:n+ 低位单元:n 3.2 DS和[Address] CPU要赌气一个内存单元的时候,必须先给出这个内存单元的地址 内存地址是由:段地址和偏移地址组成的 CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址 mov bx, 1000 mov ds, bx mov al, [0] 上面三条指令将10000(1000:0)中的数据读到al中 mov al, [0] 已知的mov指令可以用完成两种传送功能 将数据直接送入寄存器 将寄存器中的内容送入另一个寄存器中 除

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册