diff --git a/springboot-webflux-7-redis-cache/pom.xml b/springboot-webflux-7-redis-cache/pom.xml
new file mode 100755
index 0000000..ddc1fdb
--- /dev/null
+++ b/springboot-webflux-7-redis-cache/pom.xml
@@ -0,0 +1,53 @@
+
+
+ 4.0.0
+
+ springboot
+ springboot-webflux-7-redis-cache
+ 0.0.1-SNAPSHOT
+ springboot-webflux-7-redis-cache :: Spring Boot WebFlux 整合 Redis 实现缓存
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.1.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-mongodb-reactive
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis-reactive
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
diff --git a/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/Application.java b/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/Application.java
new file mode 100644
index 0000000..c37d904
--- /dev/null
+++ b/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/Application.java
@@ -0,0 +1,17 @@
+package org.spring.springboot;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * Spring Boot 应用启动类
+ */
+// Spring Boot 应用的标识
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ // 程序启动入口
+ SpringApplication.run(Application.class, args);
+ }
+}
diff --git a/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/dao/CityRepository.java b/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/dao/CityRepository.java
new file mode 100644
index 0000000..83e4586
--- /dev/null
+++ b/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/dao/CityRepository.java
@@ -0,0 +1,10 @@
+package org.spring.springboot.dao;
+
+import org.spring.springboot.domain.City;
+import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CityRepository extends ReactiveMongoRepository {
+
+}
diff --git a/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/domain/City.java b/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/domain/City.java
new file mode 100644
index 0000000..a72b136
--- /dev/null
+++ b/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/domain/City.java
@@ -0,0 +1,77 @@
+package org.spring.springboot.domain;
+
+import org.springframework.data.annotation.Id;
+
+import java.io.Serializable;
+
+/**
+ * 城市实体类
+ *
+ */
+public class City implements Serializable {
+
+ private static final long serialVersionUID = -2081742442561524068L;
+
+ /**
+ * 城市编号
+ */
+ @Id
+ private Long id;
+
+ /**
+ * 省份编号
+ */
+ private Long provinceId;
+
+ /**
+ * 城市名称
+ */
+ private String cityName;
+
+ /**
+ * 描述
+ */
+ private String description;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getProvinceId() {
+ return provinceId;
+ }
+
+ public void setProvinceId(Long provinceId) {
+ this.provinceId = provinceId;
+ }
+
+ public String getCityName() {
+ return cityName;
+ }
+
+ public void setCityName(String cityName) {
+ this.cityName = cityName;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ @Override
+ public String toString() {
+ return "City{" +
+ "id=" + id +
+ ", provinceId=" + provinceId +
+ ", cityName='" + cityName + '\'' +
+ ", description='" + description + '\'' +
+ '}';
+ }
+}
diff --git a/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/handler/CityHandler.java b/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/handler/CityHandler.java
new file mode 100644
index 0000000..67980e1
--- /dev/null
+++ b/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/handler/CityHandler.java
@@ -0,0 +1,96 @@
+package org.spring.springboot.handler;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.spring.springboot.dao.CityRepository;
+import org.spring.springboot.domain.City;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+@Component
+public class CityHandler {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CityHandler.class);
+
+ @Autowired
+ private RedisTemplate redisTemplate;
+
+ private final CityRepository cityRepository;
+
+ @Autowired
+ public CityHandler(CityRepository cityRepository) {
+ this.cityRepository = cityRepository;
+ }
+
+ public Mono save(City city) {
+ return cityRepository.save(city);
+ }
+
+
+ public Mono findCityById(Long id) {
+
+ // 从缓存中获取城市信息
+ String key = "city_" + id;
+ ValueOperations operations = redisTemplate.opsForValue();
+
+ // 缓存存在
+ boolean hasKey = redisTemplate.hasKey(key);
+ if (hasKey) {
+ City city = operations.get(key);
+
+ LOGGER.info("CityHandler.findCityById() : 从缓存中获取了城市 >> " + city.toString());
+ return Mono.create(cityMonoSink -> cityMonoSink.success(city));
+ }
+
+ // 从 MongoDB 中获取城市信息
+ Mono cityMono = cityRepository.findById(id);
+
+ if (cityMono == null)
+ return cityMono;
+
+ // 插入缓存
+ cityMono.subscribe(cityObj -> {
+ operations.set(key, cityObj);
+ LOGGER.info("CityHandler.findCityById() : 城市插入缓存 >> " + cityObj.toString());
+ });
+
+ return cityMono;
+ }
+
+ public Flux findAllCity() {
+ return cityRepository.findAll().cache();
+ }
+
+ public Mono modifyCity(City city) {
+
+ // 缓存存在,删除缓存
+ String key = "city_" + city.getId();
+ boolean hasKey = redisTemplate.hasKey(key);
+ if (hasKey) {
+ redisTemplate.delete(key);
+
+ LOGGER.info("CityHandler.modifyCity() : 从缓存中删除城市 ID >> " + city.getId());
+ }
+
+ return cityRepository.save(city).cache();
+ }
+
+ public Mono deleteCity(Long id) {
+
+ // 缓存存在,删除缓存
+ String key = "city_" + id;
+ boolean hasKey = redisTemplate.hasKey(key);
+ if (hasKey) {
+ redisTemplate.delete(key);
+
+ LOGGER.info("CityHandler.deleteCity() : 从缓存中删除城市 ID >> " + id);
+ }
+
+ cityRepository.deleteById(id);
+ return Mono.create(cityMonoSink -> cityMonoSink.success(id));
+ }
+}
diff --git a/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/webflux/controller/CityWebFluxController.java b/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/webflux/controller/CityWebFluxController.java
new file mode 100644
index 0000000..3954e07
--- /dev/null
+++ b/springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/webflux/controller/CityWebFluxController.java
@@ -0,0 +1,41 @@
+package org.spring.springboot.webflux.controller;
+
+import org.spring.springboot.domain.City;
+import org.spring.springboot.handler.CityHandler;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+@RestController
+@RequestMapping(value = "/city")
+public class CityWebFluxController {
+
+ @Autowired
+ private CityHandler cityHandler;
+
+ @GetMapping(value = "/{id}")
+ public Mono findCityById(@PathVariable("id") Long id) {
+ return cityHandler.findCityById(id);
+ }
+
+ @GetMapping()
+ public Flux findAllCity() {
+ return cityHandler.findAllCity();
+ }
+
+ @PostMapping()
+ public Mono saveCity(@RequestBody City city) {
+ return cityHandler.save(city);
+ }
+
+ @PutMapping()
+ public Mono modifyCity(@RequestBody City city) {
+ return cityHandler.modifyCity(city);
+ }
+
+ @DeleteMapping(value = "/{id}")
+ public Mono deleteCity(@PathVariable("id") Long id) {
+ return cityHandler.deleteCity(id);
+ }
+}
diff --git a/springboot-webflux-7-redis-cache/src/main/resources/application.properties b/springboot-webflux-7-redis-cache/src/main/resources/application.properties
new file mode 100644
index 0000000..1761a7a
--- /dev/null
+++ b/springboot-webflux-7-redis-cache/src/main/resources/application.properties
@@ -0,0 +1,16 @@
+## Redis 配置
+## Redis服务器地址
+spring.redis.host=127.0.0.1
+## Redis服务器连接端口
+spring.redis.port=6379
+## Redis服务器连接密码(默认为空)
+spring.redis.password=
+# 连接超时时间(毫秒)
+spring.redis.timeout=5000
+
+## MongoDB
+spring.data.mongodb.host=localhost
+spring.data.mongodb.database=admin
+spring.data.mongodb.port=27017
+spring.data.mongodb.username=admin
+spring.data.mongodb.password=admin