Go语言实战 - revel框架教程之缓存和Job

 

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

满足的方式主要有两种:

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

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

 
 

revel框架教程之缓存和Job的更多相关文章

  1. Go语言实战 - revel框架教程之缓存和Job

    所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了.我知道一个PV过亿的站点就是全站静态(以前新浪也是), ...

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

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

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

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

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

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

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

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

  6. tinyshop框架教程已在腾讯课堂开课

    php就业网简介:www.php91.net,专注于Thinkphp框架教程的php框架学习中心.同时也有小崔老师自学php的教程,与你一起成长哦 同时,php就业网教程部分:http://www.p ...

  7. Go语言Revel框架 环境搭建

    1.首先参考连个链接 http://blog.csdn.net/creak_phone/article/details/12620969 http://www.geek521.com/?p=616 2 ...

  8. jfinal框架教程-学习笔记

    jfinal框架教程-学习笔记 JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restfu ...

  9. revel框架教程之CSRF(跨站请求伪造)保护

    revel框架教程之CSRF(跨站请求伪造)保护 CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山 ...

随机推荐

  1. 胖client和瘦client

    胖和瘦?纠结了妙龄少女,更郁闷了无数男女老少.每天充斥在宿舍的一句话就是:从明天開始我要减肥!!结果,可想而知,真的永远是明天而已.就这样,胖和瘦在我们人类之间无缝不在的存在着.但是client怎么就 ...

  2. Web监控工具

    .Rabbitmq的使用及Web监控工具使用   一.文档资料        1.官方网站:http://www.rabbitmq.com/        2.安装教程:http://www.rabb ...

  3. Linux_下安装MySQL

    linux下mysql 最新版安装图解教程 1.查看当前安装的linux版本 命令:lsb_release -a 如下图所示 通过上图中的数据可以看出安装的版本为RedHat5.4,所以我们需要下载R ...

  4. Hadoop上传文件的报错

    baidu了很多,都说防火墙,datanode没有正常启动的问题,可是检查了都是正常,后来还是在老外的网站上找到了解决的方法 修改了/etc/security/limits.conf文件,上传成功 这 ...

  5. 【百度地图API】百度API卫星图使用方法和卫星图对比工具

    原文:[百度地图API]百度API卫星图使用方法和卫星图对比工具 百度地图API推出卫星图接口也有一个月啦~ 本文除了介绍如何使用百度地图API来操作卫星图外,还顺带制作了个卫星图对比工具. 一.百度 ...

  6. wget一个小技巧

    今天在装一个东西的时候,在网上看到了这样的命令 wget  http://xxxx.sh -o -  | sh  的用法 不太明白-o -的用法于是乎man wget,看到了下面的一段话 -O fil ...

  7. MVC EF 修改 封装类 通用泛型方法(二)

    修改 这个 方法 如下. 排除 null 值. /// <summary> /// 修改 多数 数据, 个别数据除外, proNames 不写 则是 修改全部 /// </summa ...

  8. 登录记住账号和密码小Demo

    读取 // 1.读取沙盒中plist文件 // 1.1.获得沙盒根路径 NSString *home = NSHomeDirectory(); // 1.2.拼接Documents路径 NSStrin ...

  9. poj 3026 Borg Maze (bfs + 最小生成树)

    链接:poj 3026 题意:y行x列的迷宫中,#代表阻隔墙(不可走).空格代表空位(可走).S代表搜索起点(可走),A代表目的地(可走),如今要从S出发,每次可上下左右移动一格到可走的地方.求到达全 ...

  10. Oracle中的二进制、八进制、十进制、十六进制相互转换函数

    原文:Oracle中的二进制.八进制.十进制.十六进制相互转换函数 Oracle中的二进制.八进制.十进制.十六进制相互转换函数   今天在网上看到一篇关于在oracle中对各种进制数进行转换的帖子, ...