【新手總結】在.Net項目中使用Redis作為緩存服務

来源:http://www.cnblogs.com/hohoa/archive/2016/08/14/5771255.html
-Advertisement-
Play Games

最近由於項目需要,在系統緩存服務部分上了redis,終於有機會在實際開發中玩一下,之前都是自己隨便看看寫寫,很零碎也沒沉澱下來什麼,這次算是一個系統學習和實踐過程的總結。 和Redis有關的基礎知識 Redis是一個開源的分散式NoSql資料庫,可以用來做緩存服務、消息隊列、數據存儲等等,數據類型之 ...


最近由於項目需要,在系統緩存服務部分上了redis,終於有機會在實際開發中玩一下,之前都是自己隨便看看寫寫,很零碎也沒沉澱下來什麼,這次算是一個系統學習和實踐過程的總結。

 

和Redis有關的基礎知識

Redis是一個開源的分散式NoSql資料庫,可以用來做緩存服務、消息隊列、數據存儲等等,數據類型之豐富,效率之高,簡直逆天!沒有瞭解過的可以移步去問度娘~客戶端之豐富,足可見它的社區有多強大:

其中C#的客戶端就有這麼多:

沒錯,我們的項目里也選擇了最熱門的StackExchange.Redis作為底層服務。

Redis雖然也可以部署在window上,但效率會大打折扣,所以通常都是部署在linux上跑,剛好我在上次部署.net core 項目時創建了一個centos虛擬機,可以直接拿來用,不會配虛擬機的同學可以點這裡。Redis服務部署網上有很多教程,在此就略過了。

在這裡向大家推薦一款redis圖形化操作的客戶端Redis Studio,比Redis Desktop Manager好用太多,誰用誰知道!可以查看運行情況、查看數據和類型、查看剩餘有效時間、刷新數據、刪除數據,甚至可以直接在圖形界面配置redis,再也不用去配置文件里懵逼了。

當然,以上操作都可以在redis服務開啟後用redis-cli工具實現。

 

基礎操作封裝

緩存的基礎操作無非就是get、set這些,所以統一定義了一個介面:

裡面用StackExchange.Redis提供的API來實現這些操作,代碼太多就不貼出來了。其中對redis的連接做了連接池處理,連接對象ConnectionMultiplexer封裝在一個阻塞隊列裡面,每次讀寫操作的時候去隊列裡面取,用完再放回,在應用啟動的時候會初始化這個連接池。

創建連接的時候有兩種方式,第一種是使用連接字元串的形式,把需要的參數寫在一個字元串中:

第二種是使用ConfigurationOptions對象:

其中EndPoints是redis伺服器的地址,做集群的時候可以寫多個。為了搞清楚裡面參數的含義,從github上clone了一份StackExchange.Redis的源碼來看,非常清晰。在看源碼的過程中發現底層都有記錄redis的詳細運行情況,但都是寫在Stream里,於是自己基於系統的log4net日誌然後根據它的實現重寫了一套TextWriter來實現日誌持久化,用於日後來分析錯誤:

在做泛型操作封裝的時候遇到一個問題:我想把一個複雜對象整存整取。第一個想到的辦法是序列化,但總覺得這樣乾會拖累redis的性能,覺得不爽不想用。然後是用redis的hash類型,但是操作起來非常不方便,而且沒辦法存集合,也pass了,其他的類型翻了源碼看只支持int、string、bool這些,也不行。沒辦法還是序列化吧,然後想起來張善友老師推薦的protobuf,說是性能超級棒,於是就用了,發現它是用Stream來轉化的,莫非這就是它性能高的原因?哪位大神指點下~

 

用redis自定義session存儲

緩存服務搭起來後就打算把session搬到裡面去,便於做分散式和統一狀態管理。很簡單,重寫一套SessionStateStoreProviderBase就行了,然後跟著園子里焰尾迭的博客《分散式中Redis實現Session終結篇》做了一套,但是發現跑不起來,應該和我的封裝有關,由於時間問題就先放下了,直接上nuget找了一個現成的,看中了Microsoft.Web.RedisSessionStateProvider,想著既然是我軟官方出的應該沒什麼大問題,另外這個SessionStateProvider也是依賴於StackExchange.Redis,與項目中的一致於是果斷下載安裝了。接下來不得不誇一下微軟的細節處理啊,下載完立馬蹦出個readme告訴我安裝結果:

要不然還要研究這個東西怎麼用,按照裡面的提示打開web.config,發現在<system.web>節點下幫我們自動加了一個節點sessionState,裡面定義了和session有關的配置,最重要的是配置模板都給出來了,連數據類型都標記的清清楚楚:

眾所周知微軟一直向他的開發者推崇傻瓜式操作,但這些細節真的是太貼心了,根據自己的redis伺服器信息配置一下關鍵信息就ok了。寫個session測試一下,頁面跑起來了redis裡面也查到session值了(被編碼了),太TM爽啊~100個大寫的贊。。。

 

最後,把系統中臨時用的HttpContext.Cache和靜態Dictionary全部用redis替換掉,然後build、run、ok。

 

總結

經過這幾天的實踐算是打開了redis的大門走出了第一步,今後系統開發和運行中肯定還會遇到很多問題,也不是說在程式用redis實現get、set就是學會了,現在接觸到的只是最基礎的東西,後面還要學習一下redis的高級用法,例如pub/sub、master/slave、集群等。

    

問題

1、序列化那裡心裡還是有梗,有沒有更好的解決方案?而且用protobuf的話要在類名和屬性上打標簽,這個有點憂桑啊~

2、有人說把session放到redis後可以解決session阻塞的問題,測試了一下好像不行啊,哪位大神知道真相的還請指點一二~

 


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

-Advertisement-
Play Games
更多相關文章
  • 版權聲明:本文為MULTIBEANS ORG研發跟隨文章,未經MLT ORG允許不得轉載。 最近做項目,需要開發安卓應用,實現串口的收發,目測CH340G在安卓手機上非常麻煩,而且驅動都是Java版本的, 就沒選擇,博主在大二的時候學習過Java SE基本的語法,寫過一些小程式就放棄了Java的道路 ...
  • 最近在做項目中用到2013中的ReportView11 在本機IIS中使用完全沒問題 但是放到伺服器上總是出問題 解決辦法:(1)首先在自己機器上開發的時候 是不用引用 Microsoft.ReportViewer.Common.dll和Microsoft.ReportViewer.WebForms ...
  • C# 軟體配置方法。通常情況下我們使用appSetting來進行配置,通過 Glacier 可以使用嵌入的 HOCON 或獨立的 HOCON 配置文件配置,同時支持類型綁定功能,方便統一管理軟體配置。 ...
  • 最近閑來無事給自己寫了家庭財務收支管理系統,也就包含支出管理,收入管理和一些統計功能。 先說登錄模塊,因為涉及GET和POST請求,這些東西都是能被監控和抓取的所以就考慮這使用RSA加密解密方式傳輸用戶名和密碼參數,頁面JS如下: 1 /*需要引入三個JS文件,BigInt.js、RSA.js和Ba ...
  • 靜態 1、普通成員普通成員都是屬於對象的用對象調用 2、靜態成員靜態成員是屬於類的用類名調用 class FenBi{public int length;//普通成員public string color;//} static 靜態關鍵字 靜態方法裡面不能包含普通成員 普通方法裡面可以包含靜態成員 ...
  • 我們先思考幾個問題: 接下來,先開始我們的正文。 自己實現迭代器 .net中迭代器是通過IEnumerable和IEnumerator介面來實現的,今天我們也來依葫蘆畫瓢。 首先來看看這兩個介面的定義: 並沒有想象的那麼複雜。其中IEnumerable只有一個返回IEnumerator的GetEnu ...
  • 2016.6.27 微軟已經正式發佈了.NET Core 1.0 RTM,但是工具鏈還是預覽版,同樣的大量的開源測試庫也都是至少發佈了Alpha測試版支持.NET Core, 這篇文章 The State of .Net Core Testing Today 就將各個開源測試庫的目前進展進行了彙總。 ...
  • 物理文件是我們最常用到的原始配置的載體,最佳的配置文件格式主要由三種,它們分別是JSON、XML和INI,對應的配置源類型分別是JsonConfigurationSource、XmlConfigurationSource和IniConfigurationSource。但是對於.NET Core的配置... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...