小編給大家分享一下如何使用MySQL周期任務(wù)來定時清理在線用戶列表,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)公司專注于洪湖企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,成都做商城網(wǎng)站。洪湖網(wǎng)站建設(shè)公司,為洪湖等地區(qū)提供建站服務(wù)。全流程按需定制開發(fā),專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
情景設(shè)定
客戶端為android手機,登錄后希望保存其在線狀態(tài)(server端),并且對于每一個在線用戶都有一個相應(yīng)的checksum值,每次執(zhí)行操作時需要校驗該值。為了防止黑客截獲checksum值進行二次攻擊,因此checksum值在每次登錄或間隔一段時間后都會動態(tài)改變。因此需要在server端保存用戶的在線狀態(tài),當(dāng)用戶離線時或超出一定時間沒有操作時,刪掉在線記錄,這樣每次新登錄時就會產(chǎn)生新的checksum值。
問題
需要定時清理過期的在線用戶,因為有的用戶喜歡保存密碼而不使用登出功能。
解決方法
定時清理過期的在線用戶,可以想到使用一些周期性的定時任務(wù)。定時任務(wù)可以設(shè)置在操作系統(tǒng)中,也可以設(shè)置在web application中,但今天想做的是直接使用MySQL的周期任務(wù)。
過程
MySQL中的定時周期任務(wù)是Event Scheduler,見網(wǎng)頁 http://dev.mysql.com/doc/refman/5.6/en/events.html ,該頁面的右側(cè)可以選擇你的MySQL的版本,以查看相應(yīng)的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是類似的,那我們可以預(yù)計它應(yīng)該也是啟用一個list,然后往這個list中加入一個個任務(wù),然后mysql會啟動一個線程專門維護這個list,并在適當(dāng)?shù)臅r間執(zhí)行該list上符合條件的任務(wù)。
大概了解了Event Scheduler的概念后,我們進入下一個步驟Event Scheduler Configuration。
在Event Scheduler Configuration中介紹了Event Scheduler的三種狀態(tài)ON/OFF/DISABLED,它們分別代表什么含義以及如何切換均參見Event Scheduler Configuration頁面。
現(xiàn)在,我們用show processlist命令來查看一下活動中的Event Scheduler有哪些。
執(zhí)行,輸出:
我們現(xiàn)在要啟用Event Scheduler,輸入命令
或者也可以在server的配置文件((my.cnf, or my.ini on Windows systems)中設(shè)置event_scheduler=1,然后重啟服務(wù)器。
現(xiàn)在我們再來查看Event Scheduler的狀態(tài):
輸出:
可以看到已經(jīng)啟動了。
為了測試,我們先建立一個onlineUser表,并插入數(shù)據(jù)
下一步就是設(shè)定我們的定時任務(wù):
CREATE EVENT cleanOvertimeOnlineUser ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 minute DO delete from test.onlineUser where lastVisit < date_sub(now(), interval 24 hour);
執(zhí)行,輸出:
我們等5分鐘,查看結(jié)果。
可以看到2013-04-14 18:55:05的那條記錄已經(jīng)被刪除了。
其他:
Event Scheduler在執(zhí)行諸如select等會有返回值的語句時,是不會返回內(nèi)容到console上的,也不會返回到內(nèi)存中。這樣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 ;
用類似這樣的語句可以在數(shù)據(jù)庫層自動完成網(wǎng)站一些統(tǒng)計量的更新,而不用寫到web application中。也是很方便。
以上是“如何使用MySQL周期任務(wù)來定時清理在線用戶列表”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!