1.Redis的序列化

  • 首先看一下RedisTemplate的源码注释:
    在这里插入图片描述
    在这里主要说4件:
    (1)在给定对象和Redis存储中的基础二进制数据之间执行自动序列化/反序列化。默认情况下,它对其对象使用Java序列化(JdkSerializationRedisSerializer)。对于字符串密集型操作,请考虑使用专用的{StringRedisTemplate}。
    (2)中央方法是execute,它支持实现{ RedisCallback}接口的Redis访问代码。它提供{RedisConnection}处理,这样{ RedisCallback}实现就调用代码都不需要关心获取、关闭Redis连接或处理Connection生命周期异常。
    (3)一旦配置,该类是线程安全的。
    (4)在生成redisTemplate后,将由序列化器/反序列化器正确的对对象与二进制数据进行相互转换。
  • 先看一下redisTemplate默认的序列化器JdkSerializationRedisSerializer对数据进行序列化后的结果
    建立一个SpringBoot项目引入Redis倚赖:
  		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

在application.yml中配置redis相关属性(地址,端口,连接池等信息)

 spring:
   redis:
    port: 6379
    host: 127.0.0.1
    database: 0
    jedis:
      pool:
        max-active: 10
        max-idle: 5
        min-idle: 3
        max-wait: 1000D

接下里就可以进行操作redis,编写测试用例:

@SpringBootTest
class RedisTest {


    //springBoot默认的redisTemplate采用的是JDK的序列化
    @Autowired
    private RedisTemplate redisTemplate;


    @Test
    void redisTest1() {
        redisTemplate.opsForValue().set("k8", "v8");
        redisTemplate.opsForHash().put("h8", "hk8", "hv8");
        System.out.println(redisTemplate.opsForValue().get("k8"));
    }
}

测试后打开Redis Desktop Manager查看刚才测试的数据:
如图我们刚才写入的key和value都我们写入的值不一样
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200316140919446.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Nub3dEdWpj,size_16,color_FFFFFF,t_70
在这里插入图片描述
这就是redisTemplate默认采用JdkSerializationRedisSerializer序列化器序列化的结果,但我们从redis中取出的时候又会有JdkSerializationRedisSerializer进行反序列化,从而得到我们写入的数据。

  • RedisSerializer接口的子类:
    在这里插入图片描述
    其中FastJsonRedisSerializer与GenericFastJsonRedisSerializer是FastJson提供的子类。
  • RedisTemplate中序列化的属性
 defaultSerializer			默认序列化器					如果没有设置则使用JdkSerializationRedisSerializer
 keySerializer				Redis键序列化器				如果没有设置则使用默认序列化器
 valueSerializer			Redis值序列化器				如果没有设置则使用默认序列化器
 hashKeySerializer			Redis散列结构field序列化器		如果没有设置则使用默认序列化器
 hashValueSerializer		Redis值列结构value序列化器		如果没有设置则使用默认序列化器
 stringSerializer			Redis键序列化器				Redistemplate自动赋值为StringSerializer
  • 使用StringSerializer作为key序列化器,FastJsonRedisSerializer作为value序列化器
 @Configuration
public class MyRedisTemplateConfiguration {
    @Autowired
    private RedisTemplate redisTemplate;

    @PostConstruct
    public void init(){
        intiRedisTemplate();
    }

    private void intiRedisTemplate() {
        redisTemplate.setValueSerializer(new FastJsonRedisSerializer<>(Object.class));
        redisTemplate.setKeySerializer(new StringRedisSerializer());
    }
}
@SpringBootTest
class RedisTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
//    使用FastJsonRedisSerializer作为value的序列化器
    void redisTest4() {
        UserEntity user=new UserEntity();
        user.setId(100);
        user.setBirth(new Date());
        user.setName("张三");
        user.setNum("10");
        redisTemplate.opsForValue().set("user", user);
        System.out.println(redisTemplate.opsForValue().get("user"));
    }
}

结果:
在这里插入图片描述
在这里插入图片描述
同理使用GenericFastJsonRedisSerializer作为value序列化器
在这里插入图片描述
在这里插入图片描述
同理使用GenericJackson2JsonRedisSerializer作为value序列化器
在这里插入图片描述
在这里插入图片描述

  • 设置hashkey、hashValue的序列化器
private void intiRedisTemplate() {
        redisTemplate.setHashValueSerializer(new FastJsonRedisSerializer<>(Object.class));
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
    }
@Test
void redisTest5() {
        Map<String,Object> map=new HashMap<>();
        UserEntity user=new UserEntity();
        user.setId(100);
        user.setBirth(new Date());
        user.setName("张三");
        user.setNum("10");
        map.put("k1",true);
        map.put("k2","v2");
        map.put("k3",user);

        redisTemplate.opsForHash().putAll("h1",map);
        System.out.println(redisTemplate.opsForHash().get("h1","k1"));
    }

在这里插入图片描述
其他的几种序列化器就不一一测试了,具体的看实际的业务情况而定。


版权声明:本文为SnowDujc原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。