redis 中发布和订阅可以实现消息的实时传输,这里我只是用它的事件驱动,当客户端发送了消息,服务器端立马可以接收指令处理相应的业务逻辑。

客户端

client.php

  1. <?php
  2. //发布
  3. $redis = new Redis();
  4. $redis->connect('11.10.1.121', 6379);
  5. $message = 'send msg';
    #将手机号存放到队列中
  6. $redis->lPush("phone", "15013028236");
  7. $ret = $redis->publish('subscribe', $message);

服务器端

server.php

  1. <?php
  2. //订阅端 常驻进程
  3. ini_set('default_socket_timeout', -1); //不超时
  4. $redis = new Redis();
  5. $redis->connect('11.10.1.121', 6379);
  6. $result = $redis->subscribe(array('subscribe'), 'callback');
  7.  
  8. function callback($instance, $channelName, $message) {
  9. # 回调函数内只能使用 SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE 4 条命令
  10. # 事件驱动 接到信息后执行业务逻辑 如 发送短信 、邮件等
  11.  
  12. //请求接口 接口完成发送短信、邮件业务逻辑
  13. $curl = curl_init();
  14. curl_setopt($curl, CURLOPT_URL, 'http://www.layui.test/home/article/attrJob');
  15. curl_setopt($curl, CURLOPT_HEADER, 1);
  16. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  17. $data = curl_exec($curl);
  18. echo curl_getinfo($curl, CURLINFO_HTTP_CODE);
  19. curl_close($curl);
  20. }

发送短信示例代码

  1. public function attrJob(){
  2. //示例代码
  3. $redis = new Redis();
  4. $redis->connect('11.10.1.121', 6379);
  5. $phone = $redis->rPop("phone");
  6.  
  7. if (!$phone || ctype_digit($phone)) {
  8. echo json_encode(['error_code' => 1, 'msg' => "s手机号不能为空!"]);
  9. return;
  10. }
  11.  
  12. #使用短信接口
  13. echo json_encode(['error_code' => 0, 'msg' => "短信已发送!"]);
  14. }

########## 测试1000并发下处理业务逻辑 ############

客户端

  1. <?php
  2. //发布
  3. $redis = new Redis();
  1. $redis->connect('11.10.1.121', 6379); $message = 'send msg'; #测试并发处理 for ($i = 1; $i <= 1000; $i++) { $ret = $redis->publish('subscribe', $message); }

服务器端

  1. <?php
  2. //订阅端 常驻进程
  3. ini_set('default_socket_timeout', -1); //不超时
  4. $redis = new Redis();
  5. $redis->connect('11.10.1.121', 6379);
  6. $result = $redis->subscribe(array('subscribe'), 'callback');
  7.  
  8. function callback($instance, $channelName, $message) {
  9. # 回调函数内只能使用 SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE 4 条命令
  10. # 事件驱动 接到信息后执行业务逻辑 如 发送短信 、邮件等
  11.  
  12. //访问接口 点赞数+1
  13. $curl = curl_init();
  14. curl_setopt($curl, CURLOPT_URL, 'http://www.layui.test/home/article/giveLike';
  15. curl_setopt($curl, CURLOPT_HEADER, 1);
  16. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  17. $data = curl_exec($curl);
  18. echo curl_getinfo($curl, CURLINFO_HTTP_CODE);
  19. curl_close($curl);
  20. }

点赞接口

  1. public function giveLike() {
  2. $model = M("test");
  3. $model->where('id=4')->setInc('num', 1); // 点赞+1
  4. }

将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. 在java中String类为什么要设计成final?

    大神链接:在java中String类为什么要设计成final? - 程序员 - 知乎 我进行了重新排版,并且更换了其中的一个例子,让我们更好理解. String很多实用的特性,比如说“不可变性”,是工 ...

  2. IO多路复用:select、poll、epoll示例

    一.IO多路复用 所谓IO多路复用,就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. Linux支持IO多路复用的系统调用有 ...

  3. iOS知识点全梳理-b

    感谢分享 原文链接:http://www.jianshu.com/p/5d2163640e26 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会 ...

  4. UBUNTU安装PHP,即所谓得LAMP

    Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组经常使用来搭建动态站点或者server的开源软件,本身都是各自独立的程序,可是由于常被放在一起使用.拥有了越来越 ...

  5. Jquery-easyui的默认图标的使用,以及如何添加自己想要的图标

    easyui的默认图标有以下这些: .icon-blank{ background:url('icons/blank.gif') no-repeat; } .icon-add{ background: ...

  6. 图像处理之 opencv 学习---opencv 中的常用算法

    http://blog.csdn.net/lindazhou2005/article/details/1534234 文中有提到鲁棒性 http://blog.csdn.net/chary8088/a ...

  7. 程序编写安全代码——sendto和recvfrom的大坑

    近日帮一个兄弟查代码问题,再处理完一系列问题以后,发现程序某些时候工作还是不正常,甚至会崩溃.因为环境所限,不能使用gdb,所以我只能review他的代码.最终发现原来是sendto和recvfrom ...

  8. 在vc6.0下编的对话框界面如果没做过其他处理,往往显的很生硬,怎么样才能使他有Windows XP的风格呢,其实也很简单,我们来看看下面两种方法。

    在vc6.0下编的对话框界面如果没做过其他处理,往往显的很生硬,怎么样才能使他有Windows XP的风格呢,其实也很简单,我们来看看下面两种方法.    方法一: 1.首先确认你在Windows   ...

  9. Spring源码深度解析——笔记

    1.spring容器的基本用法 xml配置 <bean id="myTestBean" class="bean.MyTestBean"/> 调用 B ...

  10. 使用URL dispatcher的范例

    在上面的一篇文章中,我们介绍了怎样使用URL disptacher.在这篇文章中,我们来通过一个范例更进一步来了解怎样实现它. 1)创建一个具有URL dispatcher的应用 我们首先打开我们的S ...