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这个包,使用的时候别忘了引用。
以上,缓存和任务调度都讲完了。
Go语言实战 - revel框架教程之缓存和Job的更多相关文章
- Go语言实战 - revel框架教程之权限控制
一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构的,每一个url其实都会映射到一个具体的Cont ...
- Go语言实战 - revel框架教程之用户注册
用户注册.登录和注销是任何一个网站都必然会有的功能,可以说,这是重新造轮子做多的领域,每个做网站的人应该都做过很多遍.见微知著,从这么一个小功能其实就可以看到所使用的web框架中的大部分东西. 今天就 ...
- revel框架教程之缓存和Job
Go语言实战 - revel框架教程之缓存和Job 所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了 ...
- Go语言实战 - revel框架教程之MongDB的最佳搭档revmgo
由于revel框架本身对于model层的编写没有提供任何指导,所以在设计这部分的时候就有些犹豫,反复斟酌到底怎样才算是最佳实践. 我在做山坡网的时候刚开始也纠结了一下,拿不准mongodb的sessi ...
- Go语言实战 - revel框架教程之CSRF(跨站请求伪造)保护
CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山坡网之前属于第一种情况,哈哈,所以至今没什么问题. ...
- revel框架教程之权限控制
Go语言实战 - revel框架教程之权限控制 一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构 ...
- go语言实战教程:实战项目资源导入和项目框架搭建
从本节内容开始,我们将利用我们所学习的Iris框架的相关知识,进行实战项目开发. 实战项目框架搭建 我们的实战项目是使用Iris框架开发一个关于本地服务平台的后台管理平台.平台中可以管理用户.商品.商 ...
- 配置 FIS 来适配 go revel 框架以优化前端缓存策略
对于前端工程师来说,浏览器缓存优化是个永远的话题.前几天看了知乎上的一个问答:<大公司里怎样开发和部署前端代码?>,深以为然,所以决心使用 FIS 来优化自身的前端文件. 我们的项目使用了 ...
- Windows7下安装golang语言开发环境和revel框架
1.下载先去下载32位或64 golang window 安装包 并安装下载地址:https://www.golangtc.com/download 本人更改了安装地址为 D:\GO\Go 2. go ...
随机推荐
- SQL Server表分区
什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在 ...
- js获取给定月份的N个月后的日期
1.在讲js获取给定月份的N个月后的日期之前,小颖先给大家讲下getFullYear().getYear()的区别. ①getYear() var d = new Date() console.log ...
- 学习ASP.NET Core, 怎能不了解请求处理管道[6]: 管道是如何随着WebHost的开启被构建出来的?
注册的服务器和中间件共同构成了ASP.NET Core用于处理请求的管道, 这样一个管道是在我们启动作为应用宿主的WebHost时构建出来的.要深刻了解这个管道是如何被构建出来的,我们就必须对WebH ...
- 为IEnumerable<T>添加RemoveAll<IEnumerable<T>>扩展方法--高性能篇
最近写代码,遇到一个问题,微软基于List<T>自带的方法是public bool Remove(T item);,可是有时候我们可能会用到诸如RemoveAll<IEnumerab ...
- scp报错 -bash: scp: command not found
环境:RHEL6.5 使用scp命令报错: [root@oradb23 media]# scp /etc/hosts oradb24:/etc/ -bash: scp: command not fou ...
- 【绝对干货】仿微信QQ设置图形头像裁剪,让你的App从此炫起来~
最近在做毕业设计,想有一个功能和QQ一样可以裁剪头像并设置圆形头像,额,这是设计狮的一种潮流. 而纵观现在主流的APP,只要有用户系统这个功能,这个需求一般都是在(bu)劫(de)难(bu)逃(xue ...
- vs15 preview5 离线安装包
1.介绍 vs15是微软打造的新一代IDE,全新的安装方式.官网介绍如下(https://blogs.msdn.microsoft.com/visualstudio/2016/10/05/announ ...
- ASP.NET中画图形验证码
context.Response.ContentType = "image/jpeg"; //生成随机的中文验证码 string yzm = "人口手大小多少上中下男女天 ...
- jQuery个性化图片轮播效果
jQuery个性化图片轮播效果 购物产品展示:图片轮播器<效果如下所示> 思路说明: 每隔一段时间,实现图片的自动切换及选项卡选中效果,鼠标划入图片动画停止,划出或离开动画开始 两个区域: ...
- iOS开发--ChildViewController实现订单页的切换
先不说废话, 上效果图, 代码量也不大, 也不上传github骗星星了, 你们复制粘贴下代码, 就可以轻而易举的弄出一个小demo. 这个代码的实现并不复杂, 甚至于说非常简单, 就是逻辑有点小绕, ...