所有的網站應該都會有一個非常簡單的需求,首頁一秒之內打開。
滿足的方式主要有兩種:
頁面靜態化,效果最好,對服務器基本沒負擔,只要帶寬足夠就好了。我知道一個PV過億的站點就是全站靜態(以前新浪也是),據說早就想換成動態的,可以省很多事兒,但至今仍然沒有成功。
數據內存化,把常用的數據全都放到內存,定期分批寫入硬盤。相比靜態頁面,這個方法對CPU的要求稍高。好處就不細說了,動態網頁的好處相比大家都耳熟能詳了。
山坡網選擇了第二種方案,數據內存化。
revel本身提供了cache支持,可通過配置切換到memcached(其實不用revel本身的cache也沒任何障礙,比如最近我對GroupCache挺感興趣)。先說最簡單的用法,在代碼中引用"github.com/robfig/revel/cache",然后就可以直接用了。
var obj Object
err := cache.Get(“key”, &obj)
cache.Set(“key”, obj, time.Minute * 10)
默認的話cache是存在revel實例運行機器的內存里。
好,數據查出來了,放到內存了,接下來的事情就是更新數據的方式了。比如每10分鐘更新一下“最熱書評”,每1分鐘更新一下“用戶動態”。這就要用到revel的Job系統了。
revel.OnAppStart(func() {
revmgo.AppInit()statisticJob.Run()
dailyStatisticJob.Run()
activityJob.Run()jobs.Schedule("@every 1m", &activityJob)
jobs.Schedule("@every 10m", &statisticJob)
jobs.Schedule("@daily", &dailyStatisticJob)
jobs.Schedule("@daily", crawlerJob)
//每天凌晨3點執行
jobs.Schedule("0 0 3 * * *", &recommendationJob)
jobs.Schedule("@weekly", &weeklyJob)
})
上面這段代碼非常好的演示了job的用法。job.Run()會立即異步執行。至于Job的接口,我想不用贅述,實現一個Run()方法就好了。
type ActivityJob struct {
}func (j *ActivityJob) Run() {
//從數據庫中讀取數據,或者做數據統計
//然后更新緩存cache.Set(util.CKBookActivity, activities, cache.FOREVER)
}
值得一提的是jobs.Schedule的語法,它參照了unix的cron命令,由于我沒有unix使用背景,所以還是學習了一下,感覺真是靈活好用!
jobs.Schedule的第一個參數接受六段數字的字符串,如“0 0 0 0 0 0”。
從左到右,分別代表:
秒 | 分 | 小時 | 每個月第幾天 | 第幾個月 | 每周第幾天 | |
有效的值 | 0-59 | 0-59 | 0-23 | 1-31 | 1-12 JAN-DEC | 0-6 SUN-SAT |
有效特殊字符 | * / , - | * / , - | * / , - | * / , -? | * / , - | * / , –? |
特殊字符的含義分別是:
* 表示所有值都可以,比如放到第五位(第幾個月)就代表每個月都觸發
- 表示范圍,比如在第三位(小時)9-17 代表從早上9點到17點之間每小時觸發一次
/ 表示范圍增量,比如在第二位(分)3-59/15 代表,從第分鐘到第59分鐘,每隔15分鐘觸發
, 表示多個觸發條件,比如在第六位(每周第幾天)MON,WED,FRI 表示僅在周一、周三、周五激發
除此之外,還可以使用預定義的計劃,如:
預定義 | 描述 | 等同于 |
@yearly (或者@annually) | 每年的1月1日 00:00:00運行 | 0 0 0 1 1 * |
@monthly | 每月1日 00:00:00運行 | 0 0 0 1 * * |
@weekly | 每周日 00:00:00運行 | 0 0 0 * * 0 |
@daily (或者@midnight) | 每天 00:00:00運行 | 0 0 0 * * * |
@hourly | 每小時運行 | 0 0 * * * * |
還有一個預定義的字串 @every ,用法是
@every <duration>
比如
@every 1m 每分鐘執行一次
@every 1h30m10s 每隔1小時30分鐘10秒執行一次
明白了嗎?真的非常靈活強大。Jobs.Schedule實際上是調用了https://github.com/robfig/cron這個包,使用的時候別忘了引用。
以上,緩存和任務調度都講完了。
文章列表