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

一.关于缓存

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

二.缓存的做用

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

三.JFinal中Cache缓存的使用

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

1.Cache的相关配置:

    引入ehcache的jar包sql

 在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的具体实现方式:ide

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()方法中,可使用以下方式来对自定义缓存以及默认缓存进行切换。

 

   4.

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

相关文章
相关标签/搜索