通過定時任務處理數據緩存

上週寫了一篇文章Redis緩存與異步請求多個sql的性能問題 ,主要介紹了兩種異步提交與redis緩存的性能關係。後來思考了一下,這兩種緩存的方式有些愚蠢。因爲數據變化機會較大。而通過數據過期的方式和強制刪除數據的方式再請求,仍會造成初次請求過慢。
本文主要介紹一種緩存思路。即通過linux的crontab定時任務,每隔一段時間更新緩存數據。這樣避免了每次數據過期後請求等待時間長的問題。

後臺代碼

這裏先貼兩段請求數據加入redis緩存的代碼(這裏代碼並不重要,只有能給redis加入緩存即可)

$list = MidScheduleStore::find()->select('purpose_delivery')->where(['is_last'=>0])->distinct()->asArray()->all();
        common::redisSet('aj_purpose_delivery',$list,86400);

        $list = MidScheduleStore::find()->select('parent_terminal_type')->where(['is_last'=>0])->distinct()->asArray()->all();
        common::redisSet('aj_parent_terminal_type',$list,86400);

這是一個YII2的orm,大概的意思是從數據庫中查到想要的數據後保存到redis中,這裏的Redis做了一個簡單封裝。
到這了加入緩存的代碼就已經完成了,確保http能訪問到就ok。

crontab代碼

linux的crontab定時器也十分簡答,只需要兩個命令就搞掂啦。
crontab -e 編輯定時器。
crontab -l 查看定時器。
創建一個訪問url的定時器只要一行代碼就可以了。
比如上面的緩存代碼路徑爲www.baidu.com/cache

*/10 * * * * /usr/bin/curl http://www.baidu.com/cache > /dev/null 2>&1

代碼前面的五個星星是配置時間,每隔多長時間請求一次。具體就不說明。
後面“ > /dev/null 2>&1”是爲了避免每請求一次系統自動發一封郵件。
當然,直接請求url有一定的風險。推薦的做法是寫一個腳本文件,通過定時器去調用這個文件。
說到這裏需要強調一個事情,也是當時在辦公室討論有點熱烈的問。php是腳本語言,也就是說,安裝了php之後是可以通過命令取調用的,無需寄託web服務器。很多時候我們都是通過http的方式去請求php,導致很容易就忽略了php本來是一種腳本語言。
請求腳本文件的方式有點不一樣。需要先執行php命令

* * * * * /usr/bin/php -f /root/test.php 

因爲系統對於安全性的要求並不高,這裏我通過複雜url地址的方式去請求,避免了寫原生php。
當然要求再高一點,可以控制IP地址等方式去驗證請求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章