SpringBoot中配置redis的序列化方式实战

springboot项目中使用redis是很常见的业务场景,今天我们分享一下boot项目中,redis的连接配置、序列化等。

1、引入jar

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.1.6.RELEASE</version>
	<relativePath /> 
</parent>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-redis</artifactId>
	<version>2.5.5</version> 
</dependency>
 

2、yml配置文件:

spring:
  config:
      redis:
         nodes: 192.0.9.101:8001,192.0.8.101:8001
         database: 0. # 选择的数据库
         password: 123456。  # 密码
         timeout: 30000  # 连接超时时长(毫秒)
         maxactive: 2000  # 连接池最大连接数(使用负值表示没有限制)
         maxwait: -1      # 连接池最大阻塞等待时间(使用负值表示没有限制)
         maxidle: 10      # 连接池中的最大空闲连接
         minidle: 5       # 连接池中的最小空闲连接
         maxRedirects: 3
         periodicRefreshMillis: 60000 #按照周期刷新拓扑
         timeoutOptionsMillis: 20000 #redis命令超时,使用新的拓扑信息重新建立连接

3、项目中配置序列化:


import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

@Configuration
@Slf4j
@ConfigurationProperties(prefix = "spring.config.redis")
public class CommonRedisConfig extends BaseCommonRedisConfig {

    @Bean("redisTemplate")
    public RedisTemplate getDefaultRedisTemplate() {
        RedisTemplate redisTemplate = new RedisTemplate();
        setSerializer(redisTemplate);//序列化配置
        redisTemplate.setConnectionFactory(connectionFactory());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    @Bean("stringRedisTemplate")
    public StringRedisTemplate getDefaultStringRedisTemplate() {
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(connectionFactory());
        stringRedisTemplate.afterPropertiesSet();
        return stringRedisTemplate;
    }

    /**
     * redisTemplate 序列化配置
     * @param redisTemplate
     */
    private void setSerializer(RedisTemplate redisTemplate) {
        redisTemplate.setKeySerializer(new StringRedisSerializer()); //key 采用的String 的序列化方式
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());//hashde key 也采用String的序列化方式
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer());//hash 的 value序列化方式采用jackson
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer());//value 序列化方式采用jackson
    }

    /**
     *  设置value的序列化器
     *  使用Jackson 2,将对象序列化为JSON
     * @return
     */
    @Bean
    public Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
        final Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(
                Object.class);
        //json转对象类,不设置默认的会将json转成hashmap
        final ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().build();
        objectMapper.disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        return jackson2JsonRedisSerializer;
    }
}

 4、redis的连接配置:


import io.lettuce.core.TimeoutOptions;
import io.lettuce.core.cluster.ClusterClientOptions;
import io.lettuce.core.cluster.ClusterTopologyRefreshOptions;
import lombok.Setter;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;

import java.time.Duration;
import java.util.ArrayList;
import java.util.List;

@Setter
public abstract class BaseCommonRedisConfig {

    private String nodes;

    private String password;

    private int periodicRefreshMillis;

    private int timeoutOptionsMillis;

    private int timeout;

    private int maxactive;

    private int maxwait;

    private int maxidle;

    private int minidle;

    private int maxRedirects;

    /**
     * 连接redis的函数
     * @return
     */
    public RedisConnectionFactory connectionFactory() {
        // 集群redis
        RedisClusterConfiguration redisConfig = new RedisClusterConfiguration();
        List<RedisNode> nodeList = new ArrayList<>();
        String[] cNodes = nodes.split(",");
        //分割出集群节点
        for (String node : cNodes) {
            String[] hp = node.split(":");
            nodeList.add(new RedisNode(hp[0], Integer.parseInt(hp[1])));
        }
        redisConfig.setClusterNodes(nodeList);
        redisConfig.setMaxRedirects(maxRedirects);
        redisConfig.setPassword(password);

        ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
                .enablePeriodicRefresh(Duration.ofMillis(periodicRefreshMillis)) //按照周期刷新拓扑
                .enableAllAdaptiveRefreshTriggers() //根据事件刷新拓扑
                .build();

        ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder()
                //redis命令超时时间,超时后才会使用新的拓扑信息重新建立连接
                .timeoutOptions(TimeoutOptions.enabled(Duration.ofMillis(timeoutOptionsMillis)))
                .topologyRefreshOptions(topologyRefreshOptions)
                .build();

        LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
                .clientOptions(clusterClientOptions)
                .commandTimeout(Duration.ofMillis(timeout))
                .poolConfig(genericObjectPoolConfig())
                .build();
        LettuceConnectionFactory factory = new LettuceConnectionFactory(redisConfig, clientConfig);
        factory.setPassword(password);
        factory.afterPropertiesSet();
        return factory;
    }

    /**
     * GenericObjectPoolConfig redis连接池配置
     * @return
     */
    @Bean
    public GenericObjectPoolConfig genericObjectPoolConfig() {
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
        genericObjectPoolConfig.setMaxTotal(maxactive);
        genericObjectPoolConfig.setMaxIdle(maxidle);
        genericObjectPoolConfig.setMaxWaitMillis(maxwait);
        genericObjectPoolConfig.setMinIdle(minidle);
        return genericObjectPoolConfig;
    }
}

5、到此项目中redis的配置基本就是这些,然后你就可以写redis工具类了,为业务代码做准备。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值