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

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

 

和Redis有關的基礎知識

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

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

沒錯,咱們的項目裏也選擇了最熱門的StackExchange.Redis做爲底層服務。 github

Redis雖然也能夠部署在window上,但效率會大打折扣,因此一般都是部署在linux上跑,恰好我在上次部署.net core 項目時建立了一個centos虛擬機,能夠直接拿來用,不會配虛擬機的同窗能夠點這裏。Redis服務部署網上有不少教程,在此就略過了。 web

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

固然,以上操做均可以在redis服務開啓後用redis-cli工具實現。 數據庫

 

基礎操做封裝

緩存的基礎操做無非就是get、set這些,因此統必定義了一個接口: centos

裏面用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、集羣等。

    

問題

一、序列化那裏內心仍是有梗,有沒有更好的解決方案?並且用protobuf的話要在類名和屬性上打標籤,這個有點憂桑啊~

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

 

 

備註:  文章發佈後不少朋友想要代碼,前面留下郵箱的已經都發送給你們了,現分享到百度雲,你們能夠去下載http://yun.baidu.com/s/1hrVIHyG

相關文章
相關標籤/搜索