springboot+EHcache 实现文章浏览量的缓存和超时更新

问题描述

当我们需要统计文章的浏览量的时候,最常规的做法就是: 1.访问文章链接www.abc.com/article/{id} 2.在控制层获取Article实体 3.得到文章浏览量count并且count++ 4.最后update实体Article。 这么做对没有访问量的网站来说很棒,如果网站访问量很大,这么不停的读写数据库,会对服务器造成很大的压力。

解决思路

引入Ehcache,将文章的访问量存在cache中,每点击一次文章,将cache中的count加1.在有效的时间内访问文章只是将cache中的数据+1,超过指定时间则进行一次数据库更新。

解决方案

本文是在springboot整合ehcache的环境下验证的。springboot版本1.5.2 。ehcache版本2.6.11。springboot整合ehcache的步骤很简单,下面简单提一下,在pom文件中引入ehcache依赖

<dependency>
	<groupId>net.sf.ehcache</groupId>
	<artifactId>ehcache-core</artifactId>
	<version>2.6.11</version>
</dependency>

在类路径下存放ehcache.xml文件。

在application.yml中指定:

spring: 
  cache:
    jcache:
      config: classpath:ehcache.xml

最后在启动类标注@EnableCaching


引入缓存之后,接着我们的正题

  1. 在ehcache.xml文件中定义dayHits缓存 <cache name="dayHits" maxEntriesLocalHeap="500" eternal="true" overflowToDisk="true"> </cache> 表示保存当日点击量的
  2. 在controller层定义缓存点击量的方法
 public Integer cacheCount(Long articleId){

        Content content = contentRepository.findOne(articleId);

        Ehcache cache = cacheManager.getEhcache("dayHits");

        Element element = cache.get(articleId+"_count");

        Integer count = 0;
        if(element!=null){
            count = (Integer) element.getValue();
        }else{
            count = content.getHits()== null?0:content.getHits();
        }

        count++;
        cache.put(new Element(articleId+"_count",count));
        cache.put(new Element(articleId+"_dayHitsDate",SystemUtils.getNowDate()));

        Long time = System.currentTimeMillis();

        if(time > (viewArticleTime+ 300000)){
            viewArticleTime = time;
            content.setHits(count);
            contentRepository.save(content);
            cache.removeAll();
        }

        return count;

    }

3.在查看文章方法中进行调用。

  @RequestMapping(value = "article/{id}",method = RequestMethod. GET)
    public String detail(@PathVariable Long id,ModelMap map){
    Integer hits = cacheCount(id);
   }

4.其中局部变量的定义:

 
    private static CacheManager cacheManager = CacheManager.newInstance();

    private static Long viewArticleTime = System.currentTimeMillis();

5.保存访问看看效果吧。

转载于:https://my.oschina.net/u/818053/blog/888279

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值