一、定义一个配置类,自定义RedisTemplate的序列化方式
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
// 创建RedisTemplate对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 设置连接工厂
template.setConnectionFactory(connectionFactory);
// 创建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer =
new GenericJackson2JsonRedisSerializer();
StringRedisSerializer stringRedisSerializer =
new StringRedisSerializer();
// 设置Key的序列化
template.setKeySerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
// 设置Value的序列化
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
// 返回
return template;
}
}
测试类进行测试
@SpringBootTest
class RedisDemoApplicationTests {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Test
void testString() {
// 写入一条String数据
redisTemplate.opsForValue().set("name", "虎哥");
// 获取string数据
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
@Test
void testObject() {
User user = new User();
user.setName("何雨泊");
user.setTel(110);
redisTemplate.opsForValue().set("user",user);
System.out.println("name = " + user);
}
}
测试存入字符串
测试存入对象
对象类:
测试结果如下,能将Java对象自动的序列化为JSON字符串,并且查询时能自动把JSON反序列化为Java对象。
不过,其中记录了序列化时对应的class名称,目的是为了查询时实现自动反序列化。这会带来额外的内存开销。
二、继续优化
这个问题的解决我们可以采用手动序列化的方式,换句话说,就是不借助默认的序列化器,而是我们自己来控制序列化的动作,同时,我们只采用String的序列化器,这样,在存储value时,我们就不需要在内存中就不用多存储数据,从而节约我们的内存空间。
这种用法比较普遍,因此SpringDataRedis就提供了RedisTemplate的子类:StringRedisTemplate,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的序列化方式的步骤,而是直接使用:
@SpringBootTest
public class RedisStringTests {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void testString() {
// 写入一条String数据
stringRedisTemplate.opsForValue().set("stringRedisTemplate:name", "虎哥");
// 获取string数据
Object name = stringRedisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
@Test
void testObject() throws JsonProcessingException{
// 创建
ObjectMapper mapper = new ObjectMapper();
User user = new User();
user.setName("何雨泊");
user.setTel(110);
// 手动序列化
String json = mapper.writeValueAsString(user);
stringRedisTemplate.opsForValue().set("stringRedisTemplate:user",json);
String string = stringRedisTemplate.opsForValue().get("stringRedisTemplate:user");
// 手动反序列化
User user1 = mapper.readValue(string, User.class);
System.out.println("name = " + user1);
}
@Test
void testObject1() {
User user = new User();
user.setName("何雨泊");
user.setTel(110);
stringRedisTemplate.opsForValue().set("user", JSONUtil.toJsonStr(user));
String userjson = stringRedisTemplate.opsForValue().get("user");
User user1 = JSONUtil.toBean(userjson, User.class);
System.out.println("name = " + user1);
}
}
hutool库的依赖
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.17</version>
</dependency>
测试结果:
三、总结
RedisTemplate的两种序列化实践方案:
- 方案一(存在一定问题):
- 自定义RedisTemplate
- 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
- 方案二(对方案一进行优化):
- 使用StringRedisTemplate
- 写入Redis时,手动把对象序列化为JSON 或者 使用工具类JSONUtil进行序列化(推荐)
- 读取Redis时,手动把读取到的JSON反序列化为对象
到此这篇关于Springboot下RedisTemplate的两种序列化方式的文章就介绍到这了,更多相关Springboot RedisTemplate序列化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!