什么时候使用缓存(空间换时间)
1.经常被大量读取很少进行更新操作的数据
2.非关键的数据(如财务数据,钱,敏感数据)
3.一些通用页面如js,css,img图片等
4.需要实时更新,但是更新频率不高的数据。比如一个用户的订单列表,他肯定希望能够实时看到自己下的订单,但是大部分用户不会频繁下单。
5.缓存数据不能大于内存(钝化)
EhCache
1.创建一个缓存管理器:
factory-method:这个方法返回的对象会变成一个Bean
applicationContext.xml
<bean id="cacheManager" class="net.sf.ehcache.CacheManager" factory-method="create"></bean>
创建一个缓存工具类CacheUtils.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
/**
* 操作缓存的一个工具类
* @author Administrator
*
*/
@Component
public class CacheUtils {
@Autowired
private CacheManager cm;
/**
* 存一个东西
* @param key
* @param value
*/
public void put(String key,Object value){
//拿到缓存对象
Cache cache = cm.getCache("cacheDemo");
//创建一个Element对象
Element ele = new Element(key, value);
//把对象放到缓存中去
cache.put(ele);
}
/**
* <T>T:返回值是什么类型,这个泛型就是什么类型
*/
public <T>T get(String key){
//拿到缓存对象
Cache cache = cm.getCache("cacheDemo");
Element ele = cache.get(key);
//返回相应数据
if(ele==null){
return null;
}
return (T)ele.getObjectValue();
}
/**
* 移除缓存
*/
public void remove(){
Cache cache = cm.getCache("cacheDemo");
cache.removeAll();
}
}
关键代码
/**
* 每一页都应该有自己的特殊的名称
* 第1页: jobs_1
* 第2页: jobs_2
* 第n页: jobs_n
*/
@Override
public PageList<Jobs> queryAll(SqlCondition condition) {
Integer currentPage = condition.getCurrentPage();
String key = "jobs_"+currentPage;
//1.从缓存中去获到相应的数据
PageList<Jobs> pageList = cacheUtils.get(key);
//2.如果这个数据不存在(从数据库中去查询,并且把它放到缓存中)
if(pageList==null){
pageList = jobsDao.queryAll(condition);
cacheUtils.put(key, pageList);
}
//3.把值传回去
return pageList;
}