一.关于缓存
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还提供了缓存插件可供使用。缓存虽可以提高效率,但是当数据变换快时,则要谨慎使用。