zoukankan      html  css  js  c++  java
  • php redis 消息队列

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

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

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

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

    思路:

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

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

    PHP 版本简易实现

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

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

    从队列中取出数据

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

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

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

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

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

  • 相关阅读:
    C#面向对象三大特性:多态
    C#面向对象三大特性:继承
    C#面向对象三大特性:封装
    C# 函数
    SQL常用语句和函数
    NuGet 常用命令
    SQL Server不同服务器不同数据库间的操作
    C# 面试编程算法题
    C# 冒泡排序
    域名和URL各部分组成
  • 原文地址:https://www.cnblogs.com/xiezhi/p/5546921.html
Copyright © 2011-2022 走看看