概述:本系列博文所涉及的相關內容來源於debug親自錄製的實戰課程:緩存中間件Redis技術入門與應用場景實戰(SpringBoot2.x + 搶紅包系統設計與實戰),感興趣的小夥伴能夠點擊自行前往學習(畢竟以視頻的形式來掌握技術 會更快!) ,文章所屬專欄:緩存中間件Redis技術入門與實戰html
摘要:在Redis衆多數據結構當中,字符串String能夠說是其中比較常見、應用比較頻繁的一種了,本文咱們將介紹數據類型~字符串String 在命令行的簡單使用及其在實際業務場景中的應用與代碼實戰,其中應用場景爲「存儲前端門戶網站的商品詳情信息」,從而減小數據庫DB的訪問頻率,提升接口的響應速率!
前端
內容:緩存中間件Redis擁有多種豐富的數據結構,字符串String就是其中比較常見並且應用至關普遍的一種,下面咱們將基於前文整合搭建的SpringBoot2.0+Redis的項目爲奠定,從兩個方面進行介紹,即簡單的命令行、實際的應用場景+代碼實戰!java
(一)Redis命令行界面實操「數據類型String」linux
(1)因爲debug本地機子是windows系統,故而爲了能夠在本地windows操做系統的機子使用Redis命令行,咱們須要前往github下載一個windows版的redis綠色安裝工具包(若是是mac或者linux,則直接跳過此步驟),爲了方便你們下載,我就直接提供地址給你們下載了(連接:https://pan.baidu.com/s/1o30jZZ9Rb5ZzR2iulQF9JA 提取碼:isj0) 下載完成以後,解壓到沒有中文名稱的磁盤目錄下,以下圖所示:git
其中,最主要的文件當屬redis-server.exe、redis-cli.exe以及另外兩個用於數據持久化的rdb和aof文件,雙擊redis-server.exe,成功出現以下的界面即表明redis已經成功在你本地運行起來了:github
(2)下面,咱們寫兩個簡單的命令(即如何往Redis存入一個Key,以及如何從Redis中獲取該Key對應的值),簡單的感覺一下字符串String在Redis命令行界面下的操做,以下圖所示:web
是否是感受很簡單???哈哈,原本就是如此!除此以外,還能夠在RedisDesktopManager工具查看該Key的具體值!下面我進入重頭戲,即如何將Redis的這些特性應用到實際的項目、實際的業務場景中去呢!redis
(二)String典型應用場景代碼實戰數據庫
(1)業務場景介紹:下面咱們以「訪問前端門戶網站商品信息」爲業務場景,在後端管理平臺添加「熱門商品信息」時也順便將其塞入緩存Redis中,以後前端門戶網站在獲取該商品詳情時直接走緩存Redis查詢,而不走數據庫DB查詢,在某種狀況下(好比雙十一、雙12的熱銷商品),能夠緩解數據庫的訪問壓力,下降DB的負載!windows
(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 + 搶紅包系統設計與實戰)
補充:
一、本文涉及到的相關的源代碼能夠到此地址,check出來進行查看學習:https://gitee.com/steadyjack/SpringBootRedis
二、目前debug已將本文所涉及的內容整理錄製成視頻教程,感興趣的小夥伴能夠前往觀看學習:https://edu.51cto.com/course/20384.html