缓存框架-Ehcache学习笔记

Ehcache也可以做分布是缓存,分布是缓存参考地址:

   http://www.cnblogs.com/yangy608/archive/2011/10/07/2200669.html

一、Ehcache缓存框架工作原理

    将ehcache-core-2.4.8.jar加入到项目中后,web项目启动后Ehcache就会启动(没有提供在web.xml启动加载的接口)。
    添加了缓存,当数据有改动的时候,需要清除缓存,如有对数据做增加和修改的时候需要清除相关联的缓存。

    CacheManager 在使用之后应该关闭,虽然有自己的 shutdown hook ,建议在程序中手动关闭。

    CacheManager.getInstance().shutdown();

二、CacheManager对象的创建方式

      1、无参

           CacheManager manager = new CacheManager();

              说明:Ehcache在启动的时候会扫描classes目录下的ehcache.xml配置文件,创建CacheManager对象,如果将ehcache.xml文件放到classes目录下,可以通过无参形式加载配置文件;

      2、通过配置文件

           CacheManager manager = new CacheManager("E:\tomcat.6.0.37\webapps\easyUiPowerManage\WEB-INF\ehcache.xml");

          说明:如果没有将配置文件放在classes目录下,则在ehcache启动的时候找不到配置文件,没有创建CacheManager对象,所以在加载配置文件的时候需要通过路径来加载配置文件;

      3、通过资源

            URL url = getClass().getResource("/anotherconfigurationname.xml");

            CacheManager manager = new CacheManager(url);

      4、通过输入流

            InputStream fis = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());

            try {

                  CacheManager manager = new CacheManager(fis);

            } finally {

                  fis.close();

            }

三、mybatis+Ehcache简单实现缓存需要的jar包:

    ehcache-core-2.4.8.jar
    slf4j-api-1.7.5.jar
    slf4j-log4j12-1.7.5.jar
    mybatis-ehcache-1.0.0.jar(需不需要还么没确定)

四、例子

    1、Ehcache配置文件“ehcache.xml”

<?xml version="1.0" encoding="UTF-8"?>    
		<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false">    
		<diskStore path="java.io.tmpdir" />  

		<!-- 默认缓存配置 -->
		<defaultCache maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="0" timeToLiveSeconds="600" overflowToDisk="false" 
			diskPersistent="false" memoryStoreEvictionPolicy="LRU" /> 
		   
		<!-- 
			自定义,service缓存配置 
			eternal:					缓存是否永远不销毁
			maxElementsInMemory:		缓存可以存储的总记录量
			overflowToDisk:				当缓存中的数据达到最大值时,是否把缓存数据写入磁盘
			diskPersistent:				是否启用强制命令将缓存出入磁盘
			timeToIdleSeconds:			当缓存闲置时间超过该值,则缓存自动销毁,如果该值是0就意味着元素可以停顿无穷长的时间
			timeToLiveSeconds:			缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值, 这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间
			memoryStoreEvictionPolicy:	缓存满了之后的淘汰算法
		-->  
		<cache name="serviceCache"
			eternal="false"	
			maxElementsInMemory="1000"   
			overflowToDisk="false"   
			diskPersistent="false"    
			timeToIdleSeconds="0"   
			timeToLiveSeconds="3600"
			memoryStoreEvictionPolicy="LRU" />   
		</ehcache>

    2、缓存父类管理类“EhCacheManager.java”

package com.util;  
  
import java.io.Serializable;  
import net.sf.ehcache.CacheManager;  
import net.sf.ehcache.Ehcache;  
import net.sf.ehcache.Element;  
import org.apache.commons.logging.Log;  
import org.apache.commons.logging.LogFactory;  
  
/** 
 * 缓存管理类 
 */  
public class EhCacheManager {  
    private static Log log = LogFactory.getLog(EhCacheManager.class);  
    private static final String CACHE_KEY = "serviceCache";  
    public static final int CACHE_LIVE_SECONDS = 180;  
    private static EhCacheManager instance = new EhCacheManager();  
    private static CacheManager cacheManager;  
    private static Ehcache fileCache;  
  
    private EhCacheManager() {  
        log.info("Init file cache ----------------------------------------");  
        cacheManager = new CacheManager();  
        fileCache = cacheManager.getCache(CACHE_KEY);  
        log.info("Init file cache success....");  
    }  
  
    public static synchronized EhCacheManager getInstance() {  
        if (instance == null) {  
            instance = new EhCacheManager();  
        }  
        return instance;  
    }  
  
    public static byte[] loadFile(String key) {  
        Element e = fileCache.get(key);  
        if (e != null) {  
            Serializable s = e.getValue();  
            if (s != null) {  
                return (byte[]) s;  
            }  
        }  
        return null;  
    }  
  
    public static void cacheFile(String key, byte[] data) {  
        fileCache.put(new Element(key, data));  
    }  
      
    /** 
     * 将数据存入缓存,缓存无时间限制 
     * @param key 
     * @param value 
     */  
    public static  <T> void put(String key,T value){  
        fileCache.put(new Element(key, value));  
    }  
      
    /** 
     * 带过期时间的缓存,存入 
     * @param key  键 
     * @param value 值 
     * @param timeToLiveSeconds 缓存过期时间 
     */  
    public static  <T> void put(String key,T value,int timeToLiveSeconds){  
        fileCache.put(new Element(key, value,0,timeToLiveSeconds));  
    }  
      
      
    /** 
     * 通过key值获取存入缓存中的数据 
     * @param key   数据存入缓存时的key 
     */  
    @SuppressWarnings("unchecked")  
    public static <T> T get(String key) {  
        Element el = fileCache.get(key);  
        if (el == null) {  
            if (log.isDebugEnabled())  
                log.debug("not found key: " + key);  
            return null;  
        }  
        
        T t = (T) el.getObjectValue();  
        return t;  
    }  
  
      
    /** 
     * 根据key删除缓存 
     */  
    public static boolean  remove(String key) {  
        log.info("remove key:"+key);  
        return fileCache.remove(key);  
    }  
    
    /**
     * 关闭cacheManager 对象
     */
    public static void shutdown() {  
        cacheManager.shutdown();  
    }  
}

   

    3、使用了缓存的类"UserServiceImpl.java"

package com.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dao.UserDao;
import com.entity.User;
import com.service.UserService;
import com.util.EhCacheManager;

/**
 * 用户管理service实现类
 */
@Service(value="userService")
public class UserServiceImpl implements UserService {
	@Autowired
	private UserDao userDao;
	
	private final static String GET_USER_KEY = "GET_USER_KEY_";  
	
	/**
	 * 增加或修改用户
	 */
	public int userOperate(User user){
		if(user.getId() == null){
			return userDao.addUser(user);
		}else{
			return userDao.updateUser(user);
		}
	}
	
	/**
	 * 删除用户
	 */
	public int deleteUser(String id) {
		Map<String,Object> params = new HashMap<String, Object>();
		params.put("id",id);
		
		//根据id查询用户
		List<User> listUser = userDao.getUser(params);
		
		//删除之前登录保存的缓存
		if(listUser.size() > 0){
			User user = listUser.get(0);
			EhCacheManager.remove(GET_USER_KEY+user.getAccount()+"_"+user.getPassword());
		}
		
		return userDao.deleteUser(id);
	}
	
	/**
	 * 用户登录,从缓存中取数据,如果没有就查数据库
	 */
	public List<User> getUserDenglu(Map<String,Object> params) {
		//到缓存中取数据
		List<User> listUser = EhCacheManager.get(GET_USER_KEY+params.get("account")+"_"+params.get("password"));  
		
		//如果没有则去数据库查询
        if(listUser == null){  
            listUser =  userDao.getUserDenglu(params);  
            //将取到的数据保存到缓存中
            EhCacheManager.put(GET_USER_KEY+params.get("account")+"_"+params.get("password"), listUser);  
        }  
        
        return listUser;
	}
	
	/**
	 * 查询用户
	 */
	public List<User> getUser(Map<String,Object> params){
		return userDao.getUser(params);
	}
	
	/**
	 * 查询用户总数
	 */
	public int getUserCount(Map<String,Object> params){
		return userDao.getUserCount(params);
	}
}

    4、删除缓存

    EhCacheManager.remove(GET_USER_KEY+params.get("account")+"_"+params.get("password"));

   

猜你喜欢

转载自x125858805.iteye.com/blog/2161734