Redis是一个开源的,基于内存的数据结构存储器,用作数据库,缓存和消息中间件。支持的数据结构有strings, hashes, lists, sets, sorted sets。详细可参考redis官方介绍,本文介绍如何利用Redis来实现实时队列和延时队列,测试环境为Docker,编程语言是php并安装phpredis扩展。

环境搭建

创建根目录test,然后在test目录里面创建Dockerfile文件和docker-composer.yml文件,内容如下:

Dockerfile

FROM php:7.4.11-cli-alpine3.12
LABEL MAINTAINER="redistest"
ENV ROOT_PATH /webapp
WORKDIR ${ROOT_PATH}
RUN mkdir -p ${ROOT_PATH} && cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini && sed -i 's/;date.timezone =/date.timezone = PRC/g' /usr/local/etc/php/php.ini && sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 8M/g' /usr/local/etc/php/php.ini && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && apk update && apk add gcc g++ automake autoconf libtool make
RUN  pecl install http://pecl.php.net/get/redis-5.1.1.tgz && docker-php-ext-enable redis
RUN  apk add supervisor && echo_supervisord_conf
CMD supervisord -n -c /etc/supervisord.conf

docker-composer.yml

version: '3'
services:redis-test:build: context: .dockerfile: ./Dockerfileimage: redis-testworking_dir: /webappvolumes:- ./:/webapplinks: - redisredis:image: redis:5.0.6-alpinecommand: redis-server --notify-keyspace-events Ex

实时队列

使用lists数据结构,生产者将消息(数据)入队,消费者将消息出队后处理业务逻辑。

生产者producter.php

$redis = new Redis();
$redis->connect('redis',6379); //连接redis
$key = 'queue'; //队列名
$redis->rPush($key,1,2); //向队列右侧入队数据1和2

消费者consumer.php

$redis = new Redis();
$redis->connect('redis',6379); //连接redis
$key = 'queue'; //队列名
while(true){ //死循环while($value = $redis->blPop($key,5)){ //队列左侧出队(阻塞式)//处理业务逻辑echo $value[1];echo PHP_EOL;}
}

延时队列

一,使用sorted sets数据结构,score存储时间戳(timestamp)。

$redis = new Redis();
$redis->connect('redis',6379); //连接redis
$key = 'queue'; //队列名
$time = time();
for($i=$time-20;$i<$time;++$i){$redis->zAdd($key,$i,$i.'-val'); //写入测试数据
}
while(true){ //死循环出队$r = $redis->multi()->zRangeByScore($key,0,$time)->zRemRangeByScore($key,0,$time)->exec();if(isset($r[0])){foreach($r[0] as $value){//处理逻辑echo $value;echo PHP_EOL;}}
}

二,使用redis的发布,订阅过期key通知。

$redis = new Redis();
$redis->connect('redis',6379); //连接redis
for($i=1;$i<=3;++$i){$time = time() + $i;$key = 'key_exp_'.$time;$val = $time.'-val';$redis->set($key,$val,['nx', 'ex'=>$i]);//设置过期key
}//订阅key过期事件
$redis->psubscribe(array('__keyevent@0__:expired'), function($redis, $pattern, $chan, $msg){echo "Pattern: $patternn";echo "Channel: $chann";echo "Payload: $msgnn";
});

执行

打开终端,切换到根目录test里,启动服务命令如下:

docker-compose up

在终端打开新窗口,进入容器命令如下:

docker exec -it redis_redis-test_1 sh

总结与思考

利用Redis能够实现实时队列和延时队列的功能,但优势和缺点都同样非常明显,优势就是配置简单,使用方便快捷。缺点是消费者出队后在处理逻辑的过程若进程因意外死了数据会丢失,而且上例中延时队列只适合处理小量消息。

订阅发布延时_Redis实时队列和延时队列的php实现相关推荐

  1. RabbitMQ 的延时队列和镜像队列原理与实战

    在阿里云栖开发者沙龙PHP技术专场上,掌阅资深后端工程师.掘金小测<Redis深度历险>作者钱文品为大家介绍了RabbitMQ的延时队列和镜像队列的原理与实践,重点比较了RabbitMQ提 ...

  2. springboot集成rabbitmq死信队列的延时队列使用

    目录         1.自动分列延时队列 2.应答失败自动转储延时再通知机制 ------------------------------------------------------------ ...

  3. redis 发布订阅实际案例_Redis源码分析之发布订阅+慢查询+排序以及监视器

    发布订阅 发布订阅就是一个经典的观察者模式,其中通道是指channel字符串本身,而模式是指正则表达式,进行匹配.结合Redis设计与实现一书 数据结构 基本数据结构 在client对象中,分别记录了 ...

  4. 4che3 scu发送超时设置_Redis实现订阅发布与批量发送短信

    1 什么是redis订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.直接点,你可以理解为我关注了你,你发布了信息,文章等,我就可以立 ...

  5. 消息队列之延时消息应用解析及实践

    简介:消息队列常用于实现业务需要的异步.解耦以及削峰功能.但在某些特殊的业务场景中,还需要消息队列服务本身支持一些特殊的消息类型,比如常见的延时消息.本次直播为您深入剖析延时消息的特性.应用场景,对比 ...

  6. redis发布订阅c接口_Redis 发布/订阅机制原理分析

    序:使用订阅发布功能的时候想查一下客户端是如何接收消息的(客户端订阅了频道之后也会注册一个回调函数,服务端publish消息之后回调函数会获取到消息.这块没看到太多内容只有C++的源码),无意中查到这 ...

  7. 消息队列面试 - 如何解决消息队列的延时以及过期失效问题?

    消息队列面试 - 如何解决消息队列的延时以及过期失效问题? 面试题 如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决? 面试官心理分析 你看 ...

  8. DOTween的使用(一) DOTween实现代码延时执行 + DOTween.Sequence的(队列)的简单介绍

    实现代码的延时执行,可以用Invoke.Coroutine实现,还可以借助DOTween这款插件实现延时执行. 一:用DOTween.To实现延时: /// <summary>/// DO ...

  9. redisson究极爽文-手把手带你实现redisson的发布订阅,消息队列,延迟队列(死信队列),(模仿)分布式线程池

    参考资料 :分布式中间件实战:java版 (书籍), 多线程视频教程(视频)- 项目启动环境 导入依赖 <parent><groupId>org.springframework ...

  10. 【SpringBoot】43、SpringBoot中整合RabbitMQ实现延时队列(延时插件篇)

    死信队列实现篇,参考文章:[SpringBoot]60.SpringBoot中整合RabbitMQ实现延时队列(死信队列篇) 一.介绍 1.什么是延时队列? 延时队列即就是放置在该队列里面的消息是不需 ...

最新文章

  1. 热门专业没那么难,文科生打开统计学的正确方式!
  2. 远程访问,文件的压缩,ip地址的设置(9,11,12unit)
  3. jsfiddle网站介绍
  4. linux 的压缩文件格式,linux 文件格式压缩
  5. 白盒测试基本路径生成工具_基于基本最短路径列生成的车辆路径问题
  6. LeetCode—33. 搜索旋转排序数组
  7. 玩cf出现outofmemory_CF画质粗糙平衡感人,却能历经十年经久不衰,靠的是什么?...
  8. m 文件 dll matlab 中调用_利用USO服务将特权文件写入武器化
  9. python orm_python的orm
  10. mysql远程访问显示警告信息_开启mysql远程访问过程中所遇常见问题的解决办法...
  11. toString 方法
  12. 思科 命令 TFTP
  13. 「经济理财」 简七理财之小白理财入门篇9堂课
  14. Java、十六进制转二进制
  15. 人民搜索2013年招聘的三道算法题 西安站
  16. a++与++a同a--与--a代码拆分
  17. Mac port 安装postgres92 + postgres92-server
  18. 监控摄像头为什么可以发出声音并且可以接受对方声音?
  19. 【生信分析】clusterProfiler: universal enrichment tool for functional and comparative study(3)
  20. 多用户php商城 开源,php多用户商城选择开源的好

热门文章

  1. php dom 分离html内容
  2. CSS3属性选择器总结
  3. Mybatis查询时数据丢失的问题
  4. 解决idea使用maven打自定义jar缺失
  5. sudo和su命令简介
  6. SpringMVC防止表单重复提交
  7. Python的三种基本数据类型
  8. Linux登陆密码策略
  9. 【Amaple教程】4. 组件
  10. Educational Codeforces Round 26 - A, B, C 思维