SpringBootWebFlux学习笔记(六)--整合 Redis

需求

对城市(City)进行管理实现 CRUD 操作。

项目结构

├── pom.xml
├── src
│    └── main
│        ├── java
│        │     └── org
│        │         └── spring
│        │             └── springboot
│        │                 ├── Application.java
│        │                 ├── domain
│        │                 │    └── City.java
│        │                 └── webflux
│        │                     └── controller
│        │                         └── CityWebFluxController.java
│        └── resources
│            └── application.properties
└── target

项目详情

新增依赖

在 pom.xml 配置新的依赖:

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-webflux</artifactId>
	</dependency>

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>io.projectreactor</groupId>
		<artifactId>reactor-test</artifactId>
		<scope>test</scope>
	</dependency>
	<!--新增依赖-->
	<!-- Spring Boot 响应式 Redis 依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
    </dependency>
</dependencies>

配置 application.yaml

在 application.yaml 配置 MongoDB 连接配置和 thymeleaf 配置

spring:  
  application:  
    name: web-flux-demo
  redis:
	host: 127.0.0.1
	port: 6379
	timeout: 5000

对象

/**
 * 城市实体类
 *
 */
public class City implements Serializable {
	private static final long serialVersionUID = -1L;

    /**
     * 城市编号
     */
    @Id
    private Long id;

    /**
     * 省份编号
     */
    private Long provinceId;

    /**
     * 城市名称
     */
    private String cityName;

	// Getter and Setter
}
  • @Id 注解标记对应库表的主键或者唯一标识符。因为这个是我们的 DO,数据访问对象一一映射到数据存储。

控制器类

@RestController
@RequestMapping(value = "/city")
public class CityWebFluxController {

    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping(value = "/{id}")
    public Mono<City> findCityById(@PathVariable("id") Long id) {
        String key = "city_" + id;
        ValueOperations<String, City> operations = redisTemplate.opsForValue();
        boolean hasKey = redisTemplate.hasKey(key);
        City city = operations.get(key);

        if (!hasKey) {
            return Mono.create(monoSink -> monoSink.success(null));
        }
        return Mono.create(monoSink -> monoSink.success(city));
    }

    @PostMapping()
    public Mono<City> saveCity(@RequestBody City city) {
        String key = "city_" + city.getId();
        ValueOperations<String, City> operations = redisTemplate.opsForValue();
        operations.set(key, city, 60, TimeUnit.SECONDS);

        return Mono.create(monoSink -> monoSink.success(city));
    }

    @DeleteMapping(value = "/{id}")
    public Mono<Long> deleteCity(@PathVariable("id") Long id) {
        String key = "city_" + id;
        boolean hasKey = redisTemplate.hasKey(key);
        if (hasKey) {
            redisTemplate.delete(key);
        }
        return Mono.create(monoSink -> monoSink.success(id));
    }
}
  • 使用 @Autowired 注入 RedisTemplate 对象,RedisTemplate 封装了 RedisConnection,具有连接管理、序列化和各个操作等,还有针对 String 的支持对象 StringRedisTemplate。

启动运行项目

mvn clean install
mvn springboot:run

测试项目

新增城市信息:

POST http://127.0.0.1:8080/city
{
    "id" :1,
    "provinceId":3,
    "cityName":"广州"
}

查看城市信息:

GET http://127.0.0.1:8080/city/1

image

检查Redis 数据库内容

$ get city_1
#output
"\"@class\":\"com.example.web_flux_demo.City\",\"id\":1,\"provinceId\":3,\"cityName\":\"\xe5\xb9\xbf\xe5\xb7\x9e\"}"
posted @ 2024-10-25 21:17  Jacob-Chen  阅读(8)  评论(0)    收藏  举报