好久没来论坛说话了,前后差不多快有一年了,上次写点东西还是为了网站推广,这次也不例外,因为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文件中进行配置的。
到此为止,学术不精,如有误请指出,共同进步,谢谢