redisTemplate 的序列化设置

1.Spring Boot 整合 Redis

1.1 导入依赖

如果在创建 Spring Boot 项目的时候没有考虑过使用 redis ,而后期要用 redis 的话。导入下面一个依赖就可。

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

1.2 配置链接属性

配置 redis 属性,用 application.xml 和 application.yml 都可以。这里我使用的是更简洁的 application.yml。

    spring:
        redis:
          host: 127.0.0.1 #ip
          database: 0 #数据库名称,默认 db0
          password: 123456789 #密码
          port: 6379 ¥端口
          jedis:
            pool: #链接池设置
              max-idle: 8
              min-idle: 0
              max-active: 8

1.3 使用

RedisAutoConfiguration 为我们默认配置了 JedisConnectionFactory,RedisTemplate 以及 StringRedisTemplate,让我们可以直接的使用 Redis 作为数据储存。

       @Resource
        private RedisTemplate redisTemplate;
    
        @Resource
        private StringRedisTemplate stringRedisTemplate;

String Data Redis 为我们提供了 RedisTemplate 和 StringRedisTemplate 两个模版来进行数据操作,其中:StringRedisTemplate 只针对键值都是字符串的数据进行操作。

当我们的数据存储到 Redis 的时候,我们的键(key)和 值(value)都是通过 Spring 提供的 Serializer 序列化到数据可中的。

  • RedisTemplate 默认使用的是 JdkSerializationRedisSerializer
  • StringRedisTemplate 默认使用的是 StringRedisSerializer。

Spring Data JPA 为我们提供了下面的 Serializer

  1. GenericToStringSerializer
  2. Jackson2JsonRedisSerializer
  3. JdkSerializationRedisSerializer
  4. OxmSerializer
  5. StringRedisSerializer

2. 配置 RedisTemplate 序列化类型

Spring Boot 为我们自动配置了 RedisTemplate,而 RedisTemplate 使用的是 JdkSerializationRedisSerializer,这个对我们用 redis 图形化客户端很不直观,因为 JdkSerializationRedisSerializer 使用二进制形式储存数据,在此我们将自己配置 RedisTemplate 并定义 Serializer。
  package com.changgou.seckill;

import com.changgou.seckill.config.TokenDecode;
import com.changgou.util.IdWorker;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.scheduling.annotation.EnableScheduling;
import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@EnableEurekaClient
@EnableScheduling //这个注解作用是开启定时器, 如果不写这个注解, 在方法中写cron表达式是不起作用的
@MapperScan(basePackages = {"com.changgou.seckill.dao"})
public class SeckillApplication {
    public static void main(String[] args) {
        SpringApplication.run(SeckillApplication.class);
    }

    @Bean
    public TokenDecode tokenDecode() {
        return new TokenDecode();
    }


    @Bean
    public IdWorker idWorker() {
        return new IdWorker(1, 1);
    }
	/**
     * 设置 redisTemplate 的序列化设置
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //1.创建redisTemplate模板
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        //2.关联redisConnectionFactory
        template.setConnectionFactory(redisConnectionFactory);
        //3.创建序列化类
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        //4.设置可见度
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        //5.启动默认的类型
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        //6.序列化类,对象映射设置
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
//        7.设置value的转化格式和key的转换格式
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setKeySerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }

}

这样,我们从图形化客户端可以很直观的看出我们存储的数据。


序列化设置前:
在这里插入图片描述
序列化设置后:
在这里插入图片描述
参考:
Spring Boot 整合 Redis 并设置序列化类型
Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
RedisTemplate序列化可以通过自定义RedisTemplate的方式进行。可以通过在@Configuration注解的类中定义一个RedisTemplate的Bean,并在该Bean的设置中指定序列化方式。具体的代码可以如下所示: @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { // 创建RedisTemplate对象 RedisTemplate<String, Object> template = new RedisTemplate<>(); // 设置连接工厂 template.setConnectionFactory(connectionFactory); // 创建JSON序列化工具 GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); // 设置key的序列化 template.setKeySerializer(RedisSerializer.string()); template.setHashKeySerializer(RedisSerializer.string()); // 设置value的序列化 template.setValueSerializer(jsonRedisSerializer); template.setHashValueSerializer(jsonRedisSerializer); // 返回 return template; } } 通过以上的配置,我们可以使用RedisTemplate将任意的Object对象作为值写入Redis,并将其序列化为字节形式。默认情况下,RedisTemplate使用JDK序列化方式进行序列化。 此外,还可以使用StringRedisTemplate进行序列化,它是RedisTemplate的一个子类,并且默认使用StringRedisSerializer进行序列化。需要注意的是,由于StringRedisTemplate只支持字符串类型的值,因此它的使用场景相对较为有限。 在应用中使用自定义的RedisTemplate可以通过注入@Autowired来使用: @Autowired private RedisTemplate<String, Object> redisTemplate; 通过以上的配置和注入方式,我们可以使用自定义的RedisTemplate进行序列化操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [RedisTemplate 的两种序列化方式](https://blog.csdn.net/weixin_43252521/article/details/123528536)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值