概述:本系列博文所涉及的相關內容來源於debug親自錄製的實戰課程:緩存中間件Redis技術入門與應用場景實戰(SpringBoot2.x + 搶紅包系統設計與實戰),感興趣的小夥伴可以點擊自行前往學習(畢竟以視頻的形式來掌握技術 會更快!) ,文章所屬專欄:緩存中間件Redis技術入門與實戰
摘要:在Redis衆多數據結構當中,字符串String可以說是其中比較常見、應用比較頻繁的一種了,本文我們將介紹數據類型~字符串String 在命令行的簡單使用及其在實際業務場景中的應用與代碼實戰,其中應用場景爲“存儲前端門戶網站的商品詳情信息”,從而減少數據庫DB的訪問頻率,提高接口的響應速率!
內容:緩存中間件Redis擁有多種豐富的數據結構,字符串String就是其中比較常見而且應用相當廣泛的一種,下面我們將基於前文整合搭建的SpringBoot2.0+Redis的項目爲奠基,從兩個方面進行介紹,即簡單的命令行、實際的應用場景+代碼實戰!
(一)Redis命令行界面實操“數據類型String”
(1)由於debug本地機子是windows系統,故而爲了可以在本地windows操作系統的機子使用Redis命令行,我們需要前往github下載一個windows版的redis綠色安裝工具包(如果是mac或者linux,則直接跳過此步驟),爲了方便大家下載,我就直接提供地址給大家下載了(鏈接:https://pan.baidu.com/s/1o30jZZ9Rb5ZzR2iulQF9JA 提取碼:isj0) 下載完成之後,解壓到沒有中文名稱的磁盤目錄下,如下圖所示:
其中,最主要的文件當屬redis-server.exe、redis-cli.exe以及另外兩個用於數據持久化的rdb和aof文件,雙擊redis-server.exe,成功出現如下的界面即代表redis已經成功在你本地運行起來了:
(2)下面,我們寫兩個簡單的命令(即如何往Redis存入一個Key,以及如何從Redis中獲取該Key對應的值),簡單的感受一下字符串String在Redis命令行界面下的操作,如下圖所示:
是不是感覺很簡單???哈哈,本來就是如此!除此之外,還可以在RedisDesktopManager工具查看該Key的具體值!下面我進入重頭戲,即如何將Redis的這些特性應用到實際的項目、實際的業務場景中去呢!
(二)String典型應用場景代碼實戰
(1)業務場景介紹:下面我們以“訪問前端門戶網站商品信息”爲業務場景,在後端管理平臺添加“熱門商品信息”時也順便將其塞入緩存Redis中,之後前端門戶網站在獲取該商品詳情時直接走緩存Redis查詢,而不走數據庫DB查詢,在某種情況下(比如雙11、雙12的熱銷商品),可以緩解數據庫的訪問壓力,降低DB的負載!
(2)我們首先開發一個Controller,用於添加熱門商品信息、並將其塞入緩存Redis中,除此之外,還開發了前端門戶網站訪問該熱門商品詳情信息的請求方法,其完整的源碼如下所示:
/** * 字符串String實戰-商品詳情存儲 * @Author:debug (SteadyJack) * @Date: 2019/10/29 20:58 **/ @RestController @RequestMapping("string") public class StringController { private static final Logger log= LoggerFactory.getLogger(StringController.class); @Autowired private 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; } }
(3)其中,stringService 顧名思義,即爲實現業務邏輯的真正實現類!其完整源代碼如下所示:
/** * @Author:debug (SteadyJack) * @Date: 2019/10/29 21:05 **/ @Service public class StringService { private static final Logger log= LoggerFactory.getLogger(StringService.class); @Autowired private ItemMapper itemMapper; @Autowired private StringRedisService redisService; @Autowired private 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; } }
值得一提的是:
A.我們在 “將熱門商品添加進數據庫後 也往緩存中間件Redis塞了一份”,爲了保證“雙寫一致性”,我們的做法是:“先保證成功數據庫,之後再往緩存Redis塞一份!”
B.“商品信息”是一個實體對象,爲了能將該實體對象信息塞入Redis的String類型中,我們需要將其“序列化”,採用的Jackson的序列化機制,將該實體對象序列化爲“Json格式的字符串”!
C. 在“獲取熱門商品詳情”時,我們當然是根據Key直接進行獲取,但由於其結果是String類型的Json格式字符串常量值,故而我們需要將其“反序列化”,即同樣也是採用Jackson的反序列化機制,將其映射到一個Item實體對象中即可
(4)至此,我們的擼碼環節就全部完成了,最後,我們基於Postman進行自測吧:
A.首先當然是添加一個熱銷商品,商品信息爲:
{ "code": "book50010", "name": "分佈式中間件實戰(Java版)"}
發起Http請求以及得到的響應信息如下圖所示:
採用Navicat查看數據庫中相應表的信息記錄,如下圖所示:
B.最後,當然在Postman是模擬“前端門戶網站”發起“獲取熱銷商品詳情”的請求啦,如下圖所示:
除此之外,還可以在RedisDesktopManager中查看該商品存儲在緩存中間件Redis的詳情:
好了,本篇文章我們就介紹到這裏了,建議各位小夥伴一定要照着文章提供的樣例代碼擼一擼,只有擼過才能知道這玩意是咋用的,否則就成了“空談者”!對Redis相關技術棧以及實際應用場景實戰感興趣的小夥伴可以咱們51cto學院 debug親自錄製的課程進行學習:緩存中間件Redis技術入門與應用場景實戰(SpringBoot2.x + 搶紅包系統設計與實戰)
補充:
1、本文涉及到的相關的源代碼可以到此地址,check出來進行查看學習:https://gitee.com/steadyjack/SpringBootRedis
2、目前debug已將本文所涉及的內容整理錄製成視頻教程,感興趣的小夥伴可以前往觀看學習:https://edu.51cto.com/course/20384.html