JFinal框架学习——cache的简单使用

一.关于缓存

Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在于Web服务器和客户端(浏览器)之间的副本。缓存会根据进来的请求保存输出内容的副本;当下一个请求来到的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,还是向源服务器再次发送请求。比较常见的就是浏览器会缓存访问过网站的网页,当再次访问这个URL地址的时候,如果网页没有更新,就不会再次下载网页,而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新,浏览器才会再次下载网页。因此很好的使用缓存技术能够大大提高性能。

二.缓存的作用

  • 减少网络带宽消耗(当Web缓存副本被使用时,只会产生极小的网络流量,可以有效的降低运营成本)。
  • 降低服务器压力(给网络资源设定有效期之后,用户可以重复使用本地的缓存,减少对源服务器的请求,间接降低服务器的压力。同时,搜索引擎的爬虫机器人也能根据过期机制降低爬取的频率,也能有效降低服务器的压力)。
  • 减少网络延迟,加开页面打开速度。

三.JFinal中Cache缓存的使用

在JFinal中,默认的缓存实现时使用EhCache。

1.Cache的相关配置:

引入ehcache的jar包

JFinal框架学习——cache的简单使用

JFinal框架学习——cache的简单使用

在src包下新建ehcache.xml文件,里面为ehcache的基本配置

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
 updateCheck="false" monitoring="autodetect"
 dynamicConfig="true">
 <!--指定一个文件,当ehcache把数据写到硬盘上时,会默认把数据写到该文件下-->
 <!--user.home - 用户主目录;user.dir - 用户当前工作目录;java.io.tmpdir - 默认临时文件路径。-->
 <diskStore path="java.io.tmpdir" />
 <!-- 设定缓存的默认数据过期策略 -->
 <defaultCache maxElementsInMemory="10000"
 eternal="true"
 timeToIdleSeconds="3600"
 timeToLiveSeconds="3600"
 overflowToDisk="true">
 </defaultCache>
 <!--自定义cache-->
 <cache name="cacheText"
 maxElementsInMemory="10000"
 maxElementsOnDisk="1000"
 eternal="false"
 overflowToDisk="true"
 timeToIdleSeconds="900"
 timeToLiveSeconds="1800"
 memoryStoreEvictionPolicy="LFU">
 </cache>
</ehcache>

关于ehcache的配置参数的详解:https://blog.csdn.net/huitoukest/article/details/80047935

2.Cache缓存

(1) 在UserController.class中创建一个Action:

public void text(){
 List<User> user = new User().dao().findByCache("cacheText","user1","select * from user");
 setAttr("user1",user).render("index.html");
 }

findByCache方法参数:

  • cacheName为ehcache.xml中所设置的cache的name相同,即缓存名称。
  • key可以理解为数据对象的名字。
  • sql为sql语句

(2)查看源码

这样运行出来你可能还是不理解Cache在其中究竟启到了什么样的作用,下面我们来看看 findByCache的具体实现方式:

public List<M> findByCache(String cacheName, Object key, String sql) {
 return this.findByCache(cacheName, key, sql, DbKit.NULL_PARA_ARRAY);
 }
 public M findFirstByCache(String cacheName, Object key, String sql, Object... paras) {
 ICache cache = this._getConfig().getCache();
 M result = (Model)cache.get(cacheName, key);
 if (result == null) {
 result = this.findFirst(sql, paras);
 cache.put(cacheName, key, result);
 }
 return result;
 }

从具体实现代码中,我们可以看出,调用findByCache方法后,首先会通过getCache() 来获得Cache的配置,然后根据传入的参数从缓存中查询数据,如果查询到的result结果为空,则通过sql语句在数据库里查询,并将查询的结果存入缓存之中。反之,如果查询的结果不为空,则直接返回result。

(3)关于具体实现,我们还可以通过打断点,debug的方式来理解Cache的实现。

3.自定义缓存:

除了使用JFinal为我们提供的默认的ehcache缓存之外,我们还可以通过实现ICache接口,重写ICache中的方法来自定义缓存。

package com.cache;
import com.jfinal.plugin.activerecord.cache.ICache;
public class idenCache implements ICache{
 @Override
 public <T> T get(String s, Object o) {
 return null;
 }
 @Override
 public void put(String s, Object o, Object o1) {
 }
 @Override
 public void remove(String s, Object o) {
 }
 @Override
 public void removeAll(String s) {
 }
}

使用自定义缓存时,在基本配置类中的configPlugin()方法中,可以使用如下方式来对自定义缓存以及默认缓存进行切换。

JFinal框架学习——cache的简单使用

4.

除以上方法外,JFinal还提供了缓存插件可供使用。缓存虽可以提高效率,但是当数据变换快时,则要谨慎使用。

相关推荐