redis 发布订阅实现异步实时发短信
redis 中发布和订阅可以实现消息的实时传输,这里我只是用它的事件驱动,当客户端发送了消息,服务器端立马可以接收指令处理相应的业务逻辑。
客户端
client.php
<?php
//发布
$redis = new Redis();
$redis->connect('11.10.1.121', 6379);
$message = 'send msg';
#将手机号存放到队列中
$redis->lPush("phone", "15013028236");
$ret = $redis->publish('subscribe', $message);
服务器端
server.php
<?php
//订阅端 常驻进程
ini_set('default_socket_timeout', -1); //不超时
$redis = new Redis();
$redis->connect('11.10.1.121', 6379);
$result = $redis->subscribe(array('subscribe'), 'callback'); function callback($instance, $channelName, $message) {
# 回调函数内只能使用 SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE 4 条命令
# 事件驱动 接到信息后执行业务逻辑 如 发送短信 、邮件等 //请求接口 接口完成发送短信、邮件业务逻辑
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://www.layui.test/home/article/attrJob');
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
echo curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
}
发送短信示例代码
public function attrJob(){
//示例代码
$redis = new Redis();
$redis->connect('11.10.1.121', 6379);
$phone = $redis->rPop("phone");
if (!$phone || ctype_digit($phone)) {
echo json_encode(['error_code' => 1, 'msg' => "s手机号不能为空!"]);
return;
}
#使用短信接口
echo json_encode(['error_code' => 0, 'msg' => "短信已发送!"]);
}
########## 测试1000并发下处理业务逻辑 ############
客户端
<?php
//发布
$redis = new Redis();
$redis->connect('11.10.1.121', 6379); $message = 'send msg'; #测试并发处理 for ($i = 1; $i <= 1000; $i++) { $ret = $redis->publish('subscribe', $message); }
服务器端
<?php
//订阅端 常驻进程
ini_set('default_socket_timeout', -1); //不超时
$redis = new Redis();
$redis->connect('11.10.1.121', 6379);
$result = $redis->subscribe(array('subscribe'), 'callback'); function callback($instance, $channelName, $message) {
# 回调函数内只能使用 SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE 4 条命令
# 事件驱动 接到信息后执行业务逻辑 如 发送短信 、邮件等 //访问接口 点赞数+1
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://www.layui.test/home/article/giveLike';
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
echo curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
}
点赞接口
public function giveLike() {
$model = M("test");
$model->where('id=4')->setInc('num', 1); // 点赞+1
}
将id =4 的num 重置为0

运行服务器端 ,在运行客户端后

总结:redis 默认是单线程处理高并发很友好,经常用来处理抢购、秒杀等高并发业务逻辑。
redis 发布订阅实现异步实时发短信的更多相关文章
- 把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_202 "表达欲"是人类成长史上的强大"源动力",恩格斯早就直截了当地指出,处在蒙昧时代即低 ...
- SpringBoot进阶教程(二十九)整合Redis 发布订阅
SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subscribers). Ra ...
- 我在生产项目里是如何使用Redis发布订阅的?(一)使用场景
转载请注明出处! 导语 Redis是我们很常用的一款nosql数据库产品,我们通常会用Redis来配合关系型数据库一起使用,弥补关系型数据库的不足. 其中,Redis的发布订阅功能也是它的一大亮点.虽 ...
- Redis 发布订阅,小功能大用处,真没那么废材!
今天小黑哥来跟大家介绍一下 Redis 发布/订阅功能. 也许有的小伙伴对这个功能比较陌生,不太清楚这个功能是干什么的,没关系小黑哥先来举个例子. 假设我们有这么一个业务场景,在网站下单支付以后,需要 ...
- RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用
本文版权归博客园和作者本人吴双共同所有,转载请注明本Redis系列分享地址.http://www.cnblogs.com/tdws/tag/NoSql/ Redis Pub/Sub模式 基本介绍 Re ...
- redis发布/订阅
发布订阅简介 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息,消息之间通过channel传递. 准备工作 两台安装了redis的机器(虚拟 ...
- redis发布订阅、事务、脚本
Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...
- Redis发布订阅和事物笔记
Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...
- Redis笔记(五):Redis发布订阅
Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...
随机推荐
- Linux变量内容的删除、代替与替换
变量内容的删除与代替 范例一:先让小写的 path 自己定义变量配置的与 PATH 内容同样 [root@www ~]# path=${PATH} [root@www ~]# echo $path / ...
- 翻译:A Tutorial on the Device Tree (Zynq) -- Part V
A Tutorial on the Device Tree (Zynq) -- Part V Application-specific data 之前提过,设备树中是一些特殊信息,这样一个驱动可以管理 ...
- layer弹层
获得 layer 文件包后,解压并将 layer 整个文件夹(不要拆分结构) 存放到你项目的任意目录,使用时,只需引入 layer.js 即可. 注意:引入layer.js前必须先引入jquery1. ...
- appium 查错
很高兴最近论坛用appium的人多了不少,但也有不少由于不了解appium导致出现错误后不知道从何下手.这里根据我的个人经验给出一个简单的查错指南,不保证能解决所有错误,但至少让你知道你应该朝哪个方向 ...
- HDU 2601An easy problem-素数的运用,暴力求解
id=17433" target="_blank" style="color:blue; text-decoration:none">An ea ...
- POJ 2886 Who Gets the Most Candies?(树状数组+二分)
题目链接 注意题目中给的顺序是顺时针的,所以在数组中应该是倒着存的.左就是顺时针,右就是逆时针.各种调试之后,终于A了,很多种情况考虑情况. #include <cstring> #inc ...
- day 18 面向对象的 继承
一.概念性知识 面向对象的三大特征: 继承,多态,封装 继承是创建新类的一种方法,在python中,新建的类可以继承一个或多个父类,父类称作基类或超类,新建的类又称作派生类或子类. 继承的好处 ...
- android支付
这里不讲具体的某个平台的支付使用,在工作中,公司使用到了ping++支付,使用它的好处是可以不用关心某个平台的支付了,例如:微信支付.支付宝支付等,太多的平台有个整合,是一个很好的事情,当然这也减轻了 ...
- Linux系统(Centos)下安装Java环境配置步骤详述
1.首先要去下载好JDK,Java SE 8的官方网址是http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2 ...
- WIFI的通信知识整理
这两天在解决wifi芯片的一个底层问题,看了很多资料,下面做一个简要记录: 1.信号调制的基本原理 链接:http://wenku.baidu.com/link?url=3K6Z5fBIN20lPzB ...