• revel框架教程之缓存和Job


    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这个包,使用的时候别忘了引用。

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

     
     
  • 相关阅读:
    bean的singleton(没有看到生命周期范围??)
    ApplicationContext中getBean详解
    mybatis基础之二
    mybatis基础之一
    JDOM读取xml
    SSH整合最简单的一个例子
    基础学习问题
    2015年2.9--2.15号第一周计划
    freertos的钩子函数
    IAR环境搭建注意点
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3301565.html
Copyright © 2020-2023  润新知