zoukankan      html  css  js  c++  java
  • 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: 之后要是数据量大的话 可以通过集群的方式的进行稳定扩容

     
  • 相关阅读:
    uuid模块
    使用pip管理第三方包
    hashlib和hmac模块
    hashlib和hmac模块
    JAVA热部署,通过agent进行代码增量热替换!!!
    史上最全java pdf精品书籍整理
    JAVA RPC (十) nio服务端解析
    java代理,手把手交你写java代理
    JAVA RPC 生产级高可用RPC框架使用分享
    DB缓存一致性
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/12624218.html
Copyright © 2011-2022 走看看