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

满足的方式主要有两种:

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

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

Go语言实战 - revel框架教程之缓存和Job的更多相关文章

  1. Go语言实战 - revel框架教程之权限控制

    一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构的,每一个url其实都会映射到一个具体的Cont ...

  2. Go语言实战 - revel框架教程之用户注册

    用户注册.登录和注销是任何一个网站都必然会有的功能,可以说,这是重新造轮子做多的领域,每个做网站的人应该都做过很多遍.见微知著,从这么一个小功能其实就可以看到所使用的web框架中的大部分东西. 今天就 ...

  3. revel框架教程之缓存和Job

    Go语言实战 - revel框架教程之缓存和Job   所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了 ...

  4. Go语言实战 - revel框架教程之MongDB的最佳搭档revmgo

    由于revel框架本身对于model层的编写没有提供任何指导,所以在设计这部分的时候就有些犹豫,反复斟酌到底怎样才算是最佳实践. 我在做山坡网的时候刚开始也纠结了一下,拿不准mongodb的sessi ...

  5. Go语言实战 - revel框架教程之CSRF(跨站请求伪造)保护

    CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山坡网之前属于第一种情况,哈哈,所以至今没什么问题. ...

  6. revel框架教程之权限控制

    Go语言实战 - revel框架教程之权限控制 一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构 ...

  7. go语言实战教程:实战项目资源导入和项目框架搭建

    从本节内容开始,我们将利用我们所学习的Iris框架的相关知识,进行实战项目开发. 实战项目框架搭建 我们的实战项目是使用Iris框架开发一个关于本地服务平台的后台管理平台.平台中可以管理用户.商品.商 ...

  8. 配置 FIS 来适配 go revel 框架以优化前端缓存策略

    对于前端工程师来说,浏览器缓存优化是个永远的话题.前几天看了知乎上的一个问答:<大公司里怎样开发和部署前端代码?>,深以为然,所以决心使用 FIS 来优化自身的前端文件. 我们的项目使用了 ...

  9. Windows7下安装golang语言开发环境和revel框架

    1.下载先去下载32位或64 golang window 安装包 并安装下载地址:https://www.golangtc.com/download 本人更改了安装地址为 D:\GO\Go 2. go ...

随机推荐

  1. js-静态、原型、实例属性

    本篇来说一下js中的属性: 1.静态属性 2.原型属性 3.实例属性 静态属性: function klass(){} var obj=new klass(); klass.count=0; klas ...

  2. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  3. AutoFac在项目中的应用

    技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github.com/dunitian/LoTCode ...

  4. 窥探Vue.js 2.0 - Virtual DOM到底是个什么鬼?

    引言 你可能听说在Vue.js 2.0已经发布,并且在其中新添加如了一些新功能.其中一个功能就是"Virtual DOM". Virtual DOM是什么 在之前,React和Em ...

  5. Android探索之AIDL实现进程间通信

    前言: 前面总结了程序间共享数据,可以使用ContentProvider也可以使用SharedPreference,那么进程间怎么共享内存呢?Android系统中的进程之间不能共享内存,因此,需要提供 ...

  6. 主成分分析(PCA)原理总结

    主成分分析(Principal components analysis,以下简称PCA)是最重要的降维方法之一.在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用.一般我们提到降维最容易想到的算法就 ...

  7. ASP.NET从零开始学习EF的增删改查

           ASP.NET从零开始学习EF的增删改查           最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...

  8. 简记用ArcGIS处理某项目需求中数据的步骤

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 项目需求涉及如下几个步骤: a.矢量化 b.获取范围内要素 ...

  9. 介绍一款原创的四则运算算式生成器:CalculateIt2

    家里小朋友读一年级了,最近每天都有一些10以内的加减法口算练习,作为程序员爸爸,自然也是想办法能够偷懒,让电脑出题,给小朋友做些练习.于是,自己在业余时间开发了一个四则运算算式生成器,名为:Calcu ...

  10. 灵魂宝石 bzoj 2663

    灵魂宝石(1s 128MB)soulgem [问题描述] "作为你们本体的灵魂,为了能够更好的运用魔法,被赋予了既小巧又安全的外形" 我们知道,魔法少女的生命被存放于一个称为灵魂宝 ...