简介
Redis是一款开源的基于内存的数据存储系统,可以作为数据库、缓存和消息中间件等用途,具备高性能、高可靠、可扩展性等优点。Spring Boot是快速构建Spring应用程序的框架,本文介绍如何在Spring Boot中很容易地集成Redis,并实现基本的数据增删改查功能。
环境搭建
本文示例使用的环境为:JDK 1.8,Spring Boot 2.5.2,Redis 6.0.16。
首先需要安装Redis并启动Redis服务端进程。Redis官网提供了多种安装方式,这里以源码方式安装为例:
- 下载Redis源码包:https://redis.io/download
- 解压缩Redis源码包:tar -zxvf redis-x.x.x.tar.gz
- 进入Redis源码目录并编译:make
- 启动Redis服务端:src/redis-server
- 启动Redis客户端:src/redis-cli
Spring Boot整合Redis
在Spring Boot中,只需在pom.xml中添加Redis相关依赖即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
实现数据增删改查
(1)设置RedisTemplate
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK序列化方式)
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
//设置全局忽略未知属性
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//指定要序列化的域,_id表示所有属性都要被序列化
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//指定序列化输入的类型,如java.util.List<实体类>
objectMapper.activateDefaultTyping(new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT).init(JsonTypeInfo.Id.CLASS, null), ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
//使用StringRedisSerializer来序列化和反序列化redis的key值
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
//Hash类型同理:new Jackson2JsonRedisSerializer<>(Object.class)
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
(2)定义实体类User
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private String id;
private String name;
private Integer age;
}
(3)定义Repository层操作
@Repository
public class UserRepository {
private static final String USER_PREFIX = "user:";
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public void save(User user) {
redisTemplate.opsForValue().set(USER_PREFIX + user.getId(), user);
}
public User findById(String id) {
return (User) redisTemplate.opsForValue().get(USER_PREFIX + id);
}
public void delete(String id) {
redisTemplate.delete(USER_PREFIX + id);
}
public void update(User user) {
save(user);
}
public List<User> findAll() {
Set<String> keys = redisTemplate.keys(USER_PREFIX + "*");
List<Object> objects = redisTemplate.opsForValue().multiGet(keys);
return objects.stream().map(o -> (User) o).collect(Collectors.toList());
}
}
(4)定义Controller层接口
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserRepository userRepository;
@PostMapping("")
public void save(User user) {
userRepository.save(user);
}
@GetMapping("/{id}")
public User findById(@PathVariable String id) {
return userRepository.findById(id);
}
@DeleteMapping("/{id}")
public void delete(@PathVariable String id) {
userRepository.delete(id);
}
@PutMapping("")
public void update(User user) {
userRepository.update(user);
}
@GetMapping("")
public List<User> findAll() {
return userRepository.findAll();
}
}
结束语
通过以上步骤,我们已经成功地在Spring Boot中集成了Redis,并实现了基本的数据增删改查操作。在实际开发中,还需考虑性能优化、缓存穿透等问题。但是,这些问题不属于本文的讨论范围。希望该文章对您有所帮助。