`
mowengaobo
  • 浏览: 161056 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

使用SSM注解做缓存操作

 
阅读更多

之前自己写过一个通过注解和AOP来实现缓存的代码,最早的原型来自于在淘宝工作时的一个项目。当时这段代码写得比较差,之后重构时发现之前的功能实现有很大的局限。主要问题在于:

  1. key的生成规则
  2. update 与 query 的参数不一样,如何让其生成一样的key
  3. 列表缓存如何定义key及失效

最近同事推荐了一个开源项目:Simple-Spring-Memcached(简称ssm),它也是一个通过Annatation与AOP来完成缓存数据操作的开源项目。仔细看了一下代码,基本上把我之前碰到的问题都解决了,而且MultiCache这一块的实现超出我的预期。该项目主要优点如下:

  1. 与Spring完善集成
  2. 支持两种Memcached Java Client (spymemcached,Xmemcached)
  3. 基于Annotation方式实现缓存操作,对代码侵入性小
  4. annotation丰富,可以满足绝大部分需求

下面介绍一下其中各annotation的使用。ssm项目中的Annotation主要分成以下几类

  • SingleCache类 操作单个POJO的Cache数据,由ParameterValueKeyProvider和CacheKeyMethod来标识组装key
  • MultiCache类 操作List型的Cache数据,由ParameterValueKeyProvider和CacheKeyMethod来标识组装key
  • AssignCache类 指定key操作Cache数据,由annotation中的 assignedKey 指定key

各Annotation的详细说明

  • ReadThroughSingleCache
    作用:读取Cache中数据,如果不存在,则将读取的数据存入Cache
    key生成规则:ParameterValueKeyProvider指定的参数,如果该参数对象中包含CacheKeyMethod注解的方法,则调用其方法,否则调用toString方法
    代码示例:

     

        @ReadThroughSingleCache(namespace = "Alpha", expiration = 30)
        public String getDateString(@ParameterValueKeyProvider final String key) {
            final Date now = new Date();
            try {
                Thread.sleep(1500);
            } catch (InterruptedException ex) {
            }
            return now.toString() + ":" + now.getTime();
        }
  • InvalidateSingleCache
    作用:失效Cache中的数据
    key生成规则:

     

    • 使用 ParameterValueKeyProvider注解时,与ReadThroughSingleCache一致
    • 使用 ReturnValueKeyProvider 注解时,key为返回的对象的CacheKeyMethod或toString方法生成
    @InvalidateSingleCache(namespace = "Charlie")
    public void updateRandomString(@ParameterValueKeyProvider final Long key) {
        // Nothing really to do here.
    }

    @InvalidateSingleCache(namespace = "Charlie")
    @ReturnValueKeyProvider
    public Long updateRandomStringAgain(final Long key) {
        return key;
    }
  • UpdateSingleCache
    作用:更新Cache中的数据
    key生成规则:ParameterValueKeyProvider指定
    ParameterDataUpdateContent:方法参数中的数据,作为更新缓存的数据
    ReturnDataUpdateContent:方法调用后生成的数据,作为更新缓存的数据
    注:上述两个注解,必须与Update*系列的注解一起使用

     

        @UpdateSingleCache(namespace = "Alpha", expiration = 30)
        public void overrideDateString(final int trash, @ParameterValueKeyProvider final String key,
                @ParameterDataUpdateContent final String overrideData) {
        }
    
        @UpdateSingleCache(namespace = "Bravo", expiration = 300)
        @ReturnDataUpdateContent
        public String updateTimestampValue(@ParameterValueKeyProvider final Long key) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
            }
            final Long now = new Date().getTime();
            final String result = now.toString() + "-U-" + key.toString();
            return result;
        }
  • ReadThroughAssignCache
    作用:读取Cache中数据,如果不存在,则将读取的数据存入Cache
    key生成规则: ReadThroughAssignCache 注解中的 assignedKey 字段指定

     

        @ReadThroughAssignCache(assignedKey = "SomePhatKey", namespace = "Echo", expiration = 3000)
        public List<String> getAssignStrings() {
            try {
                Thread.sleep(500);
            } catch (InterruptedException ex) {
            }
            final List<String> results = new ArrayList<String>();
            final long extra = System.currentTimeMillis() % 20;
            final String base = System.currentTimeMillis() + "";
            for (int ix = 0; ix < 20 + extra; ix++) {
                results.add(ix + "-" + base);
            }
            return results;
        }
  • InvalidateAssignCache
    作用:失效缓存中指定key的数据
    key生成规则:assignedKey 字段指定

     

        @InvalidateAssignCache(assignedKey = "SomePhatKey", namespace = "Echo")
        public void invalidateAssignStrings() {
        }
  • UpdateAssignCache
    作用:更新指定缓存
    key生成规则:assignedKey 字段指定

     

        @UpdateAssignCache(assignedKey = "SomePhatKey", namespace = "Echo", expiration = 3000)
        public void updateAssignStrings(int bubpkus, @ParameterDataUpdateContent final List<String> newData) {
        }
    http://www.colorfuldays.org/program/java/ssm_memcache/

 

分享到:
评论
4 楼 luxianping 2013-05-06  
怎么根据命名空间来删除缓存?  比如说用户对应的菜单,当有用户修改了这个菜单  要把菜单这个命名空间下的缓存都删除
3 楼 vemacitri_b 2012-10-12  
mowengaobo 写道
你可以这样理解key。为什么不单独放个参数出来
如   @ReadThroughSingleCache(namespace = "Charlie", expiration = 1000)
    public String getRandomString(@ParameterValueKeyProvider final Long key) {
如果是集合

    @ReadThroughMultiCache(namespace = "Delta", expiration = 1000)
    public List<String> getRandomStrings(@ParameterValueKeyProvider final List<Long> keys) {

这样key怎么命名由你自己决定。



请问你这个keys具体要写什么呢?Entity里面需要用 @CacheKeyMethod这个么?
我现在想直接返回一个集合,但是不需要数据任何的参数,就是直接拿回所有集合,那我这个keys该写什么?能举例么?还有那个namespace 我该怎么写?看了网上的资料说的不是很理解,我现在配置好了已经,用的就是SSM+mybatis,但是我发现每次查询,还都是走数据库了,顺便请教一下log4j的日志该怎么配,才能在控制台输出每次memcached的get或者set信息呢?
非常感谢
2 楼 mowengaobo 2012-05-17  
你可以这样理解key。为什么不单独放个参数出来
如   @ReadThroughSingleCache(namespace = "Charlie", expiration = 1000)
    public String getRandomString(@ParameterValueKeyProvider final Long key) {
如果是集合

    @ReadThroughMultiCache(namespace = "Delta", expiration = 1000)
    public List<String> getRandomStrings(@ParameterValueKeyProvider final List<Long> keys) {

这样key怎么命名由你自己决定。
1 楼 夜神月 2012-05-16  
目前我在dao曾有如下的注解配置:
@ReadThroughSingleCache(namespace="com.test.user",expiration=50000)
public User getUserById(@ParameterValueKeyProvider(order=1) Long id, @ParameterValueKeyProvider(order=2) String name) throws SQLException

查看了下源码 cacheKey是这个com.test.user:1/dfgdfg  也就是说命名空间+两个被注解的参数。这样在实际应用中肯定的是不行的,至少把方法名这个点也得生成到key中。网上资料对这个框架的介绍比较匮乏,不知道是我配置有问题,还是有其他的方法,实现我这一目的

相关推荐

    SSM整合memcached缓存

    SSM整合了memcached的高速缓存机制,包含注释jar包,运行无bug!

    SSM 梳理 面试题整理

    该文档主要整理的是SSM的常见面试题,包括一下内容: 1. SpringMVC 的工作原理 (11步) 2. 谈谈你对SpringMVC的理解 3. SpringMVC 常用注解都有哪些? 4. Spring 的常用注解 5. 如何开启注解处理器和适配器? 6...

    使用SSM框架(SpringBoot、SpringSecurity、MyBatis)开发的一个简单校园多商家食堂点餐平台.zip

    2:成功整合了redis,并在项目中使用了redis的注解缓存功能,主要配置了商品类的缓存,并且当更新商品状态时清空缓存重新在数据库中查询后再存入缓存; 搭建了Linux环境,利用docker安装好了elasticsearch,同时在项目test...

    基于SSM框架,通过spring注解的方式,实现redis的数据缓存机制,将mysql的数据缓存到redis数据库.zip

    基于SSM框架,通过spring注解的方式,实现redis的数据缓存机制,将mysql的数据缓存到redis数据库.zip

    SSM(详细注释代码清晰)开源框架

    07、关于数据库链接,可以使用手工获取的方式(代码表加载的例子),也可以使用框架封装的方式(日志保存的例子); 08、开发环境jdk1.8,tomcat8 09、有些功能参考了网上的帖子或源码,在此表示感谢; 10、框架可...

    基于SSM+MySQL的个人博客系统

    因为学习这个系统可以巩固自己的SSM技术,简单易懂,没有什么复杂的逻辑操作和算法, 因为这是一个简单的个人博客,所以功能没那么多,自己如果想要添加更多的功能可以继续添加, 比葫芦画瓢,上手会非常快,这个...

    权限管理系统 shiro + ssm实现

    权限管理系统 shiro + ssm实现,实现菜单,有学习的可以下载哦!...项目也整合了redis做缓存,把pom.xml中&lt;artifactId&gt;spring-boot-starter-data-redis和com.xe.demo.common.support.redis包下的注释去掉,

    Java 权限管理系统 shiro + ssm实现

    Java 权限管理系统 shiro + ssm实现。 权限管理系统 shiro + ssm...项目也整合了redis做缓存,把pom.xml中&lt;artifactId&gt;spring-boot-starter-data-redis&lt;/artifactId&gt; 和com.xe.demo.common.support.redis包下的注释去掉,

    Maven工程 SSM 整合Shiro

    此案例是利用Maven工程实现了SSM 整合Shiro安全框架,实现了登录身份认证功能及权限管理功能,用到了Shiro的缓存效果。注释比较完善,但是没有打包数据库文件。

    SSM与redis

    本项目针对初学spring、springmvc、mybatis、框架者,配置勒redis缓存,项目内都有详细的注解声明。!!!!!!!!!

    SSM开发框架

    07、关于数据库链接,可以使用手工获取的方式(代码表加载的例子),也可以使用框架封装的方式(日志保存的例子); 08、开发环境jdk1.6,tomcat7,初始登录用户名:wu_dh 密码:1 09、有些功能参考了网上的帖子或...

    SSM+Jsp+Mysql实现简单的个人博客系统附带演示导入视频.zip

    基于Spring+SpringMVC+Mybatis实现简单的个人博客系统,这个系统适合刚毕业或者在校学习的计算机专业的同学学习,因为学习这个系统可以巩固自己的SSM技术,简单易懂,没有什么复杂的逻辑操作和算法,因为这是一个...

    最新SSM整合

    07、关于数据库链接,可以使用手工获取的方式(代码表加载的例子),也可以使用框架封装的方式(日志保存的例子); 08、开发环境jdk1.6,tomcat6 09、有些功能参考了网上的帖子或源码,在此表示感谢; 10、框架...

    myeclipse整合:ssm+shiro框架整合项目,完整示例

    里面本人亲测shiro 和ssm整合 开发工具为myeclipse jdk1.7 tomcat7 ,是一个实战的项目,注释也很清楚。大家可以看看,新手也可以参考一下。shiro的认证 授权 记住我 和ehcache 缓存都结合的很清楚。

    ssm框架库存管理系统导入可用带sql

    我还负责了redis集成spring并缓存树 redis的使用主要涉及到两个注解的使用 1.Cache able:将方法的返回值在集合中查询出来之后缓存在redis中,之后的查询就不走数据库了 直接从redis中查询 2.CacheEvict:根据key...

    SSM:Spring+Springmvc+Mybatis框架,后续集成日志插件log4j、logback,集成Druid连接池监控,集成Redis缓存,office文件操作插件poi

    4.已经集成的Redis缓存,基于jedis使用缓存,实现客户端分片。 5.添加CommonInterceptor类实现HandlerInterceptorAdapter接口拦截请求,基于注解添加RedisAspect拦截类监视缓存方法调用。 6.集成office文件操作插件...

    ssm+shiro+redis+ecache整合认证权限

    ssm+shiro+redis+ecache整合认证权限,里面有配置了两套缓存,redis,和ecache,由于redis缓存频繁读取session,现在改成了本地缓存,ecache,速度有所提升,如果用于生产环境建议改成redis,替换成redis,值需要替换...

    springboot+权限管理系统 shiro + ssm实现 实现菜单,自用

    权限管理系统 shiro + ssm实现,实现菜单,有学习的可以下载哦!...项目也整合了redis做缓存,把pom.xml中&lt;artifactId&gt;spring-boot-starter-data-redis和com.xe.demo.common.support.redis包下的注释去掉,

    基于ssm+Vue的信息类课程教学知识管理系统(源码+部署说明+系统介绍+数据库).zip

    源码部分包含了项目的主要代码文件,包括前端Vue.js代码、后端SSM框架代码以及数据库操作代码。这些代码文件经过了详细的注释,方便开发者理解和修改。部署说明部分提供了如何将项目部署到服务器上的详细步骤,包括...

Global site tag (gtag.js) - Google Analytics