域对象事件驱动的缓存策略(二)

    上文分析了目前在项目中使用的一些缓存的局限性,引出了一个我称之为“域对象事件驱动的缓存策略”的概念。本篇就仔细分析一下如何利用域对象事件来驱动缓存。

    通常使用的域对象无非会产生下面几种事件:增加删除修改(域对象的状态改变也算做修改)。这三种事件在我们通常的项目中基本可以对应到DAO层的三个方法:insert, delete, update。在DAO层的这三类方法中,我们可以明确的获得是对哪类域对象(Class)进行了处理,同时处理的又是哪个具体的实例(Object)。DAO层只需要将这些明确的信息通知到缓存管理模块,那么剩下的事就是缓存管理模块根据这些信息对已有的缓存做淘汰了。

    通常的缓存管理都是以key-value的形式来保存缓存信息的。其中key值是由使用者组装的一个唯一标识,value是使用者存放在该标识下的任意内容,可以是一段文本(例如HTML, XML, JavaScript等等),也可以是任意的对象(例如项目中的VO, Dom对象等等)。先看看我在以往纯JSP的项目中是怎样使用页面缓存的。例如列出所有文章列表的页面,用"article_list_all”字符串作为前缀,其后再拼装分页信息(页数,每页记录数,排序条件)的字符串作为该页面缓存的key值,将截获的request中的html内容作为该缓存的value存储到缓存系统中。这种缓存的缺陷就像上篇文章所讲的,只能设置它为每若干分钟进行强制淘汰,那么在这几分钟之内新发的文章就无法出现在文章列表中。这种策略对于实时性要求不强的内容发布的前台展现还是可以使用的,但是对于后台文章管理就已经不能胜任了。

    要想使缓存可以处理DAO层的事件,必须引入一层由Class和Object定位到key值的映射层。这个映射层通过某种规则可以将DAO层的事件查询到当前缓存的key的集合。我目前想到的规则也比较简单,就是在使用缓存系统时,不仅指定key和value,同时要指定这个key和哪些域对象(Class)相关,同时和这些Class是在什么样的范围上相关。

    例如上面说到的文章列表的例子,"article_list_all”这个缓存,就和ArticleDO这个域对象相关,范围就是all,即是和所有ArticleDO的实例相关,任何的对ArticleDO的操作都会是"article_list_all"缓存失效。如果是某个栏目下的文章列表页,key值可以定义为"column_article_list",该缓存定义为和ArticleDO相关,同时范围是article.columnid等于当前栏目id,那么当符合条件(即属于当前栏目)的ArticleDO的实例发生变化时,这个缓存会被置为失效。

    当然,上面说的这种规则还比较简单,最终要想实现出一个完备的“域对象事件驱动的缓存策略”可能还会比这个复杂的多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值