Redis基本操作及下載安裝包(Redis及可視化工具),都在我的上一篇文章:Redis基本知識及簡單操作,這里不再贅述
店鋪營業狀態修改功能
(1)需求分析與設計
(2)SpringDataRedisTest修改:
位置:sky-server/src/test/java/com/sky/SpringDataRedisTest.java
注意:把測試類的@SpringBootTest注解注釋掉
//@SpringBootTest //不注解的話,每次啟動項目都會重新運行一下的測試用例,導致測試時間過長
(3)RedisConfiguration創建
位置:sky-server/src/main/java/com/sky/config/RedisConfiguration.java
完整代碼:
package com.sky.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
@Slf4j
public class RedisConfiguration {@Bean//@Bean的作用是將方法的返回值注入到spring容器中,這里創建了一個RedisTemplate對象public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {log.info("初始化創建Redis模板對象...");// 創建RedisTemplate對象RedisTemplate redisTemplate = new RedisTemplate();// 設置連接工廠redisTemplate.setConnectionFactory(redisConnectionFactory);// 設置key和value的序列化方式,否則會Redis數據庫中key和value會出現亂碼問題redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new StringRedisSerializer());return redisTemplate;}
}
示意圖:
(4)配置文件完善:
1、添加Redis服務配置,Redis數據庫沒有設置密碼的需要注釋掉或刪掉“password”字段
2、Redis密碼查看方式
查看有沒有設置密碼的方式如下,找到你的Redis安裝目錄
打開redis.windows.conf文件,Ctrl+F鍵打開查找功能,輸入“pass ”,注意后面跟一個空格,即可看到有沒有設置密碼
3、圖中密碼已注釋,表示沒有設置密碼,取消注釋則“foobared”為數據庫密碼,可更改
1、application.yml完善
位置:sky-server/src/main/resources/application.yml
添加的代碼為:
spring:redis:host: ${sky.redis.host}port: ${sky.redis.port}#redis密碼,如果沒有則不用設置
#??? password: ${sky.redis.password}#redis數據庫索引(默認為0)database: ${sky.redis.database}
#??? timeout: 10000? #連接超時時間(毫秒)
#??? lettuce:?? #Lettuce客戶端配置
#????? pool: #連接池配置
#??????? max-active: 8 #最大連接數
#??????? max-idle: 8? #最大空閑連接數
#??????? min-idle: 0? #最小空閑連接數
#??????? max-wait: -1ms? #最大等待時間(毫秒),-1表示無限等待
文件完整代碼:
server:port: 8080spring:profiles:active: devmain:allow-circular-references: truedatasource:druid:driver-class-name: ${sky.datasource.driver-class-name}url: jdbc:mysql://${sky.datasource.host}:${sky.datasource.port}/${sky.datasource.database}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=trueusername: ${sky.datasource.username}password: ${sky.datasource.password}redis:host: ${sky.redis.host}port: ${sky.redis.port}#redis密碼,如果沒有則不用設置
#??? password: ${sky.redis.password}#redis數據庫索引(默認為0)database: ${sky.redis.database}
#??? timeout: 10000? #連接超時時間(毫秒)
#??? lettuce:?? #Lettuce客戶端配置
#????? pool: #連接池配置
#??????? max-active: 8 #最大連接數
#??????? max-idle: 8? #最大空閑連接數
#??????? min-idle: 0? #最小空閑連接數
#??????? max-wait: -1ms? #最大等待時間(毫秒),-1表示無限等待mybatis:#mapper配置文件mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.sky.entityconfiguration:#開啟駝峰命名map-underscore-to-camel-case: truelogging:level:com:sky:mapper: debugservice: infocontroller: infosky:jwt:# 設置jwt簽名加密時使用的秘鑰admin-secret-key: itcast# 設置jwt過期時間admin-ttl: 72000002222# 設置前端傳遞過來的令牌名稱admin-token-name: tokenalioss:endpoint: ${sky.alioss.endpoint}access-key-id: ${sky.alioss.access-key-id}access-key-secret: ${sky.alioss.access-key-secret}bucket-name: ${sky.alioss.bucket-name}
示意圖:
2、application-dev.yml完善
Redis數據庫沒有設置密碼的需要注釋掉或刪掉“password”字段
位置:sky-server/src/main/resources/application-dev.yml
添加的代碼:
sky:redis:host: localhostport: 6379
#??? password: 123456database: 1
文件完整代碼:
sky:datasource:driver-class-name: com.mysql.cj.jdbc.Driverhost: localhostport: 3306database: sky_take_outusername: rootpassword: rootalioss:endpoint: oss-cn-beijing.aliyuncs.comaccess-key-id: LTAI5tPjjUp2rSRyizZtYX4yaccess-key-secret: eMbPCYCwdl4h9GVAROmgsH6mjZnylYbucket-name: sky-itcast-txredis:host: localhostport: 6379
#??? password: 123456database: 1
示意圖:
(5)admin的ShopController創建
位置:sky-server/src/main/java/com/sky/controller/admin/ShopController.java
完整代碼:
package com.sky.controller.admin;import com.sky.config.RedisConfiguration;
import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;@RestController("adminShopController")
@RequestMapping("/admin/shop")
@Api(tags = "后臺-商鋪管理相關接口")
@Slf4j
public class ShopController {public static final String key = "shop_status";@Autowiredprivate RedisTemplate redisTemplate;/*** 設置商鋪營業狀態* @param status* @return*/@PutMapping("/{status}")@ApiOperation(("設置商鋪營業狀態"))public Result setStatus(@PathVariable Integer status){log.info("設置商鋪狀態為:{}", status == 1 ? "營業中" : "打烊中");redisTemplate.opsForValue().set(key, status);return Result.success();}@GetMapping("/status")@ApiOperation(("獲取商鋪營業狀態"))public Result<Integer> getStatus(){Integer status = (Integer) redisTemplate.opsForValue().get(key);log.info("商鋪營業狀態為:{}", status == 1 ? "營業中" : "打烊中");return Result.success(status);}}
示意圖:
(6)user的ShopController創建
在Controller目錄下創建user包,創建的輸入“com.sky.controller.user”
位置:sky-server/src/main/java/com/sky/controller/user/ShopController.java
完整代碼:
package com.sky.controller.user;import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;@RestController("userShopController")
@RequestMapping("/user/shop")
@Api(tags = "后臺-商鋪管理相關接口")
@Slf4j
public class ShopController {public static final String key = "shop_status";@Autowiredprivate RedisTemplate redisTemplate;@GetMapping("/status")@ApiOperation(("獲取商鋪營業狀態"))public Result<Integer> getStatus(){Integer status = (Integer) redisTemplate.opsForValue().get(key);log.info("商鋪營業狀態為:{}", status == 1 ? "營業中" : "打烊中");return Result.success(status);}}
示意圖:
注意:由于admin包下的和user包下ShopController同名,導致他們在spring容器中的Bean名也一樣即開頭首字母變小寫(shopController),直接啟動項目匯報錯,所以要自定義Bean名(如user表改為"userShopController")
代碼分別如下:
ShopController:
@RestController("userShopController")
AdminController:
@RestController("adminShopController")
示意圖:
(7)功能測試
(1)swagger接口文檔測試:蒼穹外賣項目接口文檔
出現錯誤:響應碼為500,控制臺顯示
“class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')”
原因:問題出在 RedisTemplate 的值序列化器設置上。老師當前使用了 StringRedisSerializer 作為值序列化器,而我們的是Integer,所以老師沒對value序列化,但卻嘗試存儲 Integer 類型的數據,導致類型轉換異常。或者我們把value序列化設置成指定Integer類型序列化,需要修改的地方是 值的序列化器,將其改為能處理多種類型的序列化器。
解決:對RedisConfiguration進行修改,使其支持Integer等多種類型數據的序列化
位置:sky-server/src/main/java/com/sky/config/RedisConfiguration.java
完整代碼:
package com.sky.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
@Slf4j
public class RedisConfiguration {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {log.info("初始化創建Redis模板對象...");// 創建RedisTemplate對象,并指定泛型為<String, Object>RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// 設置連接工廠redisTemplate.setConnectionFactory(redisConnectionFactory);// 創建Jackson2JsonRedisSerializer序列化器Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);// 配置ObjectMapper,讓Jackson能序列化更多類型ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);// 設置key的序列化方式為StringRedisSerializerredisTemplate.setKeySerializer(new StringRedisSerializer());// 設置value的序列化方式為Jackson2JsonRedisSerializer(支持多種類型)redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// 同時設置hash類型的key和value的序列化器redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}
}
測試
查看Redis數據庫,shop_status的值已設置為1
(2)前后端聯調
打開前段網頁:工作臺,點擊“營業狀態設置”,選擇“打烊中”,狀態已改變
響應碼為200,表示成功!至此,店鋪狀態修改功能已完成!