基于业务定制RedisTemplate对象【序列化高级制定】

      我们知道系统中的RedisTemplate默认采用的是JDK的序列化机制,假如我们不希望使用默认的JDK方式序列化,可以对RedisTemplate对象进行定制,指定自己的序列化方式,例如:

参悟序列化高级制定

目录

1-简单定制RedisTemplate对象

Pojo对象

config对Bean配置

Test测试简单制定效果

2-高级定制RedisTemplate对象

Pojo对象

config对Bean配置

Test测试高级制定效果


1-简单定制RedisTemplate对象

Pojo对象

package com.jt.Pojo;

import lombok.Data;

import java.io.Serializable;
@Data 
public class Pojo implements Serializable {

    private static final long serialVersionUID = 8397600816070129636L;
    private Long id;
    private String title;
    private String content;
    private String remark;

}

config对Bean配置

package com.jt.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.RedisSerializer;


@Configuration
public class RedisConfig {
    /**
     * 基于业务定制RedisTemplate对象
     * @param connectionFactory
     * @return
     */


    @Bean
    public RedisTemplate<Object, Object> simpleRedisTemplate(
            RedisConnectionFactory connectionFactory){
        RedisTemplate<Object, Object> redisTemplate=
                new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        //设置序列化方式
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        redisTemplate.setHashValueSerializer(RedisSerializer.string());
        //redisTemplate.setValueSerializer(RedisSerializer.java());
        redisTemplate.setValueSerializer(RedisSerializer.json());
        return redisTemplate;
    }//参考renren.io源代码




}

Test测试简单制定效果

package com.jt;

import com.jt.Pojo.Pojo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

@SpringBootTest
public class RedisConfigTests {

    @Autowired
    private RedisTemplate simpleRedisTemplate;

    @Test
    void testBlogOper1(){
        Pojo pojo = new Pojo();
        pojo.setId(100L);
        pojo.setContent("Terad=sin");
        pojo.setTitle("COnHash");

        ValueOperations valueOperations = simpleRedisTemplate.opsForValue();
        valueOperations.set("S25",pojo );

        Object s25 = valueOperations.get("S25");
        System.out.println("Object 型:"+s25);
        //自定义  序列化 JSON
         Pojo pojo1=(Pojo)   valueOperations.get("S25");
        System.out.println("Pojo对象 :"+pojo1);


    }

}

2-高级定制RedisTemplate对象

Pojo对象

package com.jt.Pojo;

import lombok.Data;

import java.io.Serializable;
@Data 
public class Pojo implements Serializable {

    private static final long serialVersionUID = 8397600816070129636L;
    private Long id;
    private String title;
    private String content;
    private String remark;

}

config对Bean配置

package com.jt.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.RedisSerializer;
import org.springframework.stereotype.Component;

@Configuration
public class RedisConfig {
    /**
     * 基于业务定制RedisTemplate对象
     * @param connectionFactory
     * @return
     */

   

    public RedisSerializer<?> redisSerializer(){
        //1.定义序列化对象,并指定可以对哪些类型对象进行序列化
        Jackson2JsonRedisSerializer serializer=
                new Jackson2JsonRedisSerializer(Object.class);
        //2.构建对象映射对象(将对象转换为json或者将json转换对象)
        ObjectMapper objectMapper=new ObjectMapper();
        //2.1设置序列化时的可见方法
        objectMapper.setVisibility(PropertyAccessor.GETTER,//序列化时只调用get方法
                JsonAutoDetect.Visibility.ANY);//get方法的访问修饰符可以任意
        //2.2序列化时值的规则定义(例如值为null还是否要序列化)
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        //2.3激活类型存储(这个一般在反序列化时有用,否则反序列化时数据默认存储在LinkedHashMap中)
        objectMapper.activateDefaultTyping(
                objectMapper.getPolymorphicTypeValidator(),//开启多态校验
                ObjectMapper.DefaultTyping.NON_FINAL,//序列化的来不能使用final修饰
                JsonTypeInfo.As.PROPERTY);//将类型以属性形式存储到json串中
        //2.4设置对象映射对象
        serializer.setObjectMapper(objectMapper);

        return serializer;
    }

@Bean
    public RedisTemplate<Object, Object> redisTemplate(
            RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> redisTemplate =
                new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        //设置序列化方式
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        redisTemplate.setHashValueSerializer(redisSerializer());
        redisTemplate.setValueSerializer(redisSerializer());
        //建议更新了序列化方式后,执行一下如下方法
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }




}

Test测试高级制定效果

package com.jt;

import com.jt.Pojo.Pojo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

@SpringBootTest
public class RedisConfigTests {


    @Autowired
    private RedisTemplate redisTemplate;


    @Test
    void testBlogOper2(){
        Pojo blog1=new Pojo();
        blog1.setId(100L);
        blog1.setTitle("Title-AA");
        blog1.setContent("Content-AAA");
        blog1.setRemark("Remark-AAA");
        ValueOperations valueOperations =
                redisTemplate.opsForValue();
        valueOperations.set("blog:100", blog1);
        Pojo blog2=(Pojo)valueOperations.get("blog:100");
        System.out.println(blog2);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值