前言

springcloud项目通常会遇到以下2个问题:

  1. 配置项目redis组件时,有时会遇到一些序列化的问题,如当使用jackson的时,使用@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)注解,会报这个实体不是一个数组的问题
  2. 集成通用redis依赖组件,可以让所有的项目共同依赖
  3. 默认一个redis过期时间,更好的利用redis资源

正文

项目依赖

Springboot : 2.6.3

Springcloud: 2021.0.1

Springcoud Alibaba: 2021.0.1.0

redis依赖

<?xml version="1.0" encoding="UTF-8"?>
<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">    
    <parent>
        <artifactId>framework-common</artifactId>
        <groupId>com.xxx</groupId>
        <version>2.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
​
    <artifactId>framework-common-redis</artifactId> 

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>

</project>

配置redis序列

@Configuration
@AutoConfigureBefore(RedisAutoConfiguration.class)
public class BaseRedisConfig {
​
    @Bean
    @ConditionalOnMissingBean(name = "redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        redisTemplate.setValueSerializer(RedisSerializer.json());
        redisTemplate.setHashValueSerializer(RedisSerializer.json());
        return redisTemplate;
    }
​
}
​
/**
 * redis 默认缓存时间
 */
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
//设置Redis缓存有效期为7天
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
      // 使的reids注解缓存的key中 "::"2个冒号转换成":"一个冒号,统一redis key的风格
.computePrefixWith(name -> name + ":")
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer())).entryTtl(Duration.ofDays(7));
return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
}
}

代码解释

@AutoConfigureBefore注解是Spring Boot的一个注解,用于指定一个配置类在另外一个配置类之前自动配置,以确保它们的顺序正确。它的作用是控制自动配置的顺序,以便在自动配置时确定配置类的优先级。

使用@AutoConfigureBefore注解需要在配置类上加上该注解,并指定目标配置类的全限定名或Class对象。

例如,我们可以在自定义的Redis配置类上使用@AutoConfigureBefore注解,指定目标为框架提供的默认Redis配置类,使自定义Redis配置类在框架默认Redis配置类之前进行自动配置。

示例代码如下所示:

@Configuration
@AutoConfigureBefore(RedisAutoConfiguration.class)
public class CustomRedisConfiguration {
   // 自定义 Redis 配置
}

在上述代码中,我们在配置类CustomRedisConfiguration上使用@AutoConfigureBefore注解,指定目标为Spring Boot框架提供的默认Redis配置类RedisAutoConfiguration,以确保自定义的Redis配置类在框架默认Redis配置类之前自动配置。

总而言之,@AutoConfigureBefore注解可以帮助我们控制自动配置的顺序,确保在自动配置时配置类的优先级正确。

RedisSerializer.string()实际为StringRedisSerializer.UTF_8,获取一个简单的 String byte[](和返回)序列化程序,使用 UTF-8 作为默认值,简单来讲,就是key必须是String类型,这个在使用BoundXXXOperations方法时,若key不为String类型,则会抛出错误。

redisTemplate.setValueSerializer(RedisSerializer.json());
redisTemplate.setHashValueSerializer(RedisSerializer.json());

以上两句代码指将普通数据类型的value和哈希结构的value值使用json序列化,看下具体内容:

static RedisSerializer<Object> json() {
return new GenericJackson2JsonRedisSerializer();
}

实际上是通过了jackson来进行序列化和逆序列化。使用json序列化的好处是可以使用@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)来序列化bean,这个注解在入库或者缓存后,会加上@class,使得逆序列化更为准确,且可实现多态逆序列化。

computePrefixWith(name -> name + ":")可以让使得springboot-data-reids注解缓存的key中的::两个冒号转换成:一个冒号,统一redis key的风格,更好的管理redis键值。

xxx::date::1234
转变成了
xxx:data:1234

添加spring.factories

spring.factories 是 Spring 框架中的一个特殊文件,在 Spring Boot 中被广泛使用。它的作用是使开发者可以为自己的应用程序添加自定义配置,例如注册自定义的 Bean 或者自定义的 Starter

具体地说,spring.factories 文件中包含了多个键值对,其中键是某个接口或者类的全限定名,而值是对应该接口或类实现的工厂类的全限定名。当 Spring Boot 启动时,会扫描项目中的所有 spring.factories 文件,并读取其中的配置信息,最终根据这些配置信息初始化并启动Spring 上下文。

Spring Boot 中的 Starter 就是通过使用 spring.factories 实现的。我们可以构建一个 Starter(一个所需依赖的组合)并定义其spring.factories 文件来注册自定义的自动配置。这样,当使用该 Starter 的应用程序启动时,Spring Boot就会根据 spring.factories 中的配置信息自动装配所需的 Bean,为提供了开发者非常方便的方式来为自己的应用程序添加自定义配置。

resource下新建META-INF目录,在META-INF目录下新建spring.factories文件,在文件里加入之前自定义的BaseRedisConfig.

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xxx.common.redis.config.BaseRedisConfig

打包

maven clean install

使用

其他项目引入依赖framework-common-redis

yml文件配置redis:

spring:
  redis:
    database: 0
    port: 6379
    host: localhost
    password: L1lvlrGZV6Kl0bhS
    lettuce:
      pool:
        # 连接池最大连接数
        max-active: 200
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
        # 连接池中的最大空闲连接
        max-idle: 10
        # 连接池中的最小空闲连接
        min-idle: 0

ps:若使用 Spring boot3pom文件为

spring:
data:
    redis:
      database: 0
      port: 6379
      host: localhost
      password: L1lvlrGZV6Kl0bhS
      lettuce:
        pool:
          # 连接池最大连接数
          max-active: 200
          # 连接池最大阻塞等待时间(使用负值表示没有限制)
          max-wait: -1ms
          # 连接池中的最大空闲连接
          max-idle: 10
          # 连接池中的最小空闲连接
          min-idle: 0
如果觉得我的文章对你有用,请随意赞赏