oscache缓存实体类的详细应用

好久没来论坛说话了,前后差不多快有一年了,上次写点东西还是为了网站推广,这次也不例外,因为ITEYE的推广效果太好了,你懂的(应站长网友委托,再添加一个网址http://www.aiqisky.com,嘎嘎)。

 

工作中也做了很多项目,以前在学习JAVA中只是概念中的技术,现在也有了比较深刻的理解,在项目中也用的如火纯清,比如线程、socket等等。这篇文章就来介绍下oscache在项目中缓存实体的应用,现在正在写采集相关的东西,以后也将采集系统的线程设计公布出来,对解决高并发有很好的效果哦。

 

oscache相信大家都有了解过,或者其他的一些缓存产品,如hibernate的默认缓存等等。在这里一些基础的oscache知识就不累赘了,相信谷歌一下一大堆,这里具体介绍怎样缓存实体类。

 

一、项目中使用oscache的基本文件

1、oscache-2.4.1.jar

2、oscache.properties

项目中添加这两个文件就可以使用oscache了

 

二、使用介绍

这里将用现实中的代码来展示,前段时间推广的电影网站http://www.tiantianfilm.com,现在做了一些优化,就是在前台部分增加了oscache缓存功能,虽然测试起来性能改善不是很明显,但我相信,随着网站数据的增多,这个增加很有必要的,这些代码都是网站中的代码展示。原本网站运行是正常的,这里将一步一步介绍,怎样在正常项目中增加缓存功能。

 

1、与所有任何的程序、框架一样,oscache的启动也需要入口程序,这里以servlet形式启动

(1)在原来web.xml中添加servlet的启动代码

<servlet>
    <servlet-name>initServlet</servlet-name>
    <servlet-class>com.wang.vedio.util.oscache.InitServlet</servlet-class>
    <init-param>
         <param-name>oscache</param-name>
         <param-value>/WEB-INF/classes/oscache.properties</param-value>
     </init-param>
     <load-on-startup>5</load-on-startup>
 </servlet>

 代码编辑真纠结

这个web.xml的中配置不需要mapping配置,只作为启动作用

 

(2)xml配置完毕,接下来需要写InitServlet类

InitServlet .java

public class InitServlet extends HttpServlet {
	
    private static Log logger = LogFactory.getLog(InitServlet.class);

    private static final long serialVersionUID = 1L;
    public static Properties properties;

    public void init() throws ServletException {
        try {
            //加载oscache
            String file = getInitParameter("oscache");
            System.out.println("--------> oscache start");
            if (file != null) {
                InputStream inputString = getServletContext().getResourceAsStream(file);
                Properties p = new Properties();
                p.load(inputString);
                properties = p;
            }
        } catch (Exception e) {
        	logger.error("###########缓存启动失败##############");
            e.printStackTrace();
        }
    }
}

 这个servlet主要是读取缓存的配置文件

(3)oscache启动后需要一个全局的缓存管理类,我们使用GeneralCacheAdministrator作为全局管理属性,具体代码如下:OsCacheAdmin .java

public class OsCacheAdmin {
	public static GeneralCacheAdministrator admin = new GeneralCacheAdministrator(InitServlet.properties);
}

 代码中的admin属性,就是具体操作缓存的属性

 

(4)启动了缓存,加载配置,并创建了操作属性,接下来就是具体的实体类缓存了

oscache中的缓冲池是采用MAP的<key,value>格式来缓存数据,所以对于我们来说,任何一个需要缓存的数据都要有唯一的标识来代表数据,如果标识一样,则原来的数据就被覆盖了。

try{
      categorys = (List<Category>) OsCacheAdmin.admin.getFromCache(Define.CATEGORYS_CODE, Define.CATEGORYS_REFRESH_TIME);
      log.info("index 从缓存中获得所有电影列表");
}catch(NeedsRefreshException nre){
      categorys = categoryService.getAllCategory(0);
      OsCacheAdmin.admin.removeEntry(Define.CATEGORYS_CODE);
      OsCacheAdmin.admin.putInCache(Define.CATEGORYS_CODE, categorys);
      log.info("index 电影类别从数据库中获取成功并缓存");
}

 以上代码展示了具体缓存实体类的方法。功能上很好理解,先在缓存中查找,如果存在实体类,然后判断是否过期,如果缓存中不存在该实体类,或者已经过期则抛出需要刷新异常,进行数据库查找,再将查找的实体类进行缓存。

解释:方法

getFromCache(String key)

getFromCache(String key, int refreshPeriod)

getFromCache(String key, int refreshPeriod, String cronExpression)

key:唯一标识

refreshPeriod:过期时间单位毫秒

cronExpression:过期后处理的计划方式

admin属性中还有很多方法,大家在应用可以尝试着测试下,看看效果,这里篇幅已经不少了,就不介绍源码了。

 

目前www.tiantianfilm.com电影网站的前台部分全部进行了缓存,缓存的网站比较耗内存,所以用虚拟机的朋友需要注意了适量设置过期时间,缓存数量等,这些都可在properties文件中进行配置的。

 

到此为止,学术不精,如有误请指出,共同进步,谢谢

你可能感兴趣的:(OScache)