自定义RedisTemplate

HeJin大约 1 分钟数据库技术Redis

对象没有序列化。

@Component
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {

    private String name;

    private Integer age;

}
image-20201230112006262
image-20201230112006262

对象序列化。

@Component
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User implements Serializable {

    private String name;

    private Integer age;

}
image-20201230112349552
image-20201230112349552

在企业中,所有的POJO类都会序列化。

image-20201230112952757
image-20201230112952757

自定义序列化配置类

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {

        /**
         * 为了开发方便,一般使用<String, Object>
         */
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        /**
         * 配置具体的序列化方式
         */
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(om.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // String的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value采用jackson的序列化方式
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value采用jackson的序列化方式
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();

        return template;
    }

}

测试

@Test
void test() throws JsonProcessingException {
    User user = new User("哔哩哔哩", 11);
    redisTemplate.opsForValue().set("user", user);
    System.out.println(redisTemplate.opsForValue().get("user"));
}

结果

User(name=哔哩哔哩, age=11)
2020-12-30 11:49:30.335  INFO 2856 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

Process finished with exit code 0

查看Redis命令行

127.0.0.1:6379> keys *
1) "user"
127.0.0.1:6379> get user
"[\"com.kuang.pojo.User\",{\"name\":\"\xe5\x93\x94\xe5\x93\xa9\xe5\x93\x94\xe5\x93\xa9\",\"age\":11}]"
127.0.0.1:6379>

在企业开发中,80%的情况下,都不会使用这种原生的方式去编写代码。RedisUtils。

image-20201230133052851
image-20201230133052851

所有的Redis操作,其实对于Java开发人员来说,是十分简单的。更重要的是去理解Redis的思想和每一种数据结构用处和作用场景。