Spring Data Redis的序列化

861 阅读2分钟

简介

Redis作为非关系型数据库,因为其高性能并发读写的特点而得到广泛的应用。 Spring作为Java应用框架,提供了一个轻量级的容器和非侵入性编程模型。 Spring Data Redis(SDR)框架通过Spring出色的基础架构支持消除了与存储库交互所需的冗余任务和样板代码,从而简化了编写使用Redis键值存储库的Spring应用程序的过程。

Redis的数据类型 vs 存入Redis的数据的数据类型

  • Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合),这里的数据类型指的是Redis如何存储数据,是指存储的方式。
  • 同时,在Redis中存入的数据有有自己的数据类型,如果将Java引用的数据存入Redis,存入的数据类型可以是Long、List、String等等。不论是什么数据类型,最终在Redis中都是存储为字节。将各种数据类型转化为字节的过程就是序列化

RedisTemplate及其序列化

RedisTemplate为Redis交互提供了高级抽象,用户只需要处理连接管理和序列化,无需处理其它细节,接受和返回二进制值(字节数组)等底层方法由RedisConnection负责。在Spring应用中使用RedisTemplate的方式为

  @Autowired
  private RedisTemplate<String, Long> template;

Spring Data Redis 默认使用JdkSerializationRedisSerializer作为其序列化工具

// RedisTemplate.java

	if (defaultSerializer == null) {
		defaultSerializer = new JdkSerializationRedisSerializer(
				classLoader != null ? classLoader : this.getClass().getClassLoader());
	}

StringRedisTemplate使用的注意事项

由于Redis中存储的键和值通常是java.lang.String,因此Redis模块提供了RedisConnectionRedisTemplate的两个扩展,分别是StringRedisConnectionStringRedisTemplate,其使用的序列化工具为StringRedisSerializer,这意味着存储的键和值是人类可读的。

StringRedisTemplate的注入和普通RedisTemplate的注入方式相同:

  @Autowired
  private StringRedisTemplate redisTemplate;

但实际上,StringRedisTemplate的还有一种更方便的注入方式。Spring自带的RedisAutoConfiguration中配置了,当没有自定义StringRedisTemplate Bean时,它会自动帮你注册一个该类型的Bean.

// RedisAutoConfiguration.java

		@Bean
		@ConditionalOnMissingBean(StringRedisTemplate.class)
		public StringRedisTemplate stringRedisTemplate(
				RedisConnectionFactory redisConnectionFactory)
				throws UnknownHostException {
			StringRedisTemplate template = new StringRedisTemplate();
			template.setConnectionFactory(redisConnectionFactory);
			return template;
		}

使用StringRedisTemplate的时候直接在代码中注入RedisTemplate<String, String>的RedisTemplate Bean,实际上StringRedisTemplate也继承自RedisTemplate<String, String>,Spring在自动装配Bean的时候会将自注册的Bean装配进来,这样的代码就省略了手动注册StringRedisTemplate的过程。

    @Autowired
    private RedisTemplate<String, String> redisTemplate;
// StringRedisTemplate.java

public class StringRedisTemplate extends RedisTemplate<String, String> {
    ...
}