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

 
原文地址:https://www.cnblogs.com/Renyi-Fan/p/12624218.html