主要原理

利用redis过期通知事件

1.redis配置

daemonize yes //守护进程

这里需要配置 notify-keyspace-events 的参数为 “Ex”。x 代表了过期事件

2.封装redis类

namespace app\common\service;

class MyRedis

{

private $redis;

public function __construct($host = '127.0.0.1', $port = 6379)

{

$this->redis = new \Redis();

$this->redis->connect($host, $port);

$this->setOption();

}

public function expire($key = null, $time = 0)

{

return $this->redis->expire($key, $time);

}

public function psubscribe($patterns = array(), $callback)

{

$this->redis->psubscribe($patterns, $callback);

}

public function setOption()

{

$this->redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);

}

}

3.接受过期通知

这里用的是tp5的命令模式,框架如果支持命令模式会方便很多

#! /usr/local/php/bin/php

namespace app\api\command;

use think\console\Command;

use think\console\Input;

use think\console\Output;

use app\common\model\Order;

use app\common\service\MyRedis;

class Test extends Command

{

protected function configure()

{

$this->setName('test')->setDescription('Here is the remark ');

}

protected function execute(Input $input, Output $output)

{

$redis = new MyRedis();

$redis->psubscribe(array('__keyevent@0__:expired'),

function ($redis, $pattern, $chan, $msg) use ($output) {

if ($pattern = '__keyevent@0__:expired' && $msg) {

$array = explode('_', $msg);

$function = $array['0'];

$this->$function($array['1']);

$output->writeln($msg);

}

});

}

/*

* 具体事件

*/

public function order($id)

{

$Order = Order::get($id);

$a=mt_rand(10000,99999);

$data['status'] = $a;

$Order->save($data);

}

}

4.把命令挂到后台一直去执行

nohup php /home/www/app/think test &

jobs #查看是否生效

ps aux | grep php #再看看也行

5.在需要的地方设置过期事件

setex order_1 5 chokingwin

然后就会自动触发order方法,参数是"_"后面的1

注意事项

如果代码修改过,记得kill掉 nohup,再启动一次

感谢chokingwin的文章

php redis 定时任务,利用redis实现定时任务,完全不需要crontab相关推荐

  1. 【Redis笔记】一起学习Redis | 如何利用Redis实现一个分布式锁?

    一起学习Redis | 如何利用Redis实现一个分布式锁? 前提知识 什么是分布式锁? 为什么需要分布式锁? 分布式锁的5要素和三种实现方式 实现分布式锁 思考思考 基础方案 改进方案 保证setn ...

  2. 【Redis】利用 Redis 实现分布式锁

    技术背景 首先我们需要先来了解下什么是分布式锁,以及为什么需要分布式锁. 对于这个问题,我们可以简单将锁分为两种--内存级锁以及分布式锁,内存级锁即我们在 Java 中的 synchronized 关 ...

  3. 【Redis】利用Redis优化数据案例

    一.环境搭建 业务分析:编写一个简单的前端页面,选择用一个 <select>列表,页面加载完成后发送Ajax请求, 加载所有省份. 数据库环境 创建如下的数据库以及数据表: create ...

  4. 利用PHP实现定时任务,利用php 实现定时任务简单实现 代码

    linux下可以借助crontab+php的方式(Crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序 ) windows 下有两种方式: 借助于vbscript脚本 ...

  5. mysql redis geo_利用Redis的Geo功能实现查找附近的位置

    1. 前言 老板突然要上线一个需求,获取当前位置方圆一公里的业务代理点.明天上线!当接到这个需求的时候我差点吐血,这时间也太紧张了.赶紧去查相关的技术选型.经过一番折腾,终于在晚上十点完成了这个需求. ...

  6. 利用redis实现分布式锁

    一.背景 在分布式项目中,由于一个服务会有多个实例运行,有些特定的场景需要我们用到分布式锁. 例如:最近我正在做的交易所项目,其中一个服务是钱包模块,需要每半个小时就去归集用户的资金,这个定时任务只能 ...

  7. redistemplate 设置失效时间_开发新技能之利用Redis高级用法监听过期键处理失效的订单...

    前言 最近项目区分了不同的订单类型,要求订单的失效时间不一样,比如活动订单的失效时间要短一些.由于之前订单的失效时间都是固定的,现在有些类型的订单过期时间发生变化.因此需要重新处理时效订单. 订单失效 ...

  8. 又见到一个利用redis漏洞的活生生的例子

    又见到一个如何利用redis漏洞的活生生的例子! 原理大概如下: config set  dir /var/spool/cron config set dbfilename root 新建cron.t ...

  9. 利用 redis 实现延迟消息队列

    有一些应用场景,比如下完订单后,20分钟没有付款,可以取消订单.这里会用到延迟消息队列.由于不想维护各种 MQ,如果你的项目里面用了 redis 的话,可以选择利用 redis 的特性来实现延迟消息队 ...

  10. c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务

    作者: 杨高超 juejin.im/post/5a4984265188252b145b643e 获取全局唯一标识的方法介绍 在一个IT系统中,获取一个对象的唯一标识符是一个普遍的需求.在以前的单体应用 ...

最新文章

  1. 买粮油也能玩出新花样?京东超市携手金龙鱼带来狗年礼盒!
  2. 墨迹天气接口html,moji_weather_spider.py
  3. 混合SSVEP-P300 BCI生产双频SSVEP
  4. Java学习之Hello World 第一个小程序
  5. javafx android sdk,JavaFX打包到Android上
  6. zoj 1074 To the MAX
  7. Hadoop--Linux环境下JDK/Hadoop的安装与配置
  8. 深入理解深度学习中的激活函数
  9. 如何在Git上创建工程,演示在Git中创建项目
  10. vs怎么设置php文件调试,使用vscode 编辑调试php 配置方与VSCode断点调试PHP
  11. cad2004教程_CAD卸载教程
  12. 免费的自媒体原创度检测工具有哪些?快速帮你提高系统推荐
  13. 黑马 Java八股文面试题视频教程,Java面试八股文宝典(框架篇)
  14. mysql怎么解析json字符串_mysql解析json字符串
  15. 一台计算机多个屏幕,一台主机两个显示器,详细教您电脑两个显示器怎么设置...
  16. Python基础(九)——print函数详解,配合参数示例详解
  17. python描述对象静态特性的数据为_The couple wanted to adopt the black boy they had been _______._学小易找答案...
  18. linux磁盘检测和修复
  19. 硬盘损坏如何恢oracle,硬盘损坏后恢复数据的几种方法
  20. Cloud 80% 客制化键盘分享,模块拼色设计

热门文章

  1. JEECG支付服务窗平台与服务窗接口对接文档
  2. fuel6.1搭建openstack
  3. man ifconfig时提示:-bash: man: command not found
  4. Windows Server 2012的服务管理自动化
  5. 若无云,岂有风——词语语义相似度计算简介
  6. C# 算法之选择排序
  7. 判断数组类型的4种方法
  8. vue学习项目之去哪儿网笔记
  9. 好用的 curl 抓取 页面的封装函数
  10. 【转】Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式