Spring整合Redis用作缓存-注解方式

Spring Boot 整合 Redis 缓存策略详解与常见误区 摘要:本文探讨Spring Boot整合Redis缓存的策略与实践。Redis凭借高性能、丰富数据结构等优势成为首选缓存方案。文章详细介绍了基础整合步骤,包括依赖引入、Redis连接配置和缓存注解使用,并重点解析了@Cacheable、@CachePut等核心注解的功能参数。针对默认序列化问题,提出了自定义RedisTemplate配置方案。最后强调深入理解缓存策略的必要性,以避免数据不一致等常见问题,帮助开发者构建高效稳定的缓存应用。 阅读详情

1.前言

  redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。(以上来自百度百科)
  之前写过spring整合Ehcache用作缓存的,这里区别一下。使用redis的时候,需要独立安装redis。属于独立运行的程序。所以在写单元测试的时候,第二次运行,照样可以获取到缓存中的值。但是ehcache是和java程序绑定一起的,有着相同的生命周期,所以第一次单元测试存入缓存,第二次运行是取不到的。
整合之前需要自行安装Redis。  
  

2.maven配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.test</groupId>
  <artifactId>spring-redis</artifactId>
   <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
    <properties>
        <spring.version>4.3.5.RELEASE</spring.version>
    </properties>

     <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-jdbc</artifactId>  
            <version>${spring.version}</version>  
        </dependency> 

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.8.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.18</version>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
            <scope>test</scope>
        </dependency>
         <!-- mybatis核心包 -->   
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency> 
        <!-- mybatis/spring包 -->  
        <dependency>  
            <groupId>org.mybatis</groupId>  
            <artifactId>mybatis-spring</artifactId>  
            <version>1.2.2</version>  
        </dependency>  

        <!-- 导入Mysql数据库链接jar包 -->  
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.27</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>

        <!-- 导入dbcp的jar包,用来在applicationContext.xml中配置数据库 -->  
        <dependency>  
            <groupId>commons-dbcp</groupId>  
            <artifactId>commons-dbcp</artifactId>  
            <version>1.2.2</version>  
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

     </dependencies>

  <build/>
</project>

3.配置缓存

package com.test.config;

import java.lang.reflect.Method;

import org.apache.log4j.Logger;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;

@Configuration
@EnableCaching
public class CacheConfig{

      private static final Logger log = Logger.getLogger(CacheConfig.class);

      @Bean
      public JedisConnectionFactory redisConnectionFactory() {
        JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();
        redisConnectionFactory.setHostName("127.0.0.1");
        redisConnectionFactory.setPort(6379);
        return redisConnectionFactory;
      }

      @Bean
      public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
        redisTemplate.setConnectionFactory(cf);
        return redisTemplate;
      }

      @Bean
      public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        //这里可以设置一个默认的过期时间
        cacheManager.setDefaultExpiration(300);
        return cacheManager;
      }

      @Bean
      public KeyGenerator customKeyGenerator() {
        return new KeyGenerator() {
          @Override
          public Object generate(Object o, Method method, Object... params) {
            StringBuilder sb = new StringBuilder();
            sb.append(o.getClass().getName());
            sb.append(method.getName());
            for (Object obj : params) {
              sb.append(obj.toString());
            }
            return sb.toString();
          }
        };
      }
}

以上配置中,JedisConnectionFactory的时候只配了地址和端口号,因为我是本地测试,且没有设置密码。如果是远程地址,可以直接修改上面的地址或端口号,还可以添加密码。设置cacheManager的时候设置了一个缓存默认的过期时间,单位是秒。
customKeyGenerator()这个方法可以不写。是自定义生key的,默认也可以。上面的生成方式只是比默认的生成方式多了一个类名。除了KeyGenerator,其他的bean都是必须配置的。这里还省略了JedisPoolConfig的配置,可以设置最大连接数、最大等待毫秒数、逐出连接的最小空闲时间等。有需要的可以直接配置一个JedisPoolConfig。

4.service 实现

一.接口:

package com.test.service;

import com.test.model.User;

public interface UserService {
    public User findUserById(int id);
    public User addUser(User user);
    public User updateUser(User user);
    public int countUser();

    public String getTimestamp(String param);
}

二.接口实现类

package com.test.service.impl;

import javax.annotation.Resource;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.test.dao.UserDao;
import com.test.model.User;
import com.test.service.UserService;

@Service
public class UserServiceImpl implements UserService{

    @Resource
    private UserDao userDao;

    @Cacheable(cacheNames="user")
    @Override
    public User findUserById(int id) {
        return userDao.findById(id);
    }

    @CachePut(cacheNames="user",key="#result.id")
    @CacheEvict(cacheNames="countUser" ,allEntries = true)
    @Override
    public User addUser(User user) {
        userDao.add(user);
        return user;
    }

    @Override
    @CachePut(cacheNames="user",key="#user.id")
    public User updateUser(User user) {
        userDao.update(user);
        return user;
    }

    @Override
    @Cacheable(cacheNames="countUser")
    public int countUser() {
        return userDao.count();
    }

    @Override
    @Cacheable(cacheNames="time")
    public String getTimestamp(String param) {
        Long timestamp = System.currentTimeMillis();
        return timestamp.toString();
    }

}

以上代码中,
findUserById()上有注解@Cacheable(cacheNames=”user”),表示将返回值存入缓存user。该注解没有指定key,因为findUserById()方法中只有一个参数,所以该方法的默认key就是id。
addUser()方法有两个注解,@CachePut(cacheNames=”user”,key=”#result.id”)表示,执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。可以是添加用户之后直接加入缓存,并且指定key是返回值的id。则下次使用该id去查询user的时候可以直接从缓存中获取。
而addUser()方法中的@CacheEvict(cacheNames=”countUser” ,allEntries = true)注解表示删除countUser中的缓存,allEntries = true表示清除countUser中所有的元素。对应于添加用户之后,将用户数量的缓存删除。以免造成查询数据出错。
updateUser() 中的@CachePut(cacheNames=”user”,key=”#user.id”)将更新后的user直接存入缓存。key是用户的id。所以根据id查询该用户时,直接从缓存中获取。
countUser() ,@Cacheable(cacheNames=”countUser”)将查询出来的数量存入缓存countUser。所以上面addUser方法中@CacheEvict注解的cacheNames也是countUser。

5.测试代码

package com.service;

import javax.annotation.Resource;

import org.junit.Test;

import com.base.SpringTestCase;
import com.test.model.User;
import com.test.service.UserService;

public class TestService extends SpringTestCase {

    @Resource
    private UserService userService;

    @Test
    public void addUser(){
        User user = new User();
        user.setName("王五");
        userService.addUser(user);
    }

    @Test
    public void testQuery() throws InterruptedException{
        System.out.println("第一次调用"+userService.findUserById(1));
        System.out.println("第二次调用"+userService.findUserById(1));

    }

    @Test
    public void testUpdate(){
        User user = userService.findUserById(1);
        System.out.println( "第一次调用"+user);
        user.setName(user.getName()+"1");
        System.out.println("更新");
        userService.updateUser(user);
        System.out.println("第二次调用"+userService.findUserById(1));
    }

    @Test
    public void testCount(){
        System.out.println("第一次查询数量:"+userService.countUser());
        addUser();
        System.out.println("第二次查询数量:"+userService.countUser());
    }

    @Test  
    public void getTimestampTest() throws InterruptedException{  
        System.out.println("第一次调用:" + userService.getTimestamp("param"));
        Thread.sleep(2000);
        System.out.println("2秒之后调用:" + userService.getTimestamp("param"));
        Thread.sleep(10000);
        System.out.println("12秒之后调用:" + userService.getTimestamp("param"));

    } 

}

添加用户后,测试testQuery()指定一个id,运行之后,第一次查询了数据库,第二次查询没有经过数据库,直接从缓存中获取。
image
注意:这里第一次查询的时候访问了数据库,因为我上面设置了缓存失效时间是300秒,所以在300秒内再次运行,这两次的结果都不会经过数据库。

testUpdate()测试更新user信息后第二次查询是更新后的内容。因为在update方法上加了@CachePut(cacheNames=”user”,key=”#user.id”)测试结果如下:
image

testCount()测试添加用户后,再查询时,数据从数据库中读取。执行结果图太大就不贴了。

测试getTimestampTest()方法时需要将上面cacheManager.setDefaultExpiration(10);设置成10秒,测试缓存失效时间。结果第一次 和第二次调用的时间是一样的。12秒后查询的时间和上面查询的不同。

还有其他的配置就不展示了,直接把项目传上去,大家可自行下载。
http://download.youkuaiyun.com/detail/poorcoder_/9768548
转载请注明出处:http://blog.youkuaiyun.com/poorcoder_/article/details/59541710

Spring基于注解整合Redis完整实例 本实例完美的实现了Spring基于注解整合Redis,只需在相应方法上加上注解便可实现操作redis缓存的功能,具体实现方法与运行测试方法请参见博文:http://blog.youkuaiyun.com/l1028386804/article/details/52141372 立即下载

相关推荐

Flutter 直接调用so动态库,或调用C/C++源文件内函数

我把 .so 文件尝试放过好几个目录/lib/,最终都会报这个错误,现在才知道库文件需要放在你根本想象不到的地方!!!尝试了一些方法还是不行后我放弃了 ffi,想着用 Flutter 的 MethodChannel 桥接 android/ios 原生,再让原生去调 native 层。一顿操作把Android端的搞定了,当然中间涉及到 Kotlin和C++ 层的数据类型映射的痛苦,而且业务函数也不像一个 helloworld 那么简单,别提有多痛苦了。

开发以大橘为重 8353

SSM之Spring注解式缓存Redis

探讨如何使用Spring的注解式缓存和Redis数据库来加速SSM(Spring、Spring MVC、MyBatis)应用程序的性能,提高响应速度和数据可用性。了解如何轻松地缓存数据,减少数据库访问次数,以提供更快的用户体验。

kissship的博客 846

小波变换(Wavelet Transform)原理及介绍

小波变换是一种多分辨率时频分析工具,克服了傅里叶变换无法定位时间信息的缺陷。通过可伸缩平移的母小波,它能同时捕捉信号的高频细节(短时特征)和低频轮廓(整体趋势)。其核心原理是利用不同尺度的小波基与信号进行内积运算,生成时频域系数矩阵。小波变换具有动态分辨率特性,高频部分时间精度高,低频部分频率分辨率好。主要应用包括瞬态事件检测、信号降噪、数据压缩(如JPEG2000)和压缩感知(如快速MRI)。

qq_42758052的博客 5496

Spring基于注解整合Redis

本文介绍了如何使用Spring注解来整合Redis,并使用缓存相关的注解来简化对Redis的操作。当方法被调用时,Spring会先检查缓存中是否存在对应的结果,如果存在,则直接返回缓存的结果;电子商务网站,我们可以使用Redis作为商品信息的缓存,以提高访问速度和减轻数据库的压力。当方法被调用时,Spring会先执行该方法,并将结果存入缓存,而不会去检查缓存中是否已存在。方法时,如果该商品信息已存在于缓存中,则直接从缓存中获取,避免了频繁地访问数据库,提升了访问速度和性能。实例,并配置了连接工厂。

牛肉胡辣汤 1422

【开源训练数据集2】10个最适合机器学习的股票市场数据集

​随着加密货币在世界各地的兴起,人们现在有比以往更多的投资方式。然而,这并不像低买高卖那么简单。如果你能准确预测股市,你就会成为地球上最富有的人之一。因此,之前已经有关于如何利用情绪分析来预测股市的研究。对于那些希望构建类似预测模型的人,本文将介绍 10 个用于机器学习的股票市场和加密货币数据集。

u010542847的博客 2139

基于R语言的现代贝叶斯统计学方法(贝叶斯参数估计、贝叶斯回归、贝叶斯计算)实践

贝叶斯统计学是一门基本思想与传统基于频率思想的统计学完全不同的统计学方法;它以其灵活性和先进性在现代的统计学中占据着重要的地位。贝叶斯统计学是开展科学研究不可缺少的重要手段,但是,因为其思想、技术和方法都与传统统计学有着较大区别;且其计算中涉及马尔科夫、蒙特卡罗和吉布斯采样等现代计算方法,对使用者经验和能力构成了很大的挑战。

AAIshangyanxiu的博客 681

spring注解式缓存+Redis

配置在方法或类上,作用:本方法执行后,先去缓存看有没有数据,如果没有,从数据库中查找出来,给缓存中存一份,返回结果,key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合。condition:触发条件,满足条件就加入缓存,默认为空,表示全部都加入缓存,支持SpEL。key:缓存的key,默认为空,表示使用方法的参数类型及参数值作为key,支持SpEL。key:缓存的key,默认为空,表示使用方法的参数类型及参数值作为key,支持SpEL。

weixin_63719049的博客 1659

【数据集】全球首个10米分辨率精细分类土地覆盖数据集GLC_FCS10

【数据集】全球首个10米分辨率精细分类土地覆盖数据集GLC_FCS10

WW、forever的博客 1570

Spring注解式缓存redis

导入依赖 redis.properties spring-redis.xml 提前准备好的缓存key的工具类 CacheKeyGenerator 要下载lombok插件不然会报错。 测试类注解 测试代码 @Cacheable 的测试代码 @CachePut测试代码 @CacheEvict测试代码 测试结果:可以配置删除指定缓存数据,也可以删除符合规则的所有缓存数据;

qq_62331938的博客 1441

ICLR 2025 | MambaPEFT: 探索针对Mamba的参数高效微调方法

通过利用海量数据构建大型模型,基于Transformer的模型生态系统已逐步确立。参数高效微调(PEFT)是一项至关重要的技术,它能以最低成本将这些模型应用于下游任务,同时实现高效的性能表现。最近,基于状态空间模型(SSM)的Mamba模型作为Transformer的潜在替代方案受到了广泛关注。尽管已经提出了许多基于Mamba的大规模模型,但如何高效地将预训练的Mamba模型应用于下游任务仍有待研究。在本文中,作者对适用于Mamba的PEFT方法展开了探索性分析。

小白学视觉 329

全功能tgbot/Telegram机器人多功能有后台版源码

trx兑换 闪兑 关键字监控 群管 usdt监控 余额查询 推广分享 等几乎常见的tg机器人功能都有。全功能tgbot/telegram机器人多功能有后台版源码-打包好的可以直接上手。

百创科技 2705

Redis之Spring常用注解整理

 Redis 是一个key-value 的存储系统,value可以存储string,List,Map等各种类型的数据。多用于缓存每次都要查询的固定数据,降低对数据库的访问量,调高网站性能。 下面主要介绍spring的三个关于Redis的注解,@Cacheable,@CacheEvict,@CachePut。 @Cacheable @Cacheable注解类似于保存放法。注解可以标记在方法上,...

fendou_0123456789的博客 1149

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

springboot+redis整合(plus篇)

上一篇整合了springboot-redis,但是我们也发现了一个问题,那就是存入的数据出现乱码,运行代码发现会出现乱码,那是因为springboot对redis的操作封装了两个工具类s的操作封装到模RedisTemplate和StringRedisTemplate,我们使用RedisTemplate进行存储字符串操作时,对key进行序列化操作是采用的是默认的jdk序列化方式,我们需要自行设置为key和value设置序列化。

2301_78418531的博客 265

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spring Boot 3 整合Redis(2)注解驱动缓存

本文将介绍Spring Boot 3中如何使用Redis作为缓存,并通过注解驱动的方式进行操作。通过合理配置和使用缓存,我们能够大幅提升系统的性能和响应速度。在生产环境中,恰当的缓存策略、过期时间和缓存层优化将进一步提高系统的稳定性和扩展能力。

Harry的博客 1225

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring+Mybatis+redis整合(用注解的方式)

手动的操作缓存自己解决了,原本想着以后就用手动的方式,可是不研究研究注解感觉自己错过了什么,现在弄完了,感觉真是简单,比手动的方式简单太多了,可能是我直接用的别人的工具类可能简单,如果手动的方式中redisDao命令全了,可能会感觉差不多,不过还是有点区别的,不是很大,看你的需求了 手动方式操作redis请看这:https://blog.youkuaiyun.com/weixin_43113679/art...

胖墩的IT博客 8495

互联网应用主流框架整合之Spring缓存机制和Redis结合

Redis和Spring缓存结合,Cacheable、CachePut、CacheEvict(附源码)

一块大洋 7333

SpringBoot整合Redis并使用Spring缓存注解进行缓存操作

SpringBoot整合Redis依赖: 提示:因为不需要用到自定义模板,所以引入的依赖相对SpringBoot整合Redis并示例使用模板操作来说,要少些。 第一步:在pom.xml中引入Redis相关依赖。 给出本文完整的pom.xml文字版: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http...

JustryDeng 4417

Java面试-Spring Boot 整合 Redis:缓存注解 @Cacheable、@CacheEvict

《Java面试200问》系列之Spring Boot整合Redis缓存实战指南 本文深入讲解Spring Boot整合Redis实现高效缓存的完整方案。通过@Cacheable、@CacheEvict等注解的详细解析,帮助开发者掌握: 缓存核心价值:减轻数据库压力、提升响应速度 环境搭建:从依赖配置到启动类注解 关键注解使用:@Cacheable实现"懒加载"缓存、@CacheEvict清理过期数据 高级应用:缓存策略、常见问题解决方案 完整商品缓存系统实战案例 文章采用比喻讲解(如将缓

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

【SpringBoot教程】SpringBoot整合Caffeine本地缓存及Spring Cache注解的使用

本地缓存之王!Caffeine!

神马都会亿点点的毛毛张 8759

Spring Cache整合Redis

文章介绍 继myabtis二级缓存整合redis之后,利用课余时间又研究了一下Spring Cache整合redis。原本是计划将这两篇文章和redis的介绍整合成一篇文章,但是。。。手贱的我在整合过程中不小心点击了刷新,导致新写的内容被清空了。花了我两天的宝贵时间啊。。。。。。 额额额,这一篇是继删除之后,根据回忆,又重写了一篇。虽然原文档丢了,但是还好,参考的blog,笔记浏览器里面还保存着,不至于让我太过难受,好了。拿重点。 本篇主要从原生spring cache实现缓存操作,背后源码浅析,再到re

zhang19903848257的博客 4328

SSM整合redis及redis的注解式开发和解决Redis缓存问题

简化代码:注解式开发可以显著减少与Redis相关的样板代码。通过使用注解,你可以在方法上直接标记缓存操作,而不必在每个方法中手动编写缓存逻辑。提高开发效率:通过使用注解,开发者可以更容易地实现缓存功能,减少了手动处理缓存的复杂性。这使得开发者可以专注于业务逻辑的实现,而不必花费过多时间在缓存的管理和维护上。降低错误风险:手动管理缓存可能会导致错误,例如忘记在适当的时机清除缓存,或者在更新数据时没有及时更新缓存。使用注解可以减少这些潜在的错误,提高了代码的可靠性。提升性能。

ChatYU的博客 1219

Spring Boot 整合 Redis 实现数据缓存

Spring Boot 学习笔记(三十五):        Spring Boot 缓存,默认使用的是 ConcurrentMap 的方式来实现的,然而我们在项目中并不会这么使用。我们经常会引入第三方缓存框架,来完成对数据的缓存操作。比如说:Redis 。本文就来介绍 Spring Boot 整合 Redis 来实现数据的缓存。 1.添加 Maven 依赖 <!--引...

扛麻袋的少年的博客 2683

Spring Boot 整合Redis 缓存实现

在 Spring Boot 中,数据的管理存储依赖于Spring框架中cache相关的org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 缓存管理器接口。如果程序中没有定义类型为 cacheManager 的Bean 组件或者是名为 cacheResolver的 cacheResolver緩在解析器,Spring Boot将尝试选择并启用以下缓存组件(按照指定的顺序)。

2301_82310799的博客 1693

Spring Boot集成Redis缓存之注解方式

首先还是加入依赖Jar pom.xml中加入依赖 <!-- 加载spring boot redis 包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> application.pro

日常分享工作中的一些技术干货。 988

通过注解方式实现Spring AOP整合Redis缓存

1、实现自定义注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TsingRedisCache { } 2、创建切面配置类 /** * @ClassName : AopConfig * @Description: 横切面配置 * ...

LiJiVV的博客 484
上一篇: Spring4 整合EhCache实现页面缓存 零配置
下一篇: ActiveMQ介绍及Spring整合实例
poorCoder_
博客等级 码龄10年 129粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值