Redis實戰(2)-數據結構之字符串String實戰之存儲對象

概述:本系列博文所涉及的相關內容來源於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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章