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

一.关于缓存

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

二.缓存的作用

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

三.JFinal中Cache缓存的使用

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

1.Cache的相关配置:

    引入ehcache的jar包

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

扫描二维码关注公众号,回复: 4226366 查看本文章
 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还提供了缓存插件可供使用。缓存虽可以提高效率,但是当数据变换快时,则要谨慎使用。

猜你喜欢

转载自my.oschina.net/u/3952492/blog/2240298