惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - AllenDang

创业心得 - 从确定投资意向到开始发工资还有多远? 什么样的人适合创业公司? NoSql数据库使用半年后在设计上面的一些心得 Go语言实战 - 使用SendCloud群发邮件 用Go语言做产品半年的一些感觉 - AllenDang 我是怎么拿到投资的 Go语言实战 - 我需要站内搜索 Go语言实战 - revel框架教程之CSRF(跨站请求伪造)保护 Go语言实战 - 网站性能优化第一弹“七牛云存储” - AllenDang 坚持是什么? - 作为创业者在与投资人见面之后想到的 Go语言实战 - revel框架教程之MongDB的最佳搭档revmgo Go语言实战 - revel框架教程之权限控制 Go语言实战 - revel框架教程之用户注册 Go语言实战 - 创业进行时之创业伊始 我为什么喜欢Go语言 用Go写Windows桌面应用 - 使用窗体设计器 使用CGO封装Windows API 用Go写Windows桌面应用 - 使用资源文件 用Go写Windows桌面应用 - 使用Form
Go语言实战 - revel框架教程之缓存和Job
AllenDang · 2013-09-04 · via 博客园 - AllenDang

所有的网站应该都会有一个非常简单的需求,首页一秒之内打开。

满足的方式主要有两种:

页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了。我知道一个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这个包,使用的时候别忘了引用。

以上,缓存和任务调度都讲完了。