SpringBoot2整合Redis缓存三步骤代码详解

 更新时间:2020年03月04日 09:33:36   作者:赵小胖0914  
这篇文章主要介绍了SpringBoot2整合Redis缓存三步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

遵循SpringBoot三板斧

第一步加依赖

<!-- Redis -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis依赖commons-pool 这个依赖一定要添加 -->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-pool2</artifactId>
  <version>2.6.0</version>
</dependency>

第二步写注解

@EnableCaching//开启缓存支持

第三步写配置

spring:
 redis:
  database: 0
  host: 192.168.1.11
  port: 6379
  password:
  timeout: 600
  lettuce:
   pool:
    max-active: 50
    max-wait: -1
    max-idle: 8
    min-idle: 0

编写Redis配置类

/**
 * @Author: zc
 * @Date: 2019/11/3 14:12
 * @Description: SpringBoot2.0 Redis缓存配置
 * @EnableCaching:开启缓存支持
 */
@Slf4j
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

  @Value("${sys.dataCaching.expireTime:0}")
  private int expireTime;

  @Resource
  private LettuceConnectionFactory lettuceConnectionFactory;

  @Override
  @Bean
  public KeyGenerator keyGenerator() {//设置自定义key{ClassName + methodName + params}
    return (target, method, params) -> {
      StringBuilder sb = new StringBuilder();
      sb.append(target.getClass().getName());
      sb.append(",Method:");
      sb.append(method.getName());
      sb.append(",Params[");
      for (int i = 0; i < params.length; i++) {
        sb.append(params[i].toString());
        if (i != (params.length - 1)) {
          sb.append(",");
        }
      }
      sb.append("]");
      log.debug("Data Caching Redis Key : {}", sb.toString());
      return sb.toString();
    };
  }
  //自定义keyGenerator,Key生成器
  @Bean
  public KeyGenerator updateByIdkeyGenerator() {
    return (target, method, params) -> {
      StringBuilder sb = new StringBuilder();
      sb.append(target.getClass().getName());
      sb.append(",Method:");
      sb.append("getById");
      sb.append(",Params[");
      try {
        Field id = params[0].getClass().getDeclaredField("id");
        id.setAccessible(true);
        sb.append(id.get(params[0]).toString());
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      } catch (NoSuchFieldException e) {
        e.printStackTrace();
      }
      sb.append("]");
      log.debug("Data Caching Redis Key : {}", sb.toString());
      return sb.toString();
    };
  }
  //自定义keyGenerator,Key生成器
  @Bean
  public KeyGenerator deleteByIdkeyGenerator() {
    return (target, method, params) -> {
      StringBuilder sb = new StringBuilder();
      sb.append(target.getClass().getName());
      sb.append(",Method:");
      sb.append("getById");
      sb.append(",Params[");
      for (int i = 0; i < params.length; i++) {
        sb.append(params[i].toString());
        if (i != (params.length - 1)) {
          sb.append(",");
        }
      }
      sb.append("]");
      log.debug("Data Caching Redis Key : {}", sb.toString());
      return sb.toString();
    };
  }
  

  @Bean
  public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
    RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
    //设置缓存过期时间
    if (expireTime > 0) {
      log.info("Redis 缓存过期时间 : {}", expireTime);
      //设置缓存有效期 秒
      redisCacheConfiguration.entryTtl(Duration.ofSeconds(expireTime));
    } else {
      log.info("Redis 未设置缓存过期时间");
    }
    return RedisCacheManager
        .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
        .cacheDefaults(redisCacheConfiguration).build();
  }

  @Bean
  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {//创建RedisTemplate
    // 设置序列化
    Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(
        Object.class);
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om);
    // 配置redisTemplate
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
    redisTemplate.setConnectionFactory(lettuceConnectionFactory);
    RedisSerializer<?> stringSerializer = new StringRedisSerializer();
    // key序列化
    redisTemplate.setKeySerializer(stringSerializer);
    // value序列化
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
    // Hash key序列化
    redisTemplate.setHashKeySerializer(stringSerializer);
    // Hash value序列化
    redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
  }
}

如何使用查询缓存

@CacheConfig(cacheNames = "demoDao")
@Component
public class DemoDao implements IDemoDAO<> {
  @Autowired
  DemoMapper mapper;

  //用默认配置的keyGenerator
  @Cacheable
  @Override
  public Demo getById(Integer id) {
    return mapper.getById(id);
  }
  //使用配置的keyGenerator,清空缓存
  @CacheEvict(keyGenerator = "updateByIdkeyGenerator")
  @Override
  public int update(T entity) {
    return mapper.update(entity);
  }
  //使用配置的keyGenerator,清空缓存
  @CacheEvict(keyGenerator = "deleteByIdkeyGenerator")
  @Override
  public int deleteById(Integer id) {
    return mapper.deleteById(id);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 使用maven打包/跳过某个modules

    使用maven打包/跳过某个modules

    本文总结了在Maven项目中跳过或单独构建模块的方法,包括使用`-pl`、`-am`和`-amd`参数来选择性地执行模块构建,以及通过`-Dmaven.test.skip`跳过测试,以提高构建效率
    2024-12-12
  • SpringBoot自定义转换器应用实例讲解

    SpringBoot自定义转换器应用实例讲解

    SpringBoot在响应客户端请求时,将提交的数据封装成对象时,使用了内置的转换器,SpringBoot 也支持自定义转换器,这个内置转换器在 debug的时候,可以看到,提供了124个内置转换器
    2022-08-08
  • 一文搞懂hashCode()和equals()方法的原理

    一文搞懂hashCode()和equals()方法的原理

    这篇文章主要介绍了详解hashCode()和equals()的本质区别和联系,本文先对两种方法作了介绍,然后对二者联系进行分析,具有一定参考价值,需要的朋友可以了解下
    2020-06-06
  • 基于JavaSwing+mysql开发一个学生社团管理系统设计和实现

    基于JavaSwing+mysql开发一个学生社团管理系统设计和实现

    项目使用Java swing+mysql开发,可实现基础数据维护、用户登录注册、社团信息列表查看、社团信息添加、社团信息修改、社团信息删除以及退出注销等功能、界面设计比较简单易学、适合作为Java课设设计以及学习技术使用,需要的朋友参考下吧
    2021-08-08
  • springboot使用小工具之Lombok、devtools、Spring Initailizr详解

    springboot使用小工具之Lombok、devtools、Spring Initailizr详解

    这篇文章主要介绍了springboot使用小工具之Lombok、devtools、Spring Initailizr详解,Lombok可以代替手写get、set、构造方法等,需要idea装插件lombok,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • 深入理解Java中的String(示例详解)

    深入理解Java中的String(示例详解)

    文章详细介绍了Java中String类的特点、用途、主要方法以及常见用法,String类是不可变的,具有字符串常量池,特定的内存结构,并随JDK版本更新而优化,它广泛用于表示和处理文本数据,并在内存管理和性能优化方面表现出色,感兴趣的朋友一起看看吧
    2025-03-03
  • MyBatis几种不同类型传参的方式总结

    MyBatis几种不同类型传参的方式总结

    这篇文章主要介绍了MyBatis几种不同类型传参的方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 解决IDEA项目external libraries依赖包消失的问题

    解决IDEA项目external libraries依赖包消失的问题

    有时候电脑重启后,再打开IDEA上的项目时会出现external libraries目录下的依赖包都消失了的情况,只剩下了一个JDK的包,本文给大家介绍了解决IDEA项目external libraries依赖包消失的办法,需要的朋友可以参考下
    2024-02-02
  • 到底如何设置Java线程池的大小的方法示例

    到底如何设置Java线程池的大小的方法示例

    在我们日常业务开发过程中,或多或少都会用到并发的功能。那么并发线程池到底设置多大呢?文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Servlet系列两种创建方式

    Servlet系列两种创建方式

    本文主要介绍了Servlet系列两种创建方式,包含Servlet2.5之前使用和Servlet3.0后,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02

最新评论