使用php结合redis-zset,hash类型完成延迟队列信息。

  1. 创建create_list.php

    # 实例化 redis对象
    $redis = new Redis();
    # 建立链接
    $redis->connect('127.0.0.1',6379);
    
    echo " 模拟实现 延时队列 \n ";
    # 定义时间戳超出当前的时间
    $time = time() + 20;
    # 存储zset有序集合中,存储到这里是方便,如果有个较高的优先级,
    $redis->zadd('zset',$time,$time+1);
    # 将这个时间戳的data值保存到hash类型中
    $redis->hset('hsetlist',$time,json_encode(['code' => 200,'msg' => '处理第1条']));
    
  2. 创建监听延迟队列文件time_list.php,要以cli模式访问

    $redis = new Redis();
    
    $redis->connect('127.0.0.1',6379);
    
    # 一直循环
    while(true)
    {
        # 获取当前时间戳
        $time = time();
    	
        # 睡眠一秒
        sleep(1);
    	
        # 获取这个信息
        $sort_data = $redis->zrevrangebyscore('zset',$time,10);
    	
        # 如果获取到了
        if($sort_data)
        {
            # 获取hash中的值
            $data = $redis->hget('hsetlist',$time);
    	
            # json解析
            $json_data = json_decode($data,true);
    	
            # 输出
            echo $json_data['msg'] . "\n";
    	
            # 删除hash存储的这个key
            $redis->hDel('hsetlist',$time);
    	
            # 删除有序集合的值
            $res = $redis->zrem('zset',$time+1);
    
            if($res)
            {
                echo "删除成功 \n";
            }
            continue;
        }
    }
    

    终端运行这个文件:php time_list.php

    浏览器访问create_list.php文件

    不知道这样算不算是实现了延迟队列,我感觉如果这样处理的话,可以直接用hash处理,还需要在思考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值