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 发布订阅实现异步实时发短信的更多相关文章

  1. 把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_202 "表达欲"是人类成长史上的强大"源动力",恩格斯早就直截了当地指出,处在蒙昧时代即低 ...

  2. SpringBoot进阶教程(二十九)整合Redis 发布订阅

    SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subscribers). Ra ...

  3. 我在生产项目里是如何使用Redis发布订阅的?(一)使用场景

    转载请注明出处! 导语 Redis是我们很常用的一款nosql数据库产品,我们通常会用Redis来配合关系型数据库一起使用,弥补关系型数据库的不足. 其中,Redis的发布订阅功能也是它的一大亮点.虽 ...

  4. Redis 发布订阅,小功能大用处,真没那么废材!

    今天小黑哥来跟大家介绍一下 Redis 发布/订阅功能. 也许有的小伙伴对这个功能比较陌生,不太清楚这个功能是干什么的,没关系小黑哥先来举个例子. 假设我们有这么一个业务场景,在网站下单支付以后,需要 ...

  5. RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用

    本文版权归博客园和作者本人吴双共同所有,转载请注明本Redis系列分享地址.http://www.cnblogs.com/tdws/tag/NoSql/ Redis Pub/Sub模式 基本介绍 Re ...

  6. redis发布/订阅

    发布订阅简介 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息,消息之间通过channel传递. 准备工作 两台安装了redis的机器(虚拟 ...

  7. redis发布订阅、事务、脚本

    Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...

  8. Redis发布订阅和事物笔记

    Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...

  9. Redis笔记(五):Redis发布订阅

    Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...

随机推荐

  1. VisualSVN Server 改动用户password

    VisualSVN Server是很方便好用的SVNserver端软件.但有个问题,你在server端创建了usernamepassword后,用户无法自己改动password.据说VisualSVN ...

  2. 【转载】C# sleep 和wait的区别

    eep和wait都是使线程暂时停止执行的方法,但它们有很大的不同. 1. sleep是线程类Thread 的方法,它是使当前线程暂时睡眠,可以放在任何位置. 而wait,它是使当前线程暂时放弃对象的使 ...

  3. python 字符串前缀

    普通字符串 一般字符串都是已unicode编码,且和C类似,可以使用\来转义,比如 a = "test\ntest" print(a) 输出 test test 前面加r 在字符串 ...

  4. 流媒体开发之开源项目live555---更改server端的帧率大小和码率大小

    -----------------------------qq:1327706646 010101010101010110010101010101010101010author:midu 010101 ...

  5. 标准代码书写 C++ 的string类的用法总结

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果 离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是 ...

  6. InspectIT_EUM 实现原理概述

    在Git上查看 InspectIT 实现原理概述: 实现原理详解:  1.jsAgent如何注入到浏览器 通过ASM框架修改HttpService.service()方法,加入相关逻辑,对每一个Htt ...

  7. Spring中的AOP(学习笔记)

    是什么AOP及实现方式 AOP的基本概念 Schema-base AOP Spring AOP API AspectJ

  8. VS 预先生成事件命令

    宏 说明 $(ConfigurationName) 当前项目配置的名称(例如,“Debug|Any CPU”). $(OutDir) 输出文件目录的路径,相对于项目目录.这解析为“输出目录”属性的值. ...

  9. apache benchmark

    1 ab是什么 是一个web高并发测试工具,可以发送get.put.post请求. 2 ab -n和-c共存 -c是concurrency的缩写,即同一时间发送多个请求. -n是指本次总共发送多少个请 ...

  10. CodeForces 24D Broken robot(期望+高斯消元)

    CodeForces 24D Broken robot 大致题意:你有一个n行m列的矩形板,有一个机器人在开始在第i行第j列,它每一步会随机从可以选择的方案里任选一个(向下走一格,向左走一格,向右走一 ...