目前redis异步处理方式
目前网站用的redis异步处理有三种;1、老版本的redis异步处理(消息推送/订阅发布);2、殿林写的daemo异步处理;3、小哥在daemo写的redis异步处理(消息队列)
1、老版本的redis异步处理(消息推送/订阅发布)
此为网站用的最早的异步处理机制,利用消息推送/订阅发布机制完成,
适用于处理多个异步消息有先后顺序处理的,redis 消息推送(基于分布式 pub/sub)多用于实时性较高的消息推送,并不保证可靠,断电就清空。
使用代码:
$this->redis_publish->redisPublish($channel,$msg);
$channel:推送频道
$msg:推送内容
Redis处理的内容文件在models/redis_msg文件夹下
Redis调用的函数结果如果返回的是1,则说明成功,如果返回0或不反回,则说明失败。
注意事项:使用时函数最终都要有个返回;建议在最底下写成return 1;如果有失败在失败的地方return 0。这种写法防止在中间写不同的判断返回1或0时,有漏掉的判断层,如果走到那个判断层,会返回null(和0是一个意思),此时会再次执行此函数,连续进行4次
缺陷:如果已上线的异步处理,再次修改上线后需要杀掉那个进程
ps aux|grep redis
将cmdrun redis_subcribe index的进程杀掉,最长一分钟后会自动重启
2、殿林写的daemo异步处理(不做讲解,不建议用,数据库总是出问题)
$this->load->library('redis_codes',null,"msgredis");
$this->msgredis->app_msg_push($msgbody);
3、小哥在daemo写的redis异步处理(消息队列)
此为网站现在用的异步消息处理。此处理用swoole与redis结合,开启了10个子进程处理消息,适用于异步处理,不需要及时的,也不需要多个消息有先后顺序的。
经在网上查询“消息推送虽然有持久化,但是又太弱智,也并非完全可靠不会丢。”,这个丢失暂未查到在哪
使用代码:
$this->load->library('redis',null,"msgredis");
$msgbody=array("order_sn"=>$order_sn);
$this->msgredis->to_push_msg("order_create_send_sms","sendSms",$msgbody);
to_push_msg:
参数1:控制器cmdrun下的文件名,例:"order_create_send_sms"
参数2:方法名,例:"sendSms"
参数3:传送的值,数组
Redis处理的文件内容在controllers/cmdrun文件夹下
注意事项:使用此方式处理的执行函数中不可用exit 返回,否则这个进程会结束