OSCache学习(2)_缓存对象


一、缓存对象常用API

核心Cache管理类 GeneralCacheAdministrator的常用方法
1.void putInCache(String key,Object content);//put on Object in a cache
2.Object getFromCache(String key);//  get on Object from the Cache
3.void removeEntry(String key);//  remove an Object in a cache
4.void flushEntry(String key);//  flushes a single cache entry
5.void flushAll();//  flush the entire cache immediately
6.void cancelUpdate(String key);//  cacels a pending cache update


二、项目中集成OSCache

1.下载OSCache  

http://java.net/downloads/oscache/,下载后解压。


2.新建立一个web应用 


3.将OSCache集成到该web项目当中



    (1)从解压缩目录取得oscache.jar 文件放到 /WEB-INF/lib 下。
OSCache组件用Jakarta Commons Logging来处理日志信息,所以需要commons-logging.jar的支持,请将%OSCache_Home%\lib\core\commons-logging.jar放入classpath(通常意味着将这个文件放入WEB-INF\lib目录) 
如果使用JDK1.3,请将%OSCache_Home%\lib\core\commons-collections.jar放入classpath,如果使用JDK1.4或者以上版本,则不需要了


    (2)将etc目录下的oscache.properties、oscache.tld放在src目录下(编译的时候会自动生成在WEB-INF/class目录)。


    (3)修改oscache.properties中参数信息。


        将cache.memory设置为true,cache.memory=true


    (4)修改web.xml中的信息。

<taglib>
<taglib-uri>oscache</taglib-uri>
<taglib-location>/WEB-INF/classes/oscache.tld</taglib-location>
</taglib>
 完成上面四步,基本上完成了WEB项目中OSCache环境的搭建。

三、在项目中使用OSCache缓存对象步骤
  1.封装GeneralCacheAdministrator(根据需求,也可以不封装,当缓存类的一个成员来使用,就像Map一样)
BaseCache类:    

  public class BaseCache extends GeneralCacheAdministrator {     

	private static final long serialVersionUID = -4397192926052141162L;
	private String keyPrefix; //关键字前缀字符,区别属于哪个模块
	private int refreshPeriod; //过期时间(单位为秒);         

    public BaseCache(String keyPrefix,int refreshPeriod){    
        super();    
        this.keyPrefix = keyPrefix;    
        this.refreshPeriod = refreshPeriod;    

    }    

    /**
     *     
     * put(添加被缓存的对象)
     * @param key
     * @param value 
     * @return void
     * @createDate 2013-1-31 下午04:16:46
     * @since  1.0.0
     */
    public void put(String key,Object value){    
        this.putInCache(this.keyPrefix+"_"+key,value);    
    }    

    /**
     * remove(删除被缓存的对象)
     * @param key 
     * @return void
     * @createDate 2013-1-31 下午04:17:06
     * @since  1.0.0
     */
    public void remove(String key){    
        this.flushEntry(this.keyPrefix+"_"+key);    
    }    

    /**
     * removeAll(删除指定日期所有被缓存的对象)
     * @param date 
     * @return void
     * @createDate 2013-1-31 下午04:17:29
     * @since  1.0.0
     */
    public void removeAll(Date date){    
        this.flushAll(date);    
    }           

    /**
     * removeAll(删除所有被缓存的对象) 
     * @return void
     * @createDate 2013-1-31 下午04:18:01
     * @since  1.0.0
     */
    public void removeAll(){    
        this.flushAll();    
    }    

    /**
     * get(获取被缓存的对象)
     * @param key
     * @return
     * @throws Exception 
     * @return Object
     * @createDate 2013-1-31 下午04:18:45
     * @since  1.0.0
     */
    public Object get(String key) throws Exception{    
        try{    
            return this.getFromCache(this.keyPrefix+"_"+key,this.refreshPeriod);    
        } catch (NeedsRefreshException e) {    
            this.cancelUpdate(this.keyPrefix+"_"+key);    
            e.printStackTrace();
            throw e;
        }      
    }            
}   

   2.定义自己的业务类以及业务实现类

     UserCacheService.java   

public interface UserCacheService {
	/**
	 * 前缀,用来区别于各个模块的缓存
	 */
	public String KEY_PREFIX="_user";
	
	/**
	 *缓存刷新的时间 
	 */
	public int REFRESH_PERIOD=3600;
	
	/**
	 * putInCache(添加用户信息到缓存中)
	 * @param userId
	 * @param user 
	 * @return void
	 * @createDate 2013-1-31 下午04:40:31
	 * @since  1.0.0
	 */
	public void putInCache(String userId,User user);
	
	/**
	 * removeFromCache(在缓存中删除该用户信息)
	 * @param userId 
	 * @return void
	 * @createDate 2013-1-31 下午04:40:58
	 * @since  1.0.0
	 */
	public void removeFromCache(String userId);
	
	/**
	 * removeAll(删除该模块的所有缓存) 
	 * @return void
	 * @createDate 2013-1-31 下午04:47:09
	 * @since  1.0.0
	 */
	public void removeAll();
	
	/**
	 * 
	 * getFromCache(根据用户ID获取缓存中的信息)
	 * @param userId 
	 * @return void
	 * @createDate 2013-1-31 下午04:41:30
	 * @since  1.0.0
	 */
	public User getFromCache(String userId);
}

 UserCacheServiceImpl.java

public class UserCacheServiceImpl implements UserCacheService{
	private BaseCache cache=new BaseCache(KEY_PREFIX, REFRESH_PERIOD);
	
	@Override
	public void putInCache(String userId, User user) {
		cache.put(userId, user);
	}
	
	@Override
	public void removeFromCache(String userId) {
		cache.remove(userId);
	}
	
	@Override
	public void removeAll() {
		cache.removeAll();
	}
	
	@Override
	public User getFromCache(String userId) {
		User user=null;
		try {
			user= (User)cache.get(userId);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return user;
	}
}


四 属性文件的配置:

介绍仅涵盖了OSCache的配置,使用的oscache.properties文件,下面的属性能够被设置在oscache.properties文件中:

Cache.memory:

有效值是真的还是假的,默认值为true。如果你想禁用内存缓存,只需要注释掉或删除此行。

禁用内存和磁盘缓存是可能的,而且相当愚蠢。

Cache.capacity:

缓存支持缓存条目的最大数量,默认情况下,容量是无限的。缓存将不会删除任何缓存条目。负的值也将意味着无限容量。

Cache.algorithm:

使用默认的缓存算法。请注意,为了使用一种算法,还必须指定缓存的大小,如果未指定缓存的大小,缓存算法将是无限的缓存,而不管这个属性的值,如果你指定了大小,但没有指定算法,所使用的缓存算法将为com.opensymphony.oscache.base.algorithm.LRUCache

OSCache的目前带有三种算法:

com.opensymphony.oscache.base.algorithm.LRUCache --------最近最少使用。这是一个默认值当cache.capacity设置了值。

com.opensymphony.oscache.base.algorithm.FIFOCache --------先进先出。

com.opensymphony.oscache.base.algorithm.UnlimitedCache---------添加到缓存中的内容,是绝不会被丢弃的,这是默认值当 cache.capacity属性没有设置值。

Cache.blocking:

当一个请求一个过期的缓存条目,它可能被另一个线程正在重建该缓存的过程中。

此设置指定OSCache如何处理后来的“非重建缓存”的线程。

默认行为(cache.blocking = FALSE)是把过期内容给后面的线程,直到缓存条目已更新。这提供最佳的性能(仅仅花费稍微过时的数据服务的成本)

当阻塞被启用,线程反而会阻塞,直到新的缓存条目准备提供,一旦新的条目放进了缓存中,阻塞的线程将重新启动并给予最新的缓存内容。

请注意,即使阻塞被禁用,当没有过期的数据可提供,线程将被阻塞直到通过线程把建立缓存的数据放进缓存内。

Cache.unlimited.disk:

指示磁盘缓存是否应无限制。默认值是false,在这种情况下,磁盘缓存也可以和内存缓存一样通过 cache.capacity属性设置缓存大小

Cache.persistence.class:

指定一个类用于持久化缓存条目。这个样的类必须实现PersistenceListener 接口。OSCache 有一个这样的实现提供了一个基于持久化的文件系统。设置这样的属性给com.opensymphony.oscache.plugins.diskpersistence.HashDiskPersistenceListener类去启用这个实现。你应该可以保存缓存数据使用像JDBC, LDAP. NOTE通过指定你自己的类。这个类的对象的哈希码和toString方法返回的值将被缓存用来生成缓存条目的文件名称。如果你喜欢可读的文件名称,父DiskPersistenceListener可以被使用,但那将产生一个问题,由于非法的文件系统字符和长长的名字。

注意:HashDiskPersistenceListenerDiskPersistenceListener类需要cache.path的设置,以便知道在哪里可以保存文件到磁盘。

Cache.path:

这指定缓存将存储在磁盘上的哪个目录,该目录将被创建,如果它不存在,但是要记住OSCache 必须要有权限往这个路径写内容。避免不同的缓存共享相同的缓存路径,因为OSCache没有被设计来处理这些问题。

注意:对于windows系统,反斜杠字符“\”需要被转义。(反斜杠\backslash ;斜杠/forwardslash)。例如:cache.path=c:\\myapp\\cache 。

cache.persistence.overflow.only (NEW! Since 2.1):

指示的持久性是否应该只发生一次内存缓存容量已达到。为了向后兼容默认值是false,但是推荐值是truememory.cache被启用。这个属性大大改变了缓存的行为,在保存的缓存中将变的不同,那么内存中有什么。

其他的配置略。



你可能感兴趣的:(OSCache学习(2)_缓存对象)