天天看點

嘗試使用Memcached遇到的狗血問題搭建Memcached伺服器Memcached Client的使用

乘着有時間,嘗試下利用Memcached進行分布式緩存,其中遇到了不少問題及狗血的事情,開篇記錄下,希望對您有幫助。

我之前的項目為:Asp.Net MVC4 + Nhibernate + MSSQL,利用簡單分層,在用緩存時寫了個緩存接口(還好當時寫了),是以在此基礎上,我的改動其實很簡單,實作這個接口,再切換到Memcached就可以了。

搭建伺服器很簡單,我用虛拟機虛拟了Ubuntu Server,為何使用Server版本呢?搭建起來比較快,而且啟動也快,使用該用的功能就夠了。搭建後,利用apt-get進行安裝

apt-get memcached

安裝後,memcached其實已經自動啟動了,接下來遇到狗血問題了!

一、telnet 無法連接配接,解決方案:

檢查VirtualBox的網絡連接配接方式,如果為NAT請改為橋接模式。此時還無法連接配接!!因為預設的Memcached配置,使用了本機ip:127.0.0.1 ,此時利用VI修改下配置

vi /etc/memcached.conf

好了,這時候在本機上,cmd-telnet ip 11211 看下是否已連接配接成功,如果還不行,請留言。

第一步好了,接下來就是程式的改寫了

之前說過我用了個Cache的接口,我隻要是實作一個Memcached就可以了.我的接口如下:

其實很多MemcachedClient都有,Set對應Store(StoreMode,key,value,expriation)

在此建議您在開發環境下,使用ExecuteStore方法進行存儲,這樣遇到問題可以抛出錯誤

MemcachedClientFactory.GetClient是一個工廠,友善以後如果有需求可以更改用戶端。這裡要注意下,有時候ExecuteStore不成功不會抛出Exception,但有Message,可以自定義個Exception抛出。

實作後原以為一切都如此簡單,可事實并非如此。您現在看到的實作我用了using,每次建立client,每次關閉,之前不是這樣,我使用的是單例模式,狗血的問題發生了。

從伺服器無法讀取。。。伺服器一切正常,代碼跟蹤後,發覺在緩存的時候,有幾條能緩存,有幾條無法緩存,百度,狗狗,都無法找到滿意的答案,随後就把MemcacheClient(下面簡稱mc)改成了每次打開和關閉(是否會影響性能,不得而知,求dudu賜教)

改了以後,這個問題算解決了,但原理為何還未知,希望有大俠指點。

解決了一個問題又來一個!!

你妹的,原來memcached預設配置下,對單個對象的大小進行了限制,預設情況是1M,檢視了自己需要緩存的對象,确實資料量比較大,自己對緩存出的資料沒有進行篩選字段,好吧!為了不破壞之前的程式,我沒有對資料進行修改,而是修改了memcached server上的配置,vi配置檔案,添加 –I 5m,重新開機,好了,算勉強解決了,把單個緩存對象改成5M了 - -(勿噴)

想想應該可以了吧!又來了個更狗血的:

。。。。神馬意思啊???參數錯誤。。。進入Debug,跟蹤到某個緩存的時候,無法進行緩存,檢視資料不大啊,那到底神馬問題啊!!!不經意間,看了下key的值。。。。。你妹。。。超長字元,因用了自定義個一個key生成器,把相關參數都一個一個拼接起來的,so。。。。,看了下長度:280,難道memcached的key有長度限制??速速百度,果然,key預設情況下是250長度,但你又無法配置其長度,好在我的key是由一個靜态方法生成的,汗啊!把長度限制了下,超過的截斷,ok了,問題解決!。

在用Memcached時,還遇到了連接配接池問題,遇到了定位不成功問題,不過這些都是小問題,自己配置了2個server,一個server被我關閉了,so。。。自己的問題,大家也注意下。

接下來的問題,比較頭大,看官請看:

嘗試使用Memcached遇到的狗血問題搭建Memcached伺服器Memcached Client的使用

GroupedEnumerable未标記為序列化。。。。可惡啊,之前都是用Where,Order,Select,Group之類的方法并未ToList,這時候有點厭惡微軟了,為嘛不能序列化。。。。List<T>是個可序列化的類型,為什麼這些Enumerable無法序列化呢??大神指點。。。

在嘗試了把幾個Enumerable轉換成List後,問題解決了,但程式中好多地方都這樣寫的,想想目前公司不會轉到Memcached,随後放棄了後面的修改,因為我的目的僅僅是玩一下而已,呵呵。還有個問題要注意:您要緩存的對象必須都要能夠序列化的,一般都是資料庫Model,要在Model類上,加上Serializable特性,否則無法傳輸。在檢視了Enyim的源代碼後,發現其實是使用DefaultTranscoder.Serialize方法進行序列化的,如果您不想改變您之前的所有東東,您可以自己寫個ITranscoder的實作,可以通過配置檔案切換。

玩過了Memcached後,準備切換回之前的WebCache模式,想想最近看了IOC的書,對于這種小型的IOC來說,用微軟的Unity就可以了,那就再玩下吧!利用Nuget下載下傳Unity。。。。報錯!!!真的,報錯!!!我用的是管理器下載下傳,提示版本不符。。。看了項目介紹後知道了,原來目前的版本支援的是Framework4.5以上!你妹,那好,我下載下傳低版本的吧,進入了Nuget的控制台,輸入Install-Package Unity –Version 2.1.505.0

嘗試使用Memcached遇到的狗血問題搭建Memcached伺服器Memcached Client的使用

因為第一次用,是以遇到了蠻多問題,記錄下,希望對大家有幫助。今天不是教程,僅僅是開發中遇到的各類問題,自己琢磨這解決,在使用第三方的子產品時,請盡量下載下傳其源代碼,對您會有幫助的。對于Memcached我剛用,還了解的不多,目前隻是簡單的緩存後讀取,更高層次的話還需要進步學習。

請不要吝啬您的左鍵,點選推薦支援一下,謝謝!

繼續閱讀