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

所属分类: 软件编程 / java 阅读数: 33
收藏 0 赞 0 分享

遵循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 中maven pom.xml文件教程详解

这篇文章主要介绍了java 中maven pom.xml文件教程详解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

spring boot整合netty的实现方法

这篇文章主要介绍了spring boot整合netty的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Netty与Spring Boot的整合实现

这篇文章主要介绍了Netty与Spring Boot的整合的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring动态加载bean后调用实现方法解析

这篇文章主要介绍了Spring动态加载bean后调用实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

java实现画图板上画一条直线

这篇文章主要为大家详细介绍了java实现画图板上画一条直线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java通过python命令执行DataX任务的实例

今天小编就为大家分享一篇Java通过python命令执行DataX任务的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

springBoot集成redis的key,value序列化的相关问题

这篇文章主要介绍了springBoot集成redis的key,value序列化的相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

java实现登录案例

这篇文章主要为大家详细介绍了java实现登录案例的相关代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java解决请求跨域的两种方法

这篇文章主要为大家详细介绍了java解决请求跨域的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

SpringBoot集成Beetl后统一处理页面异常的方法

这篇文章主要介绍了SpringBoot集成Beetl后统一处理页面异常的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享
查看更多