• laravel通过 Redis 定时执行脚本


    laravel通过 Redis 定时执行脚本

    一、总结

    一句话总结:

    方法一:通过监听 redis 的 key 失效事件,来定时进行业务逻辑操作。
    方法二:第一种方式由于很吃 Redis 的稳定性,万一 Redis 的服务可不用那么,将有一部分的数据丢失,所以改进一下 Redis 使用方式 - 有序集合。

    二、laravel通过 Redis 定时执行脚本

    转自或参考:通过 Redis 定时执行脚本 | Laravel China 社区
    https://learnku.com/articles/34526

    方法一:通过监听 redis 的 key 失效事件,来定时进行业务逻辑操作。

    通过监听 redis 的 key 失效事件,来定时进行业务逻辑操作。

    提前10分钟提醒信息

    1.修改redis配置文件

    notify-keyspace-events "Ex"
    

    2.修改datebase配置文件

     'notify_cache' => [
                'host' => env('REDIS_HOST', '127.0.0.1'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_PORT', 6379),
                'database' => env('REDIS_DB', 4),
                'read_write_timeout' => -1,  // 读写超时设定
            ],
    

    3.创建过期key

    $ttl = strtotime($data['return_time']) - time() - 600;
    $redis = Redis::connection('notify_cache');
    $redis->set('NOTIFY_CONFIRM:'.$id,$id);
    $redis->expire('NOTIFY_CONFIRM:'.$id,$ttl);
    

    4.创建监听队列

    $cache_db = config('database.redis.notify_cache.database',4);
    $pattern = '__keyevent@'.$cache_db.'__:expired';
    Redis::connection('notify_cache')->subscribe($pattern,function ($channel){
        // 订阅键过期事件
        Log::info('-----notify-----'.$channel);
        $key_type = str_before($channel,':');
        switch ($key_type) {
            case 'NOTIFY_CONFIRM':
                $id = str_after($channel,':');    // 取出学员ID
                $client  = Client::find($id);
                if ($client) {
                      //业务逻辑
                    }
                }
                break;
            default:
                break;
        }
    });
    

    PS:之所以用这种方式 不想每段时间是去做扫表操作。



    方法二:改进一下 Redis 使用方式 - 有序集合。

    第一种方式由于很吃 Redis 的稳定性,万一 Redis 的服务可不用那么,将有一部分的数据丢失,所以改进一下 Redis 使用方式 - 有序集合。

    加入队列
    const LISTEN_REDIS_NAME = 'eeop:axb:bind_log';//定时解绑做判断处理
    const AUTO_TIMEOUT = 60;//自动解绑60s
    //加入队列 有序队列
    $this->redis::zadd(self::LISTEN_REDIS_NAME, time() + self::AUTO_TIMEOUT, $this->bind_id);
    2. 解绑服务

    $list = $this->redis::ZRANGEBYSCORE(self::LISTEN_REDIS_NAME,0,time());
    foreach ($list as $value){
        $this->redis::zrem(self::LISTEN_REDIS_NAME, $value);
    }
    PS: 之后要是数据量大的话 可以通过集群的方式的进行稳定扩容

     
  • 相关阅读:
    RabbitMQ消息队列-高可用集群部署实战
    python+rabbitMQ实现生产者和消费者模式
    RabbitMQ Connection Channel 详解
    Linux中安装Erlang
    基于 CentOS 搭建 Python 的 Django 环境
    redis单机安装
    CentOS7安装RabbitMQ(单机)
    iptables 规则行号,删除及插入规则
    jQuery前端生成二维码
    MailKit使用IMAP读取邮件找不到附件Attachments为空的解决方法
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/12624218.html
Copyright © 2020-2023  润新知