GitHub:SpringBootDemo
Gitee:SpringBootDemo
微信公众号:
0 开发环境
- JDK:1.8
- Spring Boot:2.7.18
1 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2 配置连接
spring:
redis:
host: 127.0.0.1
port: 6379
代码中默认host是localhost,默认port是6379
3 测试
3.1 新建启动类
@SpringBootApplication
public class RedisApplication {
public static void main(String[] args) {
SpringApplication.run(RedisApplication.class, args);
}
}
3.2 新建测试类
@SpringBootTest(classes = RedisApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class RedisApplicationTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void contextLoads() {
redisTemplate.opsForValue().set("test_key", "test_value");
System.out.println(redisTemplate.opsForValue().get("test_key"));
}
}
3.3 测试
启动测试类,成功保存并取出打印
启动Redis客户端,查看数据,保存成功。
这里数据有乱码,是因为默认的序列化方式是JDK序列化,后面我们可以使用Json来序列化解决该问题。
4 对象序列化
在开发中,所有的对象存储到Redis中都需序列化
4.1 新建UserModel
/**
* 未序列化,错误示范
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserModel {
private int id;
private String name;
}
4.2 调整测试类
@Test
public void contextLoadsUser() {
UserModel user = new UserModel(1, "测试姓名");
redisTemplate.opsForValue().set("test_user", user);
System.out.println(redisTemplate.opsForValue().get("test_user"));
}
4.3 测试
启动测试类,程序报错
4.4 调整UserModel
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserModel implements Serializable {
private int id;
private String name;
}
4.5 测试
再次启动测试类,数据成功保存并取出打印
这样,我们就能保存字符串和Java对象了。
然后针对前面所说的数据乱码问题,我们可以自定义RedisTemplate
5 自定义RedisTemplate
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
//JSON序列化配置
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
//String序列化配置
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
//hash的key采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
//value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
//hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
//开启事务
template.setEnableTransactionSupport(true);
return template;
}
}
6 测试
6.1 调整测试类
@SpringBootTest(classes = RedisApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class RedisApplicationTest {