使用MySQL周期任务来定时清理在线用户列表
2013-04-16 11:45
375 查看
情景设定
客户端为android手机,登录后希望保存其在线状态(server端),并且对于每一个在线用户都有一个相应的checksum值,每次执行操作时需要校验该值。为了防止黑客截获checksum值进行二次攻击,因此checksum值在每次登录或间隔一段时间后都会动态改变。因此需要在server端保存用户的在线状态,当用户离线时或超出一定时间没有操作时,删掉在线记录,这样每次新登录时就会产生新的checksum值。
问题
需要定时清理过期的在线用户,因为有的用户喜欢保存密码而不使用登出功能。
解决方法
定时清理过期的在线用户,可以想到使用一些周期性的定时任务。定时任务可以设置在操作系统中,也可以设置在web application中,但今天想做的是直接使用MySQL的周期任务。
过程
MySQL中的定时周期任务是Event Scheduler,见网页 http://dev.mysql.com/doc/refman/5.6/en/events.html ,该页面的右侧可以选择你的MySQL的版本,以查看相应的Event Scheduler的手册。我们使用的是MySQL 5.5.
先来看看它的overview:
“Conceptually, this is similar to the idea of the Unix
可以看到,它和cron job是类似的,那我们可以预计它应该也是启用一个list,然后往这个list中加入一个个任务,然后mysql会启动一个线程专门维护这个list,并在适当的时间执行该list上符合条件的任务。
大概了解了Event Scheduler的概念后,我们进入下一个步骤Event Scheduler Configuration。
在Event Scheduler Configuration中介绍了Event Scheduler的三种状态ON/OFF/DISABLED,它们分别代表什么含义以及如何切换均参见Event Scheduler Configuration页面。
现在,我们用show processlist命令来查看一下活动中的Event Scheduler有哪些。
执行,输出:
我们现在要启用Event Scheduler,输入命令
或者也可以在server的配置文件((
现在我们再来查看Event Scheduler的状态:
输出:
可以看到已经启动了。
为了测试,我们先建立一个onlineUser表,并插入数据
下一步就是设定我们的定时任务:
执行,输出:
我们等5分钟,查看结果。
可以看到2013-04-14 18:55:05的那条记录已经被删除了。
其他:
Event Scheduler在执行诸如select等会有返回值的语句时,是不会返回内容到console上的,也不会返回到内存中。这样select语句似乎在Event Scheduler中没什么用,其实不是,它可以用来作为insert语句的原料。例如:
用类似这样的语句可以在数据库层自动完成网站一些统计量的更新,而不用写到web application中。也是很方便。
客户端为android手机,登录后希望保存其在线状态(server端),并且对于每一个在线用户都有一个相应的checksum值,每次执行操作时需要校验该值。为了防止黑客截获checksum值进行二次攻击,因此checksum值在每次登录或间隔一段时间后都会动态改变。因此需要在server端保存用户的在线状态,当用户离线时或超出一定时间没有操作时,删掉在线记录,这样每次新登录时就会产生新的checksum值。
问题
需要定时清理过期的在线用户,因为有的用户喜欢保存密码而不使用登出功能。
解决方法
定时清理过期的在线用户,可以想到使用一些周期性的定时任务。定时任务可以设置在操作系统中,也可以设置在web application中,但今天想做的是直接使用MySQL的周期任务。
过程
MySQL中的定时周期任务是Event Scheduler,见网页 http://dev.mysql.com/doc/refman/5.6/en/events.html ,该页面的右侧可以选择你的MySQL的版本,以查看相应的Event Scheduler的手册。我们使用的是MySQL 5.5.
先来看看它的overview:
“Conceptually, this is similar to the idea of the Unix
crontab(also known as a “cron job”) or the Windows Task Scheduler.”
可以看到,它和cron job是类似的,那我们可以预计它应该也是启用一个list,然后往这个list中加入一个个任务,然后mysql会启动一个线程专门维护这个list,并在适当的时间执行该list上符合条件的任务。
大概了解了Event Scheduler的概念后,我们进入下一个步骤Event Scheduler Configuration。
在Event Scheduler Configuration中介绍了Event Scheduler的三种状态ON/OFF/DISABLED,它们分别代表什么含义以及如何切换均参见Event Scheduler Configuration页面。
现在,我们用show processlist命令来查看一下活动中的Event Scheduler有哪些。
执行,输出:
我们现在要启用Event Scheduler,输入命令
或者也可以在server的配置文件((
my.cnf, or
my.inion Windows systems)中设置event_scheduler=1,然后重启服务器。
现在我们再来查看Event Scheduler的状态:
输出:
可以看到已经启动了。
为了测试,我们先建立一个onlineUser表,并插入数据
下一步就是设定我们的定时任务:
CREATE EVENT cleanOvertimeOnlineUser ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 minute DO delete from test.onlineUser where lastVisit < date_sub(now(), interval 24 hour);
执行,输出:
我们等5分钟,查看结果。
可以看到2013-04-14 18:55:05的那条记录已经被删除了。
其他:
Event Scheduler在执行诸如select等会有返回值的语句时,是不会返回内容到console上的,也不会返回到内存中。这样select语句似乎在Event Scheduler中没什么用,其实不是,它可以用来作为insert语句的原料。例如:
delimiter | CREATE EVENT e_daily ON SCHEDULE EVERY 1 DAY COMMENT 'Saves total number of sessions then clears the table each day' DO BEGIN INSERT INTO site_activity.totals (time, total) SELECT CURRENT_TIMESTAMP, COUNT(*) FROM site_activity.sessions; DELETE FROM site_activity.sessions; END | delimiter ;
用类似这样的语句可以在数据库层自动完成网站一些统计量的更新,而不用写到web application中。也是很方便。
相关文章推荐
- mysql 定时任务使用 简略记录
- Servlet监听器定时监听在线用户生成列表
- 使用navicat for mysql 写一个简单的定时任务。
- aix系统使用定时任务每天备份清理nohup日志操作步骤
- 使用Application和SessionID实现在线用户列表统计
- mysql 定时任务的使用
- 使用Application和SessionID实现在线用户列表统计
- MySQL触发器和Windows计划任务结合使用达到定时触发的效果
- Linux中使用定时任务每周定时清理45天以前日志 推荐
- 使用sched库完成周期定时任务
- mysql中使用存储过程,游标,定时任务
- SharedObject使用:在FluorineFx.net与Flex中使用共享对象维护在线用户列表实例
- SharedObject使用:在FluorineFx.net与Flex中使用共享对象维护在线用户列表实例【转】
- mysql中使用存储过程,游标,定时任务
- Linux使用定时任务每周定时清理45天以前日志
- Linux使用定时任务每周定时清理45天以前日志
- ScheduledExecutorService定时周期执行指定的任务 ,关于scheduleAtFixedRate 和 scheduleWithFixedDelay使用区别
- mysql 数据库Event定时任务使用详解(Navicat 及直接SQL语句创建)
- 使用redis实现获取在线用户列表
- linux下使用定时任务完成mysql定期备份