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的具体实现方式:
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还提供了缓存插件可供使用。缓存虽可以提高效率,但是当数据变换快时,则要谨慎使用。