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

來源:互聯網
上載者:User

標籤:.net   sla   nbsp   和我   www.   red   系統開發   ring   原因   

最近由於項目需要,在系統快取服務部分上了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阻塞的問題,測試了一下好像不行啊,哪位大神知道真相的還請指點一二~

 

 

備忘:  文章發布後很多朋友想要代碼,前面留下郵箱的已經都發送給大家了,現分享到百度雲,大家可以去下載http://yun.baidu.com/s/1hrVIHyG

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.