最近做的项目一直在使用memcached作为缓存来缓存各种数据,现在BOSS要在项目上加上缓存。并把任务交给我。便琢磨怎么解决这个问题。
看了很多文章,写的比较详尽靠谱的就是这篇了http://www.cnblogs.com/cczhoufeng/archive/2013/04/09/3009578.html,并在此基础之上结合自身项目做出了一些改动,在此分享出来。
该套框架的基本思路是:
利用Spring-AOP在项目的DAOImpl层做一个环绕切面
在方法上添加自定义注解实现细粒度的控制(然而需要修改其他DAO的实现类方法,并不是特别好的解决思路,希望有人能够想出更好的方法)
在环绕切面上使用CacheUtils中定义的对缓存中间件的操作方法
CacheUtils的主要功能就是在去访问数据库前先去缓存中查看是否有值,有则直接返回,没有数据则去数据库中查,然后在放入缓存中。而对于删除,修改,增加方法,则需要将缓存中的数据清空。
CacheUtils在通过反射拿到该次访问方法的具体信息,首先以该方法的包类路径+方法名字+参数的json 转哈希 获取到一个版本号KEY,由此去缓存中查询,如果没有则初始化版本号为1
然后在以包类路径+方法名字+参数的json+版本号字符串转哈希 获取到一个结果集KEY,再由此去缓存中查询结果,如果没有结果,则说明缓存中没有命中,需要去访问DB,然后将结果集合放入缓存。
配置文件切面 spring-datasource.xml
配置切面和缓存工具类的注册
<bean id="cacheUtils" class="com.demo.util.CacheUtils" /> <aop:config proxy-target-class="true"> <aop:aspect id="aspect" ref="cacheUtils"> <aop:pointcut id="cacheMgr" expression="execution(* com.demo.system.dao.*.*(..))"/> <aop:around method="doAround" pointcut-ref="cacheMgr"/> </aop:aspect> </aop:config>