mall:redis專案原始碼解析

2023-08-26 21:03:00

一、mall開源專案

1.1 來源

mall學習教學,架構、業務、技術要點全方位解析。mall專案(50k+star)是一套電商系統,使用現階段主流技術實現。涵蓋了SpringBoot 2.3.0、MyBatis 3.4.6、Elasticsearch 7.6.2、RabbitMQ 3.7.15、Redis 5.0、MongoDB 4.2.5、Mysql5.7等技術,採用Docker容器化部署。

專案github地址: github.com

1.2 專案轉移

可以把github上的專案轉移到gitee上,方便克隆到idea。

具體步驟如下:

1.3 專案克隆

由於github部署在國外,雖然idea也支援從github上拉取,但是克隆速度太慢,所以才推薦上述匯入gitee後在克隆專案到idea。

具體的克隆步驟過於簡單和常規化,讀者可自行完成,或百度一下~

二、Redis 非關係型資料庫

2.1 Redis簡介

Redis是一個開源的使用ANSI C語言編寫、遵守BSD協定、支援網路、可基於記憶體亦可持久化的紀錄檔型、Key-Value資料庫,並提供多種語言的API,是一個高效能的key-value資料庫。

它通常被稱為資料結構伺服器,因為值(value)可以是 字串(String), 雜湊(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等型別。

Redis 與其他 key - value 快取產品有以下三個特點:

  • Redis支援資料的持久化,可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用。
  • Redis不僅僅支援簡單的key-value型別的資料,同時還提供list,set,zset,hash等資料結構的儲存。
  • Redis支援資料的備份,即master-slave模式的資料備份。

Redis開發檔案地址: Redis 簡介_redis教學

安裝Redis操作簡單,讀者自行百度或檢視開發檔案安裝即可。

2.2 分散式後端專案的使用流程

下圖是結合專案經歷,外加百度查詢資料,自行總結的基本使用流程。

Redis的使用流程圖如下:

2.3 分散式後端專案的使用場景

下圖是結合專案經歷,外加百度查詢資料,自行總結的基本使用場景。

Redis的使用場景圖如下:

2.4 常見的快取問題

下圖是結合專案經歷,外加百度查詢資料,自行總結的常見快取問題。

Redis的快取問題圖如下:

三、原始碼解析

看原始碼自我總結出來的看新專案時的基本步驟,首先先看整合和設定,在從業務的角度來分析,結合整合的框架和元件,來依次剝削系統的架構。

解析內容:下方的解析內容大部分在圖中解釋,外面就不做過多的闡述。

3.1 整合與設定

直接拿原始碼分析,只分析與Redis有關的部分,其它部分讀者請,自行看原始碼分析。

專案啟動:只需要啟動mall-tiny-redis模組的部分即可。

啟動所需:啟動mysql5,Redis的服務,建立資料庫,並匯入表(sql檔案位置在,專案同級目錄的document資料夾裡)。

ps:記得修改資料庫連線的設定資訊和Redis的連線資訊。

3.1.1 匯入依賴

pom檔案中匯入Redis的相關依賴。

3.1.2 新增設定

application.yml中新增Redis的相關設定。

3.1.3 全域性跨域設定

3.2 Redis測試

3.2.1 Redis設定類

Redis設定類實現了Redis的設定和初始化工作,包括建立RedisTemplate物件、設定Redis序列化器、設定Redis快取有效期等。通過這些設定,應用程式可以方便地使用Redis來進行快取操作。

1、Redis的設定和初始化工作

2、Redis序列化器

3、管理Redis快取的讀寫操作和生命週期

3.2.2 啟動遇到swagger版本問題

1、出現問題

springboot整合swagger,出現 No mapping for GET /swagger-ui.html的錯誤

2、解決辦法

在設定類中繼承WebMvcConfigurationSupport類,重寫addResourceHandlers方法

步驟一:繼承

步驟二:重寫

程式碼如下:

  @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("doc.html")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

3、成功效果

3.2.3 測試Redis的快取

經過上面的小插曲,現在開始步入正題。

1、測試簡單快取

存:redisTemplate.opsForValue().set(key, value)

取:redisTemplate.opsForValue().get(key)

2、測試Hash結構的快取

存:redisTemplate.opsForHash().putAll(key, map)

取:redisTemplate.opsForHash().entries(key)

3、測試Set結構的快取(無序)

存:redisTemplate.opsForSet().add(key, values)

刪:redisTemplate.opsForSet().remove(key, values)

取:redisTemplate.opsForSet().members(key)

4、測試List結構的快取(有序)

批次存:redisTemplate.opsForList().rightPushAll(key, values)

刪:redisTemplate.opsForList().remove(key, count, value)

取:redisTemplate.opsForList().range(key, start, end)

5、Redis中的儲存效果

讀者在前面瀏覽時,肯定有疑惑,不是對Redis的操作嗎?那咋沒有看見儲存效果,姍姍來遲的效果圖如下,外加一些介紹。

3.2.4 測試品牌介面的快取

對於品牌介面使用Redis快取情況,這裡只有查詢品牌詳情,刪除,更新這三個使用到了Redis快取,並且是以註解的形式描述,這裡我舉2個例子,分別為查詢品牌詳情和更新品牌資訊。

1、獲取指定id的品牌詳情

註解:@Cacheable(value = RedisConfig.REDIS_KEY_DATABASE, key = "'pms:brand:'+#id", unless = "#result==null")

swagger下測試的效果圖

業務邏輯程式碼:

Redis的效果圖

2、更新指定id品牌資訊

註解:@CacheEvict(value = RedisConfig.REDIS_KEY_DATABASE, key = "'pms:brand:'+#id")

swagger下測試的效果圖

業務邏輯程式碼:

Redis的效果圖

四、總結

本文是有我先從實際專案中獲取需求,從而對Redis快取的學習,結合原始碼來學習,從mall開源專案中學習Redis,感覺收穫頗深,希望這篇文章對你們也會有所幫助。

後續我也會結合該框架學習一下其他的技術棧。

盈若安好,便是晴天