- 首先看一下RedisTemplate的源码注释:
在这里主要说4件:
(1)在给定对象和Redis存储中的基础二进制数据之间执行自动序列化/反序列化。默认情况下,它对其对象使用Java序列化(JdkSerializationRedisSerializer)。对于字符串密集型操作,请考虑使用专用的{StringRedisTemplate}。
(2)中央方法是execute,它支持实现{ RedisCallback}接口的Redis访问代码。它提供{RedisConnection}处理,这样{ RedisCallback}实现就调用代码都不需要关心获取、关闭Redis连接或处理Connection生命周期异常。
(3)一旦配置,该类是线程安全的。
(4)在生成redisTemplate后,将由序列化器/反序列化器正确的对对象与二进制数据进行相互转换。 - 先看一下redisTemplate默认的序列化器JdkSerializationRedisSerializer对数据进行序列化后的结果
建立一个SpringBoot项目引入Redis倚赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
在application.yml中配置redis相关属性(地址,端口,连接池等信息)
spring:
redis:
port: 6379
host: 127.0.0.1
database: 0
jedis:
pool:
max-active: 10
max-idle: 5
min-idle: 3
max-wait: 1000D
接下里就可以进行操作redis,编写测试用例:
@SpringBootTest
class RedisTest {
//springBoot默认的redisTemplate采用的是JDK的序列化
@Autowired
private RedisTemplate redisTemplate;
@Test
void redisTest1() {
redisTemplate.opsForValue().set("k8", "v8");
redisTemplate.opsForHash().put("h8", "hk8", "hv8");
System.out.println(redisTemplate.opsForValue().get("k8"));
}
}
测试后打开Redis Desktop Manager查看刚才测试的数据:
如图我们刚才写入的key和value都我们写入的值不一样
这就是redisTemplate默认采用JdkSerializationRedisSerializer序列化器序列化的结果,但我们从redis中取出的时候又会有JdkSerializationRedisSerializer进行反序列化,从而得到我们写入的数据。
- RedisSerializer接口的子类:
其中FastJsonRedisSerializer与GenericFastJsonRedisSerializer是FastJson提供的子类。 - RedisTemplate中序列化的属性
defaultSerializer 默认序列化器 如果没有设置则使用JdkSerializationRedisSerializer
keySerializer Redis键序列化器 如果没有设置则使用默认序列化器
valueSerializer Redis值序列化器 如果没有设置则使用默认序列化器
hashKeySerializer Redis散列结构field序列化器 如果没有设置则使用默认序列化器
hashValueSerializer Redis值列结构value序列化器 如果没有设置则使用默认序列化器
stringSerializer Redis键序列化器 Redistemplate自动赋值为StringSerializer
- 使用StringSerializer作为key序列化器,FastJsonRedisSerializer作为value序列化器
@Configuration
public class MyRedisTemplateConfiguration {
@Autowired
private RedisTemplate redisTemplate;
@PostConstruct
public void init(){
intiRedisTemplate();
}
private void intiRedisTemplate() {
redisTemplate.setValueSerializer(new FastJsonRedisSerializer<>(Object.class));
redisTemplate.setKeySerializer(new StringRedisSerializer());
}
}
@SpringBootTest
class RedisTest {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
// 使用FastJsonRedisSerializer作为value的序列化器
void redisTest4() {
UserEntity user=new UserEntity();
user.setId(100);
user.setBirth(new Date());
user.setName("张三");
user.setNum("10");
redisTemplate.opsForValue().set("user", user);
System.out.println(redisTemplate.opsForValue().get("user"));
}
}
结果:
同理使用GenericFastJsonRedisSerializer作为value序列化器
同理使用GenericJackson2JsonRedisSerializer作为value序列化器
- 设置hashkey、hashValue的序列化器
private void intiRedisTemplate() {
redisTemplate.setHashValueSerializer(new FastJsonRedisSerializer<>(Object.class));
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setKeySerializer(new StringRedisSerializer());
}
@Test
void redisTest5() {
Map<String,Object> map=new HashMap<>();
UserEntity user=new UserEntity();
user.setId(100);
user.setBirth(new Date());
user.setName("张三");
user.setNum("10");
map.put("k1",true);
map.put("k2","v2");
map.put("k3",user);
redisTemplate.opsForHash().putAll("h1",map);
System.out.println(redisTemplate.opsForHash().get("h1","k1"));
}
其他的几种序列化器就不一一测试了,具体的看实际的业务情况而定。
版权声明:本文为SnowDujc原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。