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);
  }
}

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

相关文章

  • 基于Java回顾之多线程同步的使用详解

    基于Java回顾之多线程同步的使用详解

    在这篇文章里,我们关注线程同步的话题。这是比多线程更复杂,稍不留意,我们就会“掉到坑里”,而且和单线程程序不同,多线程的错误是否每次都出现,也是不固定的,这给调试也带来了很大的挑战
    2013-05-05
  • SpringBoot 快速实现 api 接口加解密功能

    SpringBoot 快速实现 api 接口加解密功能

    在项目中,为了保证数据的安全,我们常常会对传递的数据进行加密,Spring Boot接口加密,可以对返回值、参数值通过注解的方式自动加解密,这篇文章主要介绍了SpringBoot 快速实现 api 接口加解密功能,感兴趣的朋友一起看看吧
    2023-10-10
  • java实现超市管理系统

    java实现超市管理系统

    这篇文章主要为大家详细介绍了java实现超市管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • springboot配置文件中使用${}注入值的两种方式小结

    springboot配置文件中使用${}注入值的两种方式小结

    这篇文章主要介绍了springboot配置文件中使用${}注入值的两种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Hibernatede 一对多映射配置方法(分享)

    Hibernatede 一对多映射配置方法(分享)

    下面小编就为大家带来一篇Hibernatede 一对多映射配置方法(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Java类和对象的设计原理

    Java类和对象的设计原理

    这篇文章主要介绍了Java类和对象的设计原理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • Springboot集成任务调度实现过程

    Springboot集成任务调度实现过程

    这篇文章主要介绍了Springboot集成任务调度实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java上传文件图片到服务器的方法

    Java上传文件图片到服务器的方法

    这篇文章主要为大家详细介绍了Java上传文件图片到服务器的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Maven+SSM框架实现简单的增删改查

    Maven+SSM框架实现简单的增删改查

    这篇文章主要介绍了Maven+SSM框架实现简单的增删改查,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java8新特性:Lambda表达式之方法引用详解

    Java8新特性:Lambda表达式之方法引用详解

    这篇文章主要给大家介绍了关于Java8新特性:Lambda表达式之方法引用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论