`
mowengaobo
  • 浏览: 166221 次
  • 性别: 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整合Redis做缓存

    综上所述,SSM整合Redis做缓存是提高系统性能的有效手段,涉及到Spring框架的组件管理、Spring MVC的请求处理以及MyBatis的数据库操作,通过Redis实现了高效的数据缓存。在实际开发中,理解并熟练掌握这些知识点,...

    SSM整合Redis缓存Demo

    通过SSMRedisDemo,开发者可以学习如何在实际项目中整合和使用这些技术,提升应用性能,同时理解缓存机制和SSM框架之间的协同工作方式。对于初学者,这是一个很好的学习资源,对于有经验的开发者,它也是一个快速...

    SSM整合memcached缓存

    4. 编写缓存操作:在业务层,你可以使用注解或者通过配置来标记那些方法的返回结果应该被缓存。例如,使用`@Cacheable`注解,指定缓存的key和value生成策略。 5. 实现缓存管理:为了清除和更新缓存,可以使用`@...

    ssm框架整合redis实现缓存

    5. **SSM中的拦截器**:若不使用Spring Cache,也可以自定义拦截器,对特定的Controller方法进行拦截,手动调用RedisService进行缓存操作。 6. **事务管理**:由于Redis是非事务性的,因此在SSM的事务管理中,需要...

    SSM架构+redis缓存实例环境搭建

    4. 缓存策略定义:定义缓存的策略,比如基于注解的缓存控制,可以使用Spring的`@Cacheable`、`@CacheEvict`等注解来指定哪些方法的结果应被缓存,以及何时清除缓存。 5. 实现缓存管理:在业务代码中,通过调用Redis...

    在ssm项目中使用redis缓存查询数据的方法

    在SSM(Spring、SpringMVC、MyBatis)项目中使用Redis缓存查询数据,是一种常见的优化策略,旨在提高应用程序的性能和响应速度。Redis是一个高性能的键值存储系统,常被用作缓存解决方案,因为它支持多种数据结构如...

    ssm+redis二级缓存

    【ssm+redis二级缓存】是一个基于SpringMVC、Spring和MyBatis的Web应用程序,结合了Redis作为二级缓存来提升系统性能。在这个项目中,开发人员利用了SSM(Spring、SpringMVC、MyBatis)的集成优势,结合Redis的高速...

    Java+redis缓存工具类(SSM)

    SSM(Spring、SpringMVC、MyBatis)是Java企业级开发中的常见框架组合,而Redis则是一个高效的内存数据存储系统,常作为缓存使用。本项目提供了一个Java实现的Redis缓存工具类,结合SSM框架,可以帮助开发者快速地...

    SSM框架+Echache整合

    - 使用`@Cacheable`、`@CacheEvict`等注解,实现方法级别的缓存控制。例如,`@Cacheable`可以在方法执行前检查缓存,如果存在则直接返回,避免重复计算;`@CacheEvict`则用于清除指定缓存。 4. **MyBatis与Ehcache...

    SSM框架整合(解决中文乱码,二级缓存,JSON,事务)

    MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。版本3.4.0在这里意味着它包含了对Java 8的支持和其他优化。 4. **中文...

    ssm+maven使用详细教程

    - 使用Spring的缓存管理,如EhCache或Redis,提高数据访问效率。 - 进行性能测试,使用JMeter等工具评估系统性能并进行调优。 通过这个教程,开发者能够从零开始学习并掌握SSM框架的集成和使用,为Java Web开发...

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

    综上所述,这个项目涉及了Java Web开发的核心技术,包括SSM框架的使用、Spring注解、Redis缓存以及数据同步策略。通过这些技术,开发者可以构建一个高效、响应快速的Web应用程序,有效地处理高并发场景下的数据访问...

    java使用SSM实现的一个网上商城.rar

    7. **缓存技术**:为了提高性能,项目可能使用Redis或Memcached等缓存技术,存储热点数据,如热门商品、推荐商品等,减少对数据库的直接访问。 8. **单元测试和集成测试**:使用JUnit进行单元测试,确保每个组件的...

    SSM框架 增删改查操作

    例如,使用AOP进行统一的异常处理,通过Log4j或Logback记录操作日志,使用MyBatis的动态SQL提高查询效率,或者配合缓存技术如Redis提升系统性能等。 总的来说,SSM框架提供了一个高效、灵活的开发环境,让开发者...

    SSM框架的思维导图

    Mybatis.xmind可能包含了Mybatis的主要特性,如XML或注解方式配置映射文件、动态SQL、结果映射、缓存机制、事务管理等,以及如何与Spring框架集成进行事务控制。 4. **SSM1.xmind**:这个思维导图可能是对整个SSM...

    ssm+ecache

    7. 缓存使用示例:研究业务代码,看如何使用Spring的`@Cacheable`、`@CacheEvict`等注解实现缓存操作。 8. 运行和测试:通过Maven构建项目,运行应用,通过发送HTTP请求来测试各个功能,观察EhCache的效果。 通过...

    (SSM框架)memcached整合Spring基于Cache注解.

    @Cacheable、@CacheEvict、@Caching和@CacheConfig是主要的四个注解,分别用于缓存方法的结果、清除缓存、组合缓存操作以及全局配置缓存。 3. **Spring与Memcached集成**: 要在Spring中使用Memcached,首先需要...

    ssm优化后的jar包

    4. 异步处理:使用Spring的@Async注解,将耗时的操作异步化,提升响应速度。 5. 缓存策略:引入Redis或Memcached等缓存技术,对频繁访问的数据进行缓存,减少数据库压力。 6. 分页优化:使用MyBatis的分页插件,...

    SSM框架笔记-ssm文档.zip

    5. 实战项目:通过一个实际的Web项目,练习SSM的使用,包括数据库设计、CRUD操作、前后端交互等。 在提供的文件中,"IT楠老师springmvc教程.pdf"、"IT楠老师spring教程.pdf"、"IT楠老师mybatis教程.pdf"应该是详细...

    SSM与redis

    SSM代表Spring、Spring MVC和MyBatis三个框架的集成,而Redis则是一种高性能的键值存储系统,常用于缓存、消息队列等多种场景。 **Spring框架**:Spring是Java企业级应用开发的核心框架,它提供了依赖注入...

Global site tag (gtag.js) - Google Analytics