基於SqlSugar的開發框架循序漸進介紹(17)-- 基於CSRedis實現緩存的處理

来源:https://www.cnblogs.com/wuhuacong/archive/2022/10/28/16834843.html
-Advertisement-
Play Games

在一個應用系統的開發框架中,往往很多地方需要用到緩存的處理,有些地方是為了便於記錄用戶的數據,有些地方是為了提高系統的響應速度,如有時候我們在發送一個簡訊驗證碼的時候,可以在緩存中設置幾分鐘的過期時間,這樣驗證簡訊驗證碼的時候,就會自動判斷是否過期了。本篇隨筆結合CSRedis的使用,介紹如何實現緩... ...


在一個應用系統的開發框架中,往往很多地方需要用到緩存的處理,有些地方是為了便於記錄用戶的數據,有些地方是為了提高系統的響應速度,如有時候我們在發送一個簡訊驗證碼的時候,可以在緩存中設置幾分鐘的過期時間,這樣驗證簡訊驗證碼的時候,就會自動判斷是否過期了。本篇隨筆結合CSRedis的使用,介紹如何實現緩存的初始化及使用的處理。

1、在基於.netCore的Web API後端使用CSRedis

關於CSRedis的使用,我們可以參考Github網站:https://github.com/2881099/csredis  進行瞭解。

首先我們在使用前,需要添加對應的程式集應用。

Package NameNuGetDownloads 
CSRedisCore nuget stats  
Caching.CSRedis nuget stats IDistributedCache

 CSRedisCore是必須的,而Caching.CSRedis則是在用到分散式緩存的時候需要用到。

 初始化CSRedis也比較簡單,如代碼所示。

var csredis = new CSRedis.CSRedisClient("127.0.0.1:6379,password=123,defaultDatabase=13,prefix=my_");

不過我們的Redis配置一般放在appSettings.json文件中,不是直接硬編碼的,所以需要調整一下。

//初始化Redis及分散式緩存
var redisConnectionString = builder.Configuration["CSRedis:ConnectString"];
RedisHelper.Initialization(new CSRedisClient(redisConnectionString));
builder.Services.AddSingleton<IDistributedCache>(new CSRedisCache(RedisHelper.Instance));

常規的緩存設置,通過鍵、值、時間設置等幾個內容進行處理,如下代碼所示。

RedisHelper.Set("test1", "123123", 60);

RedisHelper.Get("test1");

如果我們要清空所有的緩存鍵值,那麼對鍵進行模式匹配進行處理即可。

/// <summary>
/// 清空Redis緩存
/// </summary>
protected void ClearRedisCache()
{
    //查找所有分區節點中符合給定模式(pattern)的 key
    var cacheKeys = RedisHelper.Keys("*");
    RedisHelper.Del(cacheKeys);
}

除了常規的緩存處理,redis也支持消息隊列的處理,消息隊列最熟悉無疑是 rabbitmq,它基本是業界標準的解決方案。另外 redis 也提供了多種實現輕訂閱方法。如下麵是一案例代碼。

//程式1:使用代碼實現訂閱端
var sub = RedisHelper.Subscribe(("chan1", msg => Console.WriteLine(msg.Body)));
//sub.Disponse(); //停止訂閱

//程式2:使用代碼實現發佈端
RedisHelper.Publish("chan1", "111");

我們這裡不深究消息隊列的處理,有興趣的可以參考文章《【由淺至深】redis 實現發佈訂閱的幾種方式》進行瞭解即可。

 

2、前端發送簡訊驗證碼及後端判斷

我們這裡以一個簡訊驗證碼登錄的前端來介紹CSRedis緩存的設置、獲取、移除等操作過程。

例如,我們的移動前端,需要驗證碼登錄系統的時候,需要發送驗證碼的操作,如下所示。

前端通過初步判斷手機號碼正確後,可以向後端請求發送驗證碼,如下邏輯代碼所示(vue)

// 獲取驗證碼
getCode() {
    if (this.model.mobile.length < 11 && !uni.$u.test.mobile(this.model.mobile)) {
        uni.$u.toast('手機號碼不正確')
        return;
    }

    //發送簡訊驗證碼
    var params = {
        PhoneNumber: this.model.mobile
    }
    user.SendPhoneLoginSmsCode(params).then(res => {
        if (res.success) {
            this.show = false;
            uni.$u.toast(`驗證碼已發送至手機 ${this.model.mobile},請註意查收!`)

            let interval = setInterval(() => {
                this.second--;
                if (this.second <= 0) {
                    this.show = true;
                    clearInterval(interval);
                }
            }, 1000);
        } else {
            uni.$u.toast('發送出現錯誤:' + res.errorMessage)
        }
    })
}

WebAPI後端,處理邏輯是構建隨機的驗證碼並通過簡訊發送到手機上,並緩存好對應的驗證碼,後端的處理代碼如下所示

/// <summary>
/// 發送登錄動態碼
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[AllowAnonymous]
[HttpPost]
[Route("send-login-smscode")]
public async Task<CommonResult> SendPhoneLoginSmsCode(PhoneCaptchaModel model)
{
    //獲取隨機6位數字動態驗證碼
    var code = RandomChinese.GetRandomNumber(6);

    //使用自定義模板處理簡訊發送
    string message = string.Format(ConfigData.MySmsCodeTemplate, code);
    var result = await _smsSender.SendAsync(model.PhoneNumber, message);
    if (result.Success)
    {
        var cacheKey = model.PhoneNumber;//以手機號碼作為鍵存儲驗證碼緩存
        var cacheItem = new SmsLoginCodeCacheItem { Code = code, PhoneNumber = model.PhoneNumber };

        RedisHelper.Set(cacheKey, cacheItem, TimeSpan.FromMinutes(ConfigData.SmsCodeExpiredMinutes));

        //獲取的時候
        //var tmp = RedisHelper.Get<SmsLoginCodeCacheItem>(cacheKey);
    }

    return result;
}

順利發送簡訊驗證碼後,前端會提示用戶驗證碼發送情況,並要求輸入驗證碼進行登錄,前端登錄的代碼如下所示。

//簡訊驗證碼登錄
loginByCode() {
    var params = {
        mobile: this.model.mobile,
        smscode: this.model.code
    };
    console.log(params);
    user.dynamiclogin(params)
        .then(res => {
            uni.$u.toast('驗證成功');

            this.gotoPage();
        })
        .catch(error => {
            console.log('驗證失敗' + error);
            uni.$u.toast(error);
        });
},

後端的登錄處理,主要就是通過在Redis中讀取對應的手機驗證碼,如果匹配進行令牌的生成處理,否則提示錯誤信息。

/// <summary>
/// 登錄授權處理
/// </summary>
/// <returns></returns>
[AllowAnonymous]
[HttpPost]
[Route("authenticate-byphone")]
public async Task<AuthenticateResultDto> AuthenticateByPhoneCaptcha(PhoneCaptchaModel model)
{
    var authResult = new AuthenticateResultDto();
    #region 條件檢查
    if (string.IsNullOrEmpty(model.PhoneNumber))
    {
        throw new MyApiException("手機號不能為空");
    }
    if (string.IsNullOrEmpty(model.SmsCode))
    {
        throw new MyApiException("驗證碼不能為空");
    }

    var userInfo = await _userService.GetFirstAsync(s => s.MobilePhone == model.PhoneNumber);
    if (userInfo == null)
    {
        throw new MyApiException("用戶手機不存在");
    }
    #endregion

    var cacheKey = model.PhoneNumber;//以手機號碼作為鍵存儲驗證碼緩存
    var item = RedisHelper.Get<SmsLoginCodeCacheItem>(cacheKey);
    if (item != null && item.Code == model.SmsCode)
    {
        //根據用戶身份生成tokenresult
        authResult.AccessToken = GenerateToken(userInfo); //令牌
        authResult.Expires = expiredDays * 24 * 3600; //失效秒數
        authResult.Success = true;//成功
        authResult.UserId = userInfo.Id;//當前用戶Id

        //移除緩存簡訊鍵值
        RedisHelper.Del(cacheKey);
    }
    else
    {
        authResult.Error = "登錄失敗,無法生成令牌";
    }
    return authResult;
}

如果順利生成令牌,則從redis中移除對應的緩存鍵值即可。

如果我們需要查看Redis的緩存內容,Windows端可以安裝 RedisDesktopManager 進行查看管理Redis的內容。

發送簡訊後,鍵值會保存在Redis緩存中,可以通過RedisDesktopManager  進行查看。

手機端順利收到簡訊提示。

 

 

以上就是關於在SqlSugar的開發框架,通過介紹簡訊驗證碼的前後端協作方式,介紹使用CSRedis實現緩存的處理過程。

 

系列文章:

基於SqlSugar的開發框架的循序漸進介紹(1)--框架基礎類的設計和使用

基於SqlSugar的開發框架循序漸進介紹(2)-- 基於中間表的查詢處理

基於SqlSugar的開發框架循序漸進介紹(3)-- 實現代碼生成工具Database2Sharp的整合開發

基於SqlSugar的開發框架循序漸進介紹(4)-- 在數據訪問基類中對GUID主鍵進行自動賦值處理 

基於SqlSugar的開發框架循序漸進介紹(5)-- 在服務層使用介面註入方式實現IOC控制反轉

基於SqlSugar的開發框架循序漸進介紹(6)-- 在基類介面中註入用戶身份信息介面 

基於SqlSugar的開發框架循序漸進介紹(7)-- 在文件上傳模塊中採用選項模式【Options】處理常規上傳和FTP文件上傳

 《基於SqlSugar的開發框架循序漸進介紹(8)-- 在基類函數封裝實現用戶操作日誌記錄

基於SqlSugar的開發框架循序漸進介紹(9)-- 結合Winform控制項實現欄位的許可權控制

基於SqlSugar的開發框架循序漸進介紹(10)-- 利用axios組件的封裝,實現對後端API數據的訪問和基類的統一封裝處理

基於SqlSugar的開發框架循序漸進介紹(11)-- 使用TypeScript和Vue3的Setup語法糖編寫頁面和組件的總結

基於SqlSugar的開發框架循序漸進介紹(12)-- 拆分頁面模塊內容為組件,實現分而治之的處理

基於SqlSugar的開發框架循序漸進介紹(13)-- 基於ElementPlus的上傳組件進行封裝,便於項目使用

基於SqlSugar的開發框架循序漸進介紹(14)-- 基於Vue3+TypeScript的全局對象的註入和使用

基於SqlSugar的開發框架循序漸進介紹(15)-- 整合代碼生成工具進行前端界面的生成

基於SqlSugar的開發框架循序漸進介紹(16)-- 工作流模塊的功能介紹

 《基於SqlSugar的開發框架循序漸進介紹(17)-- 基於CSRedis實現緩存的處理

基於SqlSugar的開發框架循序漸進介紹(18)-- 基於代碼生成工具Database2Sharp,快速生成Vue3+TypeScript的前端界面和Winform端界面

 

專註於代碼生成工具、.Net/.NetCore 框架架構及軟體開發,以及各種Vue.js的前端技術應用。著有Winform開發框架/混合式開發框架、微信開發框架、Bootstrap開發框架、ABP開發框架、SqlSugar開發框架等框架產品。
  轉載請註明出處:撰寫人:伍華聰  http://www.iqidi.com 
    

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 大家早好、午好、晚好吖~ 環境使用: Python 3.8 Pycharm 模塊使用: import requests >>> pip install requests 內置模塊 你安裝好python環境就可以了 import re import json 模塊安裝問題: 如果安裝python ...
  • 一. 布爾類型和比較運算符 bool布爾類型 True:真1;Flase:假0 變數名稱 = 布爾變數字面量 eg:bool_1 = True 比較運算符 通過<比較運算符>計算得到布爾類型的結果 二. if語句的基本格式 if 語句格式: if 條件語句: True,do sth 註意事項: 條件 ...
  • 以下為本人的學習筆記 1.為什麼需要泛型 public class GenericDeom{ @Test public void test1(){ List list = new ArrayList(); list.add("tste"); list.add(10); list.add(new Ob ...
  • 1.安裝Nuget包 安裝以下nuget包支持windows service <PackageReference Include="Microsoft.AspNetCore.Hosting.WindowsServices" Version="6.0.10" /> <PackageReference ...
  • .NET Core WebApi 多語言本地化,動態切換多語言 原生的.net core webapi 動態多語言本地話 具體更多詳細內容,可以參考官方文檔 首先看效果圖 整體項目結構圖 ==開始前需要講一些重要的點== 1.是通過文件命名空間的路徑去找尋的,比如 Resource.cs 是在和多語 ...
  • 在.NET開發生態中,我們以前開發定時任務都是用的Quartz.NET完成的。在這篇文章里,記錄一下另一個很強大的定時任務框架的使用方法:Hangfire。兩個框架各自都有特色和優勢,可以根據參考文章里張隊的那篇文章對兩個框架的對比來進行選擇。 引入Nuget包和配置 引入Hangfire相關的Nu ...
  • 我們開發一個系統,在保證風格統一、代碼強壯、可讀性強等基礎上,還能夠結合代碼生成工具快速開發相關後端,以及各種前端界面的,無疑是非常好的,既保證了項目的代碼質量,又能夠極大的提高開發效率。代碼生成工具Database2Sharp是在完善的開發項目上,抽取出數據變化的部分,通過演繹、歸納、反覆演繹和歸... ...
  • 註:快手小程式審核規範中寫明拒絕純webview小程式, 即無法通過以下步驟上架快手小程式, Smobiler只能作為快手小程式開發的一個補充, 具體見 快手-小程式審核規範 Step.1 註冊快手開發者平臺 ,登錄之後點擊創建 創建完成之後再點擊應用進入 點擊填寫,填寫小程式信息 Step.2 下 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...