Java实现自定义RedisTemplate

2,782 阅读3分钟

这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

hello,你好呀,我是灰小猿,一个超会写bug的程序猿!

平常我们在进行企业级项目开发使用Redis的时候,都会用到自定义的RedisTemplate,今天我们就来讲一下如何实现这一操作。

自定义RedisTemplate

自定义redisTemplate是在日常开发中经常要用到的一项操作,我们先来科普一点,Redis在存储数据的时候,底层默认使用的是JBK的方式进行序列化的,而这种方式,往往会将我们存储的非string类型的数据转义成一堆乱码,不利于实际的开发。

原始序列化方式测试

我们以一个实例来分析一下:

建立一个User类:

@AllArgsConstructor
@NoArgsConstructor
@Data
public class User implements Serializable {
    private String name;
    private int age;
}

使用redisTemplate类来输入一个user类型的键值对,并获取输入的值:

    @Autowired
    private RedisTemplate redisTemplate;   

    @Test
    public void redisTest08() {
        User user = new User("灰小猿", 5);
        redisTemplate.opsForValue().set("user", user);
        System.out.println("获取到的数值:");
        System.out.println(redisTemplate.opsForValue().get("user"));
    }

执行结果为:

获取到的数值:
User(name=灰小猿, age=5)

我们可以看到现在Redis是以默认的JBK的方式进行序列化的。得到的结果如上。

但是现在的项目更多的是采用的前后端分离的方式进行的,数据的传输一般都是以JSON的形式,尤其是对象的传输,

原因是:JSON 语法格式简单、层次结构清晰、并且在数据交换方面,JSON 所使用的字符要比 XML 少得多,可以大大得节约传输数据所占用的带宽。

所以对于Redis中的数据,在实际开发中,我们一般也会将其存储为JSON的形式,这个时候就需要我们通过自定义redisTemplate的方式将Redis默认的序列化方式改为JSON的形式,

自定义redisTemplate的方法

自定义redisTemplate的方法是:新建一个配置类RedisConfig,在其中注入一个Bean,并实现自定义的序列化方法。完整的自定义配置类如下:这个一般是企业开发的固定模板,作用是将Redis默认的序列化方式改为JSON的方式。下面的这个配置类,在开发中可以直接拿过来用即可!

/**
 * 自定义redisTemplate
 * 解决实现序列化
 *
 * @author YunGang.Guo
 * @date 2021/12/27 14:45
 **/
@Configuration
public class RedisConfig {

    /**
     * 编写自己的redisTemplate
     *
     * @param factory
     * @return
     */
    @Bean("redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
//      为了开发方便,一般都使用<String, Object>类型
        RedisTemplate<String, Object> template = new RedisTemplate();
//      连接工厂
        template.setConnectionFactory(factory);

//        序列化配置
        FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
//        value值的序列化采用FastJsonRedisSerializer
        template.setValueSerializer(fastJsonRedisSerializer);
//        hash值的序列化采用FastJsonRedisSerializer的方式
        template.setHashValueSerializer(fastJsonRedisSerializer);

//        key的序列化采用StringRedisSerializer
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);
//        hash的key的序列化采用StringRedisSerializer的方式
        template.setHashKeySerializer(stringRedisSerializer);

        return template;
    }
}

完成自定义配置类之后,我们再来执行上面的测试方法:

    @Autowired
    private RedisTemplate redisTemplate;   

    @Test
    public void redisTest08() {
        User user = new User("灰小猿", 5);
        redisTemplate.opsForValue().set("user", user);
        System.out.println("获取到的数值:");
        System.out.println(redisTemplate.opsForValue().get("user"));
    }

得到的运行结果为:

获取到的数值:
{"name":"灰小猿","age":5}

可以发现明显与默认的存储方法不同,现在我们存储在Redis中的对象,就会自动以JSON的方式进行序列化并存储啦!

我是灰小猿,我们下期见!