目录
🍖6. StringRedisTemplate 解决存储对象的内存开销🍖
🥞1. 项目源码🥞
链接: https://pan.baidu.com/s/1iv2_vqLuLkJ-MhSw6VMMHw
提取码: m7cw
🍎2. Maven依赖🍎
<!--redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--连接池-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
🌭3. RedisTemplate入门使用🌭
这里先用单元测试带大家简单入门一下, redisTemplate写入数据和读取数据
代码 :
@SpringBootTest
class RedisDemoApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void testString() {
// 写入一条String数据
redisTemplate.opsForValue().set("name", "张三");
// 获取string数据
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
}
输出结果 :
但是回到我们的图形化客户端后发现, 数据的并不是我们想象的那样
这是因为spring.data.redis可以接受任何类型的对象, 最后转换成redis可以处理的字节, 所以存进去name, 张三, 都以Java对象的形式存储, 所以我们接下来要解决redis的序列化问题
🍔4.SpringDataRedis序列化🍔
代码 :
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
System.out.println("开始redis序列化.....");
//创建RedisTempLate对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
//设置连接工厂
template.setConnectionFactory(connectionFactory);
//创建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//设置Key的序列化(UTF_8格式)
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
//设置value的序列化
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
//返回
return template;
}
}
序列化后的输出结果
🍟5.SpringDataRedis返序列化🍟
这次采用存储对象, 并通过反序列化直接接受对象的参数
代码 :
@Test
void testSaveUser() {
//写入数据
redisTemplate.opsForValue().set("user:100", new User("李四", 28));
//获取数据(采用对象接受,也就是反序列化)
User user = (User) redisTemplate.opsForValue().get("user:100");
System.out.println("反序列化结果 : >> " + user);
}
输出结果 :
可以看出, 存储的值也是JSON格式
最后控制台的输出, 也是对象的形式去展示, 这是因为JSON值当中包含了一个class的属性, 并读取到了User类的名称
🍖6. StringRedisTemplate 解决存储对象的内存开销🍖
在redis中存储了"@class": "redis.pojo.User",存储了User字节码 带来的问题就是占用了内存开销
这里我们采用StringRedisTemplate, 采用String的序列化策略来解决性能开销问题
代码 :
private static final ObjectMapper MAPPER = new ObjectMapper();
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void stringRedisTemplateTest() throws JsonProcessingException {
//创建对象
User user = new User("张大仙", 32);
//手动序列化
String json = MAPPER.writeValueAsString(user);
//写入数据
stringRedisTemplate.opsForValue().set("user:200", json);
//获取数据
String userJson = stringRedisTemplate.opsForValue().get("user:200");
//手动反序列化
User user1 = MAPPER.readValue(userJson, User.class);
System.out.println("user1 = " + user1);
}
输出结果 :