天天看點

快速實作資料增删改查:Spring Boot內建Redis實戰

作者:勇往直前的努力E8QY

簡介

Redis是一款開源的基于記憶體的資料存儲系統,可以作為資料庫、緩存和消息中間件等用途,具備高性能、高可靠、可擴充性等優點。Spring Boot是快速建構Spring應用程式的架構,本文介紹如何在Spring Boot中很容易地內建Redis,并實作基本的資料增删改查功能。

環境搭建

本文示例使用的環境為:JDK 1.8,Spring Boot 2.5.2,Redis 6.0.16。

首先需要安裝Redis并啟動Redis服務端程序。Redis官網提供了多種安裝方式,這裡以源碼方式安裝為例:

  1. 下載下傳Redis源碼包:https://redis.io/download
  2. 解壓縮Redis源碼包:tar -zxvf redis-x.x.x.tar.gz
  3. 進入Redis源碼目錄并編譯:make
  4. 啟動Redis服務端:src/redis-server
  5. 啟動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,并實作了基本的資料增删改查操作。在實際開發中,還需考慮性能優化、緩存穿透等問題。但是,這些問題不屬于本文的讨論範圍。希望該文章對您有所幫助。

繼續閱讀