簡介
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,并實作了基本的資料增删改查操作。在實際開發中,還需考慮性能優化、緩存穿透等問題。但是,這些問題不屬于本文的讨論範圍。希望該文章對您有所幫助。