【随手记】基于Mysql事件功能实现周期定时任务.

程序猿很多时候都会遇到一些"周期性无限循环"的需求,
比如"定期刷新某个页面的模块显示的内容","每一分钟记录某个模块的使用情况"等等...
但是根据使用环境有可能不需要接入类似NoSql技术缓存处理(说白了就是经费不足,配置太低)
那么在数据量沟通不大的情况下可以使用MYSQL中的事件以实现周期性任务

开启MySql “事件” 支持

首先查看Mysql事件服务配置是否开启

	SHOW VARIABLES LIKE  'event_scheduler'

可以得到的显示如下:
在这里插入图片描述
若显示event_scheduler配置为OFF状态,则使用命令开启功能

	SET GLOBAL event_scheduler = ON;

但注意,如果使用动态参数修改配置的话仅可维持本次服务功能开启,服务器重启之后需要再次进行开启,永久开启的方法为在Mysql配置文件 my.cnf 中添加 event_scheduler=ON 即可.

使用 Navicat 配置事件

选择边栏导航条中的"事件"栏快捷栏中的"事件"选项,选择"新建事件"
在这里插入图片描述
点击后设置进行配置,如下图所示该配置项为"从当前时间开始,每间隔20分钟执行一次事件"
在这里插入图片描述
之后在定义中设置要执行的数据库语句,当前演示为基础插入语句
在这里插入图片描述
保存即完成MYSQL定时事件配置.

使用SQL命令配置事件

官方给出的mysql配置事件完整代码如下:

CREATE
  [DEFINER = { user | CURRENT_USER }] 
  EVENT 
  [IF NOT EXISTS] 
  event_name 
  ON SCHEDULE schedule 
  [ON COMPLETION [NOT] PRESERVE] 
  [ENABLE | DISABLE | DISABLE ON SLAVE] 
  [COMMENT 'comment'] 
  DO event_body; 
   
schedule: 
  AT timestamp [+ INTERVAL interval] ... 
 | EVERY interval 
  [STARTS timestamp [+ INTERVAL interval] ...] 
  [ENDS timestamp [+ INTERVAL interval] ...] 
   
interval: 
  quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | 
       WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | 
       DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

其中解释说明:
event_name :创建的event名字(唯一确定的)。
ON SCHEDULE:计划任务。
schedule: 决定event的执行时间和频率(注意时间一定要是将来的时间,过去的时间会出错),有两种形式 AT和EVERY。
[ON COMPLETION [NOT] PRESERVE]: 可选项,默认是ON COMPLETION NOT PRESERVE 即计划任务执行完毕后自动drop该事件;ON COMPLETION PRESERVE则不会drop掉。
[COMMENT ‘comment’] :可选项,comment 用来描述event;相当注释,最大长度64个字节。
[ENABLE | DISABLE] :设定event的状态,默认ENABLE:表示系统尝试执行这个事件, DISABLE:关闭该事情,可以用alter修改
DO event_body: 需要执行的sql语句(可以是复合语句)。CREATE EVENT在存储过程中使用时合法的。

熟悉命令代码之后,创建一个简单的事件过程:

create event event_now 
on schedule 
at now() 
do insert into events_list values('event_now', now());

查看事件:

mysql> show events;

最后

还是不推荐使用MYSQL事件,因为会产生不可预料的无法控制库问题.同时在大规模数据定时时资源的利用上远没有采用持久化缓存进行存储安全可靠,仅限小规模交互不频繁时使用,慎用!
在这里插入图片描述

原创文章 9 获赞 5 访问量 687

猜你喜欢

转载自blog.csdn.net/smilekzero/article/details/103902718