如何使用OSCache实现对象的缓存
今天参考网上的一些资料跑通了一个OSCache缓存对象的实例,就说下如何使用OSCache来进行对象的缓存,如有纰漏还请指教。
如果要使用OSCache进行对象缓存,最开始要做的还是要安装OSCache的环境,在这里我就不多说了,将包导入,拷入配置文件,配置一些基本的信息即可,如不清楚,可以参考我写的上篇随笔——OSCache基础知识与标签的使用。
对于对象的缓存我们首先要认识的一个类是OSCache最底层的GeneralCacheAdministrator类。打开下载到的官方的OSCache资料包下的docs目录下的api,找到com.opensymphony.oscache.general包中的GeneralCacheAdministrator类。我们首先来看下这个类中常用的一些方法。
Method Summary |
|
void |
flushAll() |
void |
|
void |
flushEntry(String key) |
void |
flushGroup(String group) |
void |
flushPattern(String pattern) |
getCache() |
|
getFromCache(String key) |
|
getFromCache(String key, int refreshPeriod) |
|
getFromCache(String key, int refreshPeriod, String cronExpression) |
|
void |
putInCache(String key, Object content) |
void |
putInCache(String key, Object content, EntryRefreshPolicy policy) |
void |
putInCache(String key, Object content, String[] groups) |
void |
putInCache(String key, Object content, String[] groups, EntryRefreshPolicy policy) |
void |
removeEntry(String key) |
void |
setCacheCapacity(int capacity) |
在这个api中我们看到了几个putInCache方法,到时我们可以根据需要来调用。
Ok,废话不多说,现在我用一个网上找到的实例来进行进一步的分析来看看OSCache是如何缓存对象的。
首先我们先写一个BaseCache类:
package com.sky.cache; import java.util.Date; import com.opensymphony.oscache.base.NeedsRefreshException; import com.opensymphony.oscache.general.GeneralCacheAdministrator; public class BaseCache extends GeneralCacheAdministrator { // 过期时间(单位为秒); private int refreshPeriod; // 关键字前缀字符; private String keyPrefix; /** * 构造器 * @param 关键字前缀 * @param 过期时间 */ public BaseCache(String keyPrefix, int refreshPeriod) { super(); this.keyPrefix = keyPrefix; this.refreshPeriod = refreshPeriod; } // 添加被缓存的对象; public void put(String key, Object value) { //调用父类putInCache(String key, Object content)方法 this.putInCache(this.keyPrefix + "_" + key, value); } // 删除被缓存的对象; public void remove(String key) { //调用父类flushEntry(String key)方法 this.flushEntry(this.keyPrefix + "_" + key); } // 删除所有被缓存的对象; public void removeAll(Date date) { //调用父类flushAll(Date date)方法 this.flushAll(date); } public void removeAll() { //调用父类flushAll()方法 this.flushAll(); } // 获取被缓存的对象; public Object get(String key) throws Exception{ try{ return this.getFromCache(this.keyPrefix+"_"+key,this.refreshPeriod); } catch (NeedsRefreshException e) { this.cancelUpdate(this.keyPrefix+"_"+key); throw e; } } }
由于这个类继承了GeneralCacheAdministrator类,所以可以调用父类中方法。接下来再写一个Students类:
package com.sky; import java.io.Serializable; /** * 这个类是一个简单的学生类,用于测试OSCache缓存对象用 * @author tincotian * */ public class Students implements Serializable{ //学生ID public String ID; //学生姓名 public String name; //学生成绩 public String score; public Students(){ } public Students(String studentsID) { this.ID=studentsID; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getScore() { return score; } public void setScore(String score) { this.score = score; } public String getID() { return ID; } public void setID(String id) { ID = id; } }
这个类只是一个简单的测试类而已,接着我们写一个OSCache的管理类CacheManager:
package com.sky; import com.sky.cache.BaseCache; public class CacheManager { private BaseCache studentsCache; private static CacheManager instance; private static Object lock = new Object(); public CacheManager() { //这个根据配置文件来,初始BaseCache; studentsCache = new BaseCache("students",1800); } /** * 单例化一个CacheManager * @return CacheManager对象 */ public static CacheManager getInstance(){ if (instance == null){ synchronized( lock ){ if (instance == null){ instance = new CacheManager(); } } } return instance; } /** * 将学生对象存入缓存中 * @param news:学生对象 */ public void putStudents(Students students) { studentsCache.put(students.getID(),students); } /** * 根据学生ID将缓存中的学生对象移除 * @param newsID:学生ID */ public void removeStudents(String studentsID) { studentsCache.remove(studentsID); } /** * 根据学生ID从缓存中提取对应的学生对象 * @param newsID:学生ID * @return:学生对象 */ public Students getStudents(String studentsID) { try { return (Students) studentsCache.get(studentsID); } catch (Exception e) { //自动生成 catch 块 System.out.println("getStudents>>studentsID["+studentsID+"]>>"+e.getMessage()); Students students = new Students(studentsID); this.putStudents(students); return students; } } /** * 删除缓存中所有的学生对象 */ public void removeAllStudents() { studentsCache.removeAll(); } }
好了,有了以上几个类之后,我们就可以写一个测试类了:
如下,TestObjectCache类:
package com.sky.cache; import com.sky.*; /** * 这个类是一个测试类,用来测试OSCache对对象的缓存 * @author tincotian * */ public class TestObjectCache { public static void main(String args[]){ //实例化一个学生对象 Students student = new Students(); //设置相关属性 student.setID("a001"); student.setName("张三"); student.setScore("A"); CacheManager.getInstance().putStudents(student); //从缓存中删除所有的学生对象 CacheManager.getInstance().removeAllStudents(); //从缓存中删除ID为a001的学生 // CacheManager.getInstance().removeStudents("a001"); //从缓存中取得ID为a001的学生 Students s =(Students)CacheManager.getInstance().getStudents("a001"); //取得该学生的名字与成绩 System.out.println("Students'name is " +s.getName()); System.out.println("Students'score is " +s.getScore()); } }
运行这个测试类后我们可以看到在控制台输出了以下两句话:
Students'name is 张三
Students'score is A
这就说明确实是先存入缓存然后又从缓存中拿出来。如果要更进一步证明,可以到oscache.properties中将缓存设置到缓存到硬盘,然后到设置的路径下去看是否有缓存文件。
如果将CacheManager.getInstance().removeAllStudents();与CacheManager.getInstance().removeStudents("a001");这两句其中任何一句话的注释去除,运行后控制台会输出这两句话:
Students'name is null
Students'score is null
这就说明缓存中的student对象已经被清楚了已经失效了。
至此,关于OSCache对对象的缓存应用的一些基础功能就已经实现了。