首页 » Web前端 » php断链技巧_运用Redis的notifications功能实现延时责任

php断链技巧_运用Redis的notifications功能实现延时责任

访客 2024-11-13 0

扫一扫用手机浏览

文章目录 [+]

延时备份流程图

如果仍旧利用crontab来实现,就有点勉强了。
类似这种需求最常见的是做事器之间的关照,如果做事器B由于网络不稳定或者做事器压力较大导致不能即时对做事器A的作出精确相应,那么做事器A就会延迟一段韶光再次发送,直到收到做事器B的精确相应或者超出最大关照次数为止。
过去的做法是定时扫表,把关照失落败的再次发送一遍,虽然可以多次发送关照,但是发送间隔太短会增加做事器B的压力,发送间隔太长的时效性就不能担保,显然处理这种延时任务用crontab根本不能办理问题。

php断链技巧_运用Redis的notifications功能实现延时责任

从Redis 2.8.0版本起,加入了\"大众Keyspace notifications\"大众(即\"大众键空间关照\公众)的功能。
按照官方的说法:键空间关照,许可Redis客户端从“发布/订阅”通道中建立订阅关系,以便客户端能够在Redis中的数据因某种办法受到影响时收到相应事宜。
比如:所有改变给定key的命令;所有经由lpush操作的key;所有在0号数据库中过期的key等等。
我们在处理延时任务的时候,先把关照失落败的ID作为key的一部分存到redis缓存中,并设定过期韶光(相称于延时),当这条缓存数据失落效的时候,通过订阅关系(用NodeJS实现)就可以收到,通过剖析就可以知道过期KEY,这样就可以再次发送关照,从而实现延时任务。

php断链技巧_运用Redis的notifications功能实现延时责任
(图片来自网络侵删)

不过,须要把稳一点:Redis的发布/订阅目前是即发即弃(fire and forget)模式的,因此无法实现事宜的可靠关照。
也便是说,如果发布/订阅的客户端断链之后又重连,则在客户端断链期间的所有事宜都丢失了。

关于expired事宜关照的发送韶光

Redis利用以下两种办法删除过期的键:a:当一个键被访问时,程序会对这个键进行检讨,如果键已过期,则删除该键;b:系统会在后台定期扫描并删除那些过期的键。

当过期键被以上两种办法中的任意一种创造并且删除时,才会产生expired事宜关照。

Redis不担保生存韶光(TTL)变为 0 的键会立即被删除:如果没有命令访问这个键,或者设置生存韶光的键非常多的话,那么在键的生存韶光变为0,到该键真正被删除,这中间可能会有一段比较显著的韶光间隔。

因此,Redis产生expired事宜关照的韶光,是过期键被删除的时候,而不是键的生存韶光变为 0 的时候。

接下来我们开始代码实现(假定阅读本文的同学已精确安装Nginx/PHP/Redis/NodeJS的***。

一、与本文干系的环境信息

Redis配置文件路径:/etc/redis/6379.conf 测试用的Redis库编号为:3 监听的NodeJS文件:/NodeApp/notice.js 发送的PHP代码为:/send.php 吸收redis数据的PHP代码:/test.php 业务流程:首先运行notice.js开启监听,然后运行send.php发送,如果没有收到成功相应,将ID存入redis缓存,之后按照10秒、30秒、60秒、120秒、300秒的韶光间隔,再次发送关照,直到收到对的成功相应,或者超出最大关照次数为止。

二、修正Redis配置文件

由于键空间关照功能须要耗费一定的CPU韶光,因此默认情形下,该功能是关闭的。
可以通过修正配置文件,或者通过CONFIG SET命令,设置notify-keyspace-events选项,来启用或关闭该功能。

该选项的值为空字符串时,该功能禁用,选项值为非空字符串时,启用该功能,非空字符串由特定的多个字符组成,每个字符表示不同的意义: K keyspace事宜,事宜以__keyspace@<db>__为前缀进行发布 E keyevent事宜,事宜以__keyevent@<db>__为前缀进行发布 g 一样平常性的,非特定类型的命令,比如del,expire,rename等 $ 字符串特定命令 l 列表特定命令 s 凑集特定命令 h 哈希特定命令 z 有序凑集特定命令 x 过期事宜,当某个键过期并删除时会产生该事宜 e 驱逐事宜,当某个键因maxmemore策略而被删除时,产生该事宜 A g$lshzxe的别名,因此”AKE”意味着所有事宜 把稳:该选项的值中至少须要包含K或者E,否则不会发布任何事宜。
比如,如果须要开启针对列表的keyspace事宜关照,则该选项须要配置为\公众Kl\公众。

我们在做事器上运行vim /etc/redis/6379.conf,找到notify-keyspace-events开头的一行,将其配置为:notify-keyspace-events Ex,含义为:发布keyevent事宜,利用过期事宜(当每一个key失落效时,都会天生该事宜)。
保存退出,并重启redis做事。
如图:

修正redis的配置文件

三、安装Node扩展

在网站根目录下,依次运行: npm init #初始化创建package.json npm install redis #安装redis扩展 npm install mysql #安装mysql扩展

四、实现send.php

为了便于实现延时的打算,我们将存入redis的key格式设计为:固定前缀+ID+韶光戳+次数,如:noticeId_12345678_1482991887_2

send.php 流程

关键代码:

$delayArr=[0,10,30,60,120,300];//延韶光隔,相对付首次关照韶光,单位为 s $res=doSomething();//发送 $content=date('Y-m-d H:i:s').' 第 '.$nums.' 次发送关照,ID为:'.$noticeId.\"大众\n\"大众; if($res==true){ $content.='发送成功'.\"大众\n\公众; }else{//未收到对方回应 $content.='发送失落败,等待下次重发'.\公众\n\"大众; $expTime=$delayArr[$nums]; $nums++; saveNoticeToRedis($noticeId,$stamp,$nums,$expTime);//存入缓存 } //记录日志 file_put_contents($root.'/tmp.log',$content,FILE_APPEND);

五、实现 notice.js

做事器端运行notice.js后,会一贯监听redis的Expired事宜,取到ExpiredKey后,把ID、韶光、关照次数,POST给test.php,从而实现再次发送。

关键代码:

var client = redis.createClient('6379', '127.0.0.1'); client.psubscribe(\"大众__keyevent@\公众+redisDB+\"大众__:expired\"大众,function(){ //console.log('订阅成功'); }); client.on(\"大众pmessage\"大众, function(pattern, channel, expiredKey) { var tmpArr=expiredKey.split('_'); if(tmpArr[0]==keyPrefix){ console.log('-----expired Key-----',expiredKey); var noticeId=tmpArr[1]; var stamp=parseInt(tmpArr[2]); var nums=parseInt(tmpArr[3]); sendPost(noticeId,stamp,nums,logFile);//向test.php发送数据 }else{ console.log('-----error Key-----',expiredKey); writeLog(logFile,'The key \"大众'+expiredKey+'\公众 is a error key.'); } });

六、实现 test.php

test.php 流程

关键代码:

$delayArr=[0,10,30,60,120,300];//延韶光隔,相对付首次关照韶光,单位为 s $res=doSomething();//发送 $content=date('Y-m-d H:i:s').' 第 '.$nums.' 次发送关照,ID为:'.$noticeId.\"大众\n\"大众; if($res==true){ $content.='发送成功'.\"大众\n\公众; }else{//未收到对方回应 if($nums && $nums>=6){ $content.='ID:'.$noticeId.\"大众已达到最大关照次数,任务停滞\n\公众; }else{ $content.='发送失落败,等待下次重发'.\"大众\n\"大众; $expTime=$stamp+$delayArr[$nums]-time(); $nums++; saveNoticeToRedis($noticeId,$stamp,$nums,$expTime);//存入缓存 } } //记录日志 file_put_contents($root.'/tmp.log',$content,FILE_APPEND);

七、测试结果

tmp.log 日志内容

八、其他解释

本文内容为个人原创,首发今日头条,同时供应代码下载地址,供大家学习互换。
本人往后还会发布更多原创干货,如果以为有用,希望及时关注本头条号。

代码下载地址:http://www.i1981.com/zb_users/upload/2016/12/20161223.zip

标签:

相关文章

房山第一探寻历史文化名区的魅力与发展

房山区,位于北京市西南部,历史悠久,文化底蕴深厚。作为北京市的一个重要组成部分,房山区的发展始终与首都的发展紧密相连。房山区积极推...

Web前端 2025-02-18 阅读1 评论0

手机话费开钻代码数字时代的便捷生活

我们的生活越来越离不开手机。手机话费作为手机使用过程中的重要组成部分,其充值方式也在不断创新。手机话费开钻代码应运而生,为用户提供...

Web前端 2025-02-18 阅读1 评论0

探寻专业奥秘如何查询自己专业的代码

计算机科学已成为当今社会不可或缺的一部分。掌握一门专业代码对于个人发展具有重要意义。面对繁杂的学科体系,如何查询自己专业的代码成为...

Web前端 2025-02-18 阅读1 评论0