Redis 实验

实验目标

熟悉通过 Java 代码来控制 Redis 的流程

需求描述

请提供一个后端接口,用于实现 JSON 对象的 CRUD,该 JSON 对象存在生命周期,一旦过期则直接抛弃(视作不存在该对象)

实验知识点
  • 控制 Redis 进行对象的增删改查
  • 设置 Redis 的过期策略

实验实现

项目结构

  • config
    • RedisConfig
  • controller
    • RedisController
  • entity
    • Product
  • Application

对象设计

  • Product
    • id
    • name
    • desc

注意事项:必须实现自 Serializable 接口,否则即使配置 Redis 的序列化工具,也无法实现序列化。

@Data
public class Product implements Serializable {
    private long id;
    private String name;
    private String desc;
}

Redis 配置

通过 @Configuration 配置
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Product> redisTemplate(@Qualifier("jedisConnectionFactory") JedisConnectionFactory jedisConnectionFactory) {
        // 声明 RedisTemplate
        RedisTemplate<String, Product> redisTemplate = new RedisTemplate<>();
        // 设置 ConnectionFactory
        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        // 设置 Key 的序列化工具
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // 设置 Value 的序列化工具
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    @Bean
    @Primary
    public JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.setHostName("localhost");
        jedisConnectionFactory.setPort(6379);
        return jedisConnectionFactory;
    }
}
通过 @Component 配置

从 application.yaml 读取配置 By @Value

@Component
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private int redisPort;

    @Bean
    public RedisTemplate<String, String> redisTemplate() {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        return redisTemplate;
    }

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(redisHost, redisPort);
        return new JedisConnectionFactory(configuration);
    }
}

接口设计

  • RedisController

    • add

    • delete

    • update

    • selectById

    • selectAll

@RestController
@RequestMapping("/")
public class RedisController {

    @Autowired
    private RedisTemplate<String, Product> redisTemplate;

    @PostMapping("/add")
    ResponseEntity<Product> addProduct(@RequestBody Product product) {
        System.out.println("addProduct");
        redisTemplate.opsForValue().set("product:" + product.getId(), product, Duration.ofSeconds(30));
        redisTemplate.expire("product:" + product.getId(), Duration.ofSeconds(10));
        // return new ResponseEntity<>(product, HttpStatus.OK); // 复杂的等效写法
        return ResponseEntity.ok(product);
    }

    @PostMapping("/update")
    public ResponseEntity<Product> updateProduct(@RequestBody Product product) {
        System.out.println("updateProduct");
        String key = "product:" + product.getId();
        if (Boolean.TRUE.equals(redisTemplate.hasKey(key))) {
            redisTemplate.opsForValue().set(key, product);
            return ResponseEntity.ok(product);
        } else {
            return ResponseEntity.notFound().build();
        }
    }

    @PostMapping("/delete")
    public ResponseEntity<String> deleteProduct(@RequestParam Long id) {
        System.out.println("deleteProduct");
        String key = "product:" + id;
        if (Boolean.TRUE.equals(redisTemplate.delete(key))) {
            return ResponseEntity.ok("Product with ID: " + id + " deleted successfully");
        } else {
            return ResponseEntity.notFound().build();
        }
    }

    @GetMapping("/selectById")
    public ResponseEntity<Product> selectProductById(@RequestParam Long id) {
        System.out.println("selectProductById");
        String key = "product:" + id;
        Product product = redisTemplate.opsForValue().get(key);
        if (product != null) {
            return ResponseEntity.ok(product);
        } else {
            return ResponseEntity.notFound().build();
        }
    }

    @GetMapping("/selectAll")
    public ResponseEntity<List<Product>> selectAllProducts() {
        System.out.println("selectAllProducts");
        Set<String> keys = redisTemplate.keys("product:*");
        List<Product> products = new ArrayList<>();
        for (String key : keys) {
            Product product = redisTemplate.opsForValue().get(key);
            products.add(product);
        }
        return ResponseEntity.ok(products);
    }

}

测试流程

  • selectAll
  • add
  • selectAll
  • selectById
  • update
  • selectAll
  • selectById
  • delete
  • selectAll
  • selectById

测试数据

{
  "id": 1,
  "name": "Sample Product",
  "desc": "This is a sample product description"
}
{
  "id": 2,
  "name": "Sample Product",
  "desc": "This is a sample product description"
}
posted @ 2024-03-18 17:21  Ba11ooner  阅读(3)  评论(0编辑  收藏  举报