From e32773125fff47c9f17b88ca6f3a1f697c3cce42 Mon Sep 17 00:00:00 2001 From: liqiangqiang Date: Thu, 3 May 2018 10:54:47 +0800 Subject: [PATCH] =?UTF-8?q?WebFlux=20=E6=95=B4=E5=90=88=20Redis=20?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- springboot-webflux-7-redis-cache/pom.xml | 53 ++++++++++ .../org/spring/springboot/Application.java | 17 ++++ .../spring/springboot/dao/CityRepository.java | 10 ++ .../org/spring/springboot/domain/City.java | 77 +++++++++++++++ .../springboot/handler/CityHandler.java | 96 +++++++++++++++++++ .../controller/CityWebFluxController.java | 41 ++++++++ .../src/main/resources/application.properties | 16 ++++ 7 files changed, 310 insertions(+) create mode 100755 springboot-webflux-7-redis-cache/pom.xml create mode 100644 springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/Application.java create mode 100644 springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/dao/CityRepository.java create mode 100644 springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/domain/City.java create mode 100644 springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/handler/CityHandler.java create mode 100644 springboot-webflux-7-redis-cache/src/main/java/org/spring/springboot/webflux/controller/CityWebFluxController.java create mode 100644 springboot-webflux-7-redis-cache/src/main/resources/application.properties 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