- 我创建了一个表session,有三个字段user_account, session_id, time。我们只需要关注time这个字段。在mysql中该字段是bigint类型,也就是c++中的long。
- time保存的是上一次user_account用户访问服务端的时间。我要做的是,设置登录有效时间是5分钟,也就是说如果5分钟之内,用户没有再次访问服务端的话,就会删除它的这条记录。
- 我的实现思路是,设置一个定时任务,让他每隔5分钟遍历一次session表,删除那些超时的数据,所谓超时,就是当前系统时间减去记录在time里面的时间大于5分钟。
- 首先来学习一些东西:
-
首先在创建定时任务之前要开启event_scheduler,具体如下:
sql SET GLOBAL event_scheduler = 1;
- 用如下方法查看是否开启成功:
SHOW VARIABLES LIKE 'event_scheduler';
- 然后自己先用下面的小例子测试一下,看是不是真的可以:
CREATE TABLE aaa(timeline TIMESTAMP); CREATE EVENT e_test_insert ON SCHEDULE EVERY 1 SECOND DO INSERT aaa VALUE(CURRENT_TIMESTAMP);
然后立马查看aaa中的内容
select * from aaa
;如果为空则失败。- 测试完了不要忘了关闭哪个定时任务,否则服务器炸了,不要来找我:
alter event e_test_insert disable;
- 顺便把aaa表清空
delete from aaa ;
- 然后删除任务
drop event e_test_insert;
- 查看所有任务
show events;
-
- 下面进入正题:
create event delInvalidSession
on schedule every 5 minute
do
delete from session
where timestampdiff(minute,from_unixtime(time),now())>5;
解释:
create event delInvalidSession
创建了一个名为delInvalidSession的任务。
on schedule every 5 minute
设置没5分钟运行一次。
do 都后面就是一般的sql语句了,没有什么好奇的。
然后关于timestampdiff(minute,from_unixtime(time),now())
这个函数,解释如下,也可以自己去查阅官方文档。
from_unixtime(time)
这个函数,把数据库中以long格式存储的从’1970-01-01 00:00:00‘开始到现在的秒数,转化为日期时间格式,用于计算。这里防止另一个相关函数的解释:
最后放一张我执行的结果图:
我在写博客的同时select了一下,然后我写完上面的内容(超过5分钟),在select一下,发现之前那条记录已经被删除了,证明我的设置起作用了。- 结束。欢迎评论区讨论。