目前redis异步处理方式

来自技术开发小组内部wiki
跳转至: 导航搜索

目前网站用的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 返回,否则这个进程会结束