我们做接口,应用,网页时常常会需要显示某篇文章的阅读次数(假设现在文章叫做article,阅读次数为readCount的属性,setter,getter器ok不谈)。
最常用的是直接获取返回给前台。article.getReadCount() 这样就好了。如果是点击了文章,当然是在点击的接口里面顺便更新下实体咯,article.setReadCount(article.getReadCount()+1) ,XXservice.update(entity)下ok。
那么问题就来了。如果这个网站是个日访问量不足5的渣渣,这个方法简单方便。但是,假如访问量比较大了一点呢?set后的update下还行么?不行!我拒绝。这样是否考虑过数据库的承受能力呢?一直在不停的写。。。恐怕不太好。
那么解决方法就是ehcache。ehcache框架的配置见我上一篇文章。下面讲讲思路与具体实现与代码。
思路:通过ehcache将访问量的数据存在cache(缓存)中,规定一个请求的访问更新数据库的间隔时间,当请求时间间隔超过时更新。
实现:
1,在实体类中先定义下缓存名和间隔时间。
2,ehcache.xml里面配置相同的缓存名
<cachename="growthDiaryHits"maxElementsInMemory="500"eternal="true"overflowToDisk="true"/>
3,service具体实现:
3.1:通过缓存名获取缓存,查找出对应每一篇文章的元素。定义阅读数变量count为0;
3.2:缓存元素存在,则设置count为缓存中的值;不存在则是数据库中值;
3.3:放入缓存;
3.4:判断时间来更新表;
4,接口,控制器等等调用service方法。
代码:(我觉得还是截图好,看着文章就证明这个没用过或者不熟悉,还是敲一遍学的快;截图省时间)
实体类中:
配置文件中(ehcache.xml):
service中:
接口中:
上面讲的是写,既然是存在缓存中的,那么读的时候从数据库中拿出来的阅读量肯定不是实时的了,代码如下:
// growthDiaryListBlock.setReadCount(growthDiary.getReadCount());
// 修改获得阅读量的获取,通过ehcache判断,存在从ehcache获取,不存在从表获取
Element element = cache.get(growthDiary.getId() + "_count");
if (element != null)
{
growthDiaryListBlock.setReadCount((Integer) element.getValue());
}
else
{
growthDiaryListBlock.setReadCount(growthDiary.getReadCount());
}