打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
redis实现有序的消息队列

redis是什么东西就不多说了,网上文章一搜一大堆。

首先来说一下我要实现的功能:

类似一个消息中转站吧,如果有人要发送消息,先将消息发到我这里来,然后我这边进行转发,为的就是有一个统一的管理和修改时方便,

而且所有的消息有优先级,也会有定时发送(如果同一时间消息过多,则会有延迟)

思路:

首先一个是将这两个分为两个队列来实现, 一个用来实现消息优先级,一个来实现定时发送

用的是redis的有序集合,用zadd添加时,将score比做是优先级,也可以用时间戳来当做score,用来表示时间

PHP 版本简易实现

将消息加入优先级的队列,将1,2替换为时间就是定时发送的队列了

 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->zAdd('zset1', 1, 'message'); $redis->zAdd('zset1', 2, 'message2');
  • 1
  • 2
  • 3
  • 4

从队列中取出数据

1 $redis->zRevRangeByScore('zset1, '+inf', '-inf', array('withscores'=>false, 'limit'=>array(0,20)));

这条语句表示从zset1这个队列里按照score从最大(+inf)到最小(-inf)的排序中取出20条,不带score,如果想要从小到大可以用 zRangeByScore

如果你想让这些都运行在命令行下,可以参考下面来,当然这些是经过删减的
复制代码

 <?php  while (true) {          $pid = pcntl_fork();         if ($pid == -1) {             echo date('Y-m-d H:i:s') . "fork失败!\n";        } else if ($pid == 0) {             $redis = new Redis();             $redis->connect('127.0.0.1', 6379);             $redis->zRevRangeByScore('zset1', '+inf', '-inf', array('withscores'=>false, 'limit'=>array(0,20)));             exit;         } else {             pcntl_wait($status);         } }        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

复制代码

pcntl_fork是PHP中的生成子进程,当调用该函数时,会返回一个进程pid,当pid为0时表明是在子进程中,所以把要执行的东西全放这里

线上的一个项目,运行几个月了,用子进程方式还没有出过问题,也没挂过,相当不错

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Redis消息通知系统的实现 | 火丁笔记
redis 札记 -- phpredis 中文说明
PHP操作Redis
Redis系列二:Redis支持的数据类型和使用方法(二)
Redis常用的基本语法、命令
7)深度解密 Redis 的有序集合(ZSet)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服