RedisTemplate 是SDR 提供的操作Redis 的模板类, 默认对key和value均使用jdk序列化方式, 但是笔者并不经常使用jdk 序列化方式也不推荐这种序列化方式,笔者更推荐使用json序列化方式或自定义序列化方式。除了使用SDR 默认提供的RedisTemplate 也可以自定义RedisTemplate.
1. RedisTemplate
1.1 SDR 默认注册RedisTemplate 实例
SDR 在应用启动时,会自动向spring 容器中注入一个RedisTemplate 实例和一个StringRedisTemplate 实例, 注册配置在配置类RedisAutoConfiguration 中定义的.
@Configuration
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
public RedisAutoConfiguration() {
}
@Bean
@ConditionalOnMissingBean(name = {"redisTemplate"})
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
1.2 自定义RedisTemplate 实例
- 新建一RedisConfig 配置类, 专门用于配置Redis 相关配置
- 自定义注册一RedisTemplate,beanName 命名为 gzipRedisTemplate
- 自定义RedisTemplate的序列化方式,笔者对key采用String序列化方式,对value采用自定义gzip压缩json串的序列化方式
- 需要注意的是,hash类型的key和value需要单独设置序列化策略.
@Configuration
public class RedisConfig {
@Bean("gzipRedisTemplate")
public RedisTemplate<Object, Object> gzipRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException{
RedisTemplate<Object,Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GzipJsonSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GzipJsonSerializer());
return template;
}
}
1.3 获取RedisTemplate 实例
获取RedisTemplate时需要注意获取方式, 笔者推荐使用beanName 来获取RedisTemplate实例
// 获取的是RedisTemplate对象
@Autowired
private RedisTemplate redisTemplate;
// 获取的是StringRedisTemplate 对象
@Autowired
private StringRedisTemplate stringRedisTemplate;
// 获取的是StringRedisTemplate 对象, 不推荐这种方式, 容易混淆.
@Autowired
private RedisTemplate<String, String> redisTemplate2;
2. RedisTemplate 存储测试
- RedisTemplate 采用jdk序列化方式序列化key和value, 所以可以存储任意类型的key和value
2.1 测试用例
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test_RedisTemplate {
@Autowired
private RedisTemplate redisTemplate;
private String hostKey = "host";
private String userKey = "user";
@Test
public void test_set(){
// 删除key
redisTemplate.delete(hostKey);
redisTemplate.delete(userKey);
// 设置key-value
ValueOperations ops = redisTemplate.opsForValue();
ops.set(hostKey, "127.0.0.1");
ops.set(userKey, new UserPO("zhangsan", "123456"));
}
@Test
public void test_get(){
ValueOperations ops = redisTemplate.opsForValue();
String host = (String) ops.get(hostKey);
System.out.println(host);
UserPO userPO = (UserPO) ops.get(userKey);
System.out.println(userPO);
}
}
2.2 查看redis中存储格式
- 通过redis-cli 命令查看使用jdk序列化方式, 在redis中的存储方式. 发现key 和value 都进行了jdk序列化.
- redis中实际存储的时二进制, redis-cli 命令会将二进制转换为string 展现在终端, 但是也足以说明问题
# 获取所有的key
127.0.0.1:6379> keys *
1) "\xac\xed\x00\x05t\x00\x04host"
2) "\xac\xed\x00\x05t\x00\x04user"
# 获取key对应的value
127.0.0.1:6379> get "\xac\xed\x00\x05t\x00\x04host"
"\xac\xed\x00\x05t\x00\t127.0.0.1"
127.0.0.1:6379> get "\xac\xed\x00\x05t\x00\x04user"
"\xac\xed\x00\x05sr\x00\x1eorg.zongf.learn.sdr.l01.UserPOj\xde\xd7\xfa\xd2\xf9\xcaw\x02\x00\x03L\x00\x03aget\x00\x13Ljava/lang/Integer;L\x00\bpasswordt\x00\x12Ljava/lang/String;L\x00\busernameq\x00~\x00\x02xppt\x00\x06123456t\x00\bzhangsan"