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