基於SpringBoot2.0實戰字符串String

摘要

在Redis眾多數據結構當中,字符串String可以說是其中比較常見、應用比較頻繁的一種了,本文我們將介紹數據類型~字符串String 在命令行的簡單使用及其在實際業務場景中的應用與代碼實戰,其中應用場景為"存儲前端門戶網站的商品詳情信息",從而減少數據庫DB的訪問頻率,提高接口的響應速率!

內容

緩存中間件Redis擁有多種豐富的數據結構,字符串String就是其中比較常見而且應用相當廣泛的一種,下面我們將基於前文整合搭建的SpringBoot2.0+Redis的項目為奠基,從兩個方面進行介紹,即簡單的命令行實際的應用場景+代碼實戰

<strong>(一)Redis命令行界面實操"數據類型String"

(1)由於Debug本地機子是windows系統,故而為了可以在本地windows操作系統的機子使用Redis命令行,我們需要前往github下載一個windows版的redis綠色安裝工具包(如果是mac或者linux,則直接跳過此步驟),為了方便大家下載,我就直接提供地址給大家下載了(鏈接: 提取碼:isj0)


下載完成之後,解壓到沒有中文名稱的磁盤目錄下,如下圖所示:

基於SpringBoot2.0實戰字符串String

其中,最主要的文件當屬redis-server.exe、redis-cli.exe以及另外兩個用於數據持久化的rdb和aof文件,雙擊redis-server.exe,成功出現如下的界面即代表redis已經成功在你本地運行起來了:

基於SpringBoot2.0實戰字符串String

(2)下面,我們寫兩個簡單的命令(即如何往Redis存入一個Key,以及如何從Redis中獲取該Key對應的值),簡單的感受一下字符串String在Redis命令行界面下的操作,如下圖所示:

基於SpringBoot2.0實戰字符串String

是不是感覺很簡單???哈哈,本來就是如此!除此之外,還可以在RedisDesktopManager工具查看該Key的具體值!下面我進入重頭戲,即如何將Redis的這些特性應用到實際的項目、實際的業務場景中去呢!

<strong>(二)String典型應用場景代碼實戰

(1)業務場景介紹:下面我們以"訪問前端門戶網站商品信息"為業務場景,在後端管理平臺添加"熱門商品信息"時也順便將其塞入緩存Redis中,之後前端門戶網站在獲取該商品詳情時直接走緩存Redis查詢,而不走數據庫DB查詢,在某種情況下(比如雙11、雙12的熱銷商品),可以緩解數據庫的訪問壓力,降低DB的負載!


(2)我們首先開發一個Controller,用於添加熱門商品信息、並將其塞入緩存Redis中,除此之外,還開發了前端門戶網站訪問該熱門商品詳情信息的請求方法,其完整的源碼如下所示:

<code>/*** 字符串String實戰-商品詳情存儲* @Author:debug (SteadyJack)* @Link: weixin-> debug0868 qq-> 1948831260* @Date: 2019/10/29 20:58**/@RestController@RequestMapping("string")public class StringController {private static final Logger log= LoggerFactory.getLogger(StringController.class);@Autowiredprivate StringService stringService;//添加熱門商品@RequestMapping(value = "put",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)public BaseResponse put(@RequestBody @Validated Item item, BindingResult result){if (result.hasErrors()){return new BaseResponse(StatusCode.InvalidParams);}BaseResponse response=new BaseResponse(StatusCode.Success);try {log.info("--商品信息:{}",item);stringService.addItem(item);}catch (Exception e){log.error("--字符串String實戰-商品詳情存儲-添加-發生異常:",e.fillInStackTrace());response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());}return response;}//獲取熱門商品詳情@RequestMapping(value = "get",method = RequestMethod.GET)public BaseResponse get(@RequestParam Integer id){BaseResponse response=new BaseResponse(StatusCode.Success);try {response.setData(stringService.getItem(id));}catch (Exception e){log.error("--字符串String實戰-商品詳情存儲-添加-發生異常:",e.fillInStackTrace());response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());}return response;}}/<code>

(3)其中,stringService 顧名思義,即為實現業務邏輯的真正實現類!其完整源代碼如下所示:

<code>/*** @Author:debug (SteadyJack)* @Link: weixin-> debug0868 qq-> 1948831260* @Date: 2019/10/29 21:05**/@Servicepublic class StringService {private static final Logger log= LoggerFactory.getLogger(StringService.class);@Autowiredprivate ItemMapper itemMapper;@Autowiredprivate StringRedisService redisService;@Autowiredprivate ObjectMapper objectMapper;//添加商品@Transactional(rollbackFor = Exception.class)public Integer addItem(Item item) throws Exception{item.setCreateTime(new Date());item.setId(null);itemMapper.insertSelective(item);Integer id=item.getId();//保證緩存-數據庫雙寫的一致性if (id>0){redisService.put(id.toString(),objectMapper.writeValueAsString(item));}return id;}//獲取商品public Item getItem(Integer id) throws Exception{Item item=null;if (id!=null){if (redisService.exist(id.toString())){String result=redisService.get(id.toString()).toString();log.info("---string數據類型,從緩存中取出來的value:{}",result);if (StrUtil.isNotBlank(result)){item=objectMapper.readValue(result,Item.class);}}else{log.info("---string數據類型,從數據庫查詢:id={}",id);item=itemMapper.selectByPrimaryKey(id);if (item!=null){redisService.put(id.toString(),objectMapper.writeValueAsString(item));}}}return item;}}/<code>


值得一提的是:

A.我們在 "將熱門商品添加進數據庫後 也往緩存中間件Redis塞了一份",為了保證"雙寫一致性",我們的做法是:"先保證成功數據庫,之後再往緩存Redis塞一份!"

B."商品信息"是一個實體對象,為了能將該實體對象信息塞入Redis的String類型中,我們需要將其"序列化",採用的Jackson的序列化機制,將該實體對象序列化為"Json格式的字符串"!

C. 在"獲取熱門商品詳情"時,我們當然是根據Key直接進行獲取,但由於其結果是String類型的Json格式字符串常量值,故而我們需要將其"反序列化",即同樣也是採用Jackson的反序列化機制,將其映射到一個Item實體對象中即可


(4)至此,我們的擼碼環節就全部完成了,最後,我們基於Postman進行自測吧:

A.首先當然是添加一個熱銷商品,商品信息為:

<code>{"code": "book50010","name": "分佈式中間件實戰(Java版)"}/<code>

發起Http請求以及得到的響應信息如下圖所示:

基於SpringBoot2.0實戰字符串String

採用Navicat查看數據庫中相應表的信息記錄,如下圖所示:

基於SpringBoot2.0實戰字符串String

B.最後,當然在Postman是模擬"前端門戶網站"發起"獲取熱銷商品詳情"的請求啦,如下圖所示:

基於SpringBoot2.0實戰字符串String

除此之外,還可以在RedisDesktopManager中查看該商品存儲在緩存中間件Redis的詳情:

基於SpringBoot2.0實戰字符串String

好了,本篇文章我們就介紹到這裡了,建議各位小夥伴一定要照著文章提供的樣例代碼擼一擼,只有擼過才能知道這玩意是咋用的,否則就成了"空談者"!對Redis相關技術棧以及實際應用場景實戰感興趣的小夥伴可以前往Debug搭建的技術社區的課程中心進行學習觀看: !

其他相關的技術,感興趣的小夥伴可以關注Debug的技術公眾號,或者私信Debug.


分享到:


相關文章: