一、一點基礎概念html
二、獲取EnyimMemcached客戶端的源代碼並編譯出動態庫linux
三、Memcached的服務器安裝(windows server)git
四、在web項目中實戰github
memcached是什麼?memcached是分佈式緩存系統,特色是高性能、分佈式內存緩存系統。
memcached能作什麼?用來給動態web提高響應速度(經過緩存數據,減小數據庫訪問壓力)。
爲何要用memcached?筆者認爲使用它的緣由是能提高網站總體性能,減小數據庫的的請求壓力。據某位博主說合理使用Memcached能夠將單臺機子的併發從20提高到1000.也就是說提高了50倍,筆者未經考證,有測試的同窗能夠留言告知樓主web
你能夠直接經過svn地址:→Source←直接checkout源代碼,此處獲取的源代碼編譯以後就能獲得咱們在實際項目中須要使用dll(
Enyim.Caching.dll
)文件,此源碼編譯出來的是4.0的dll。若是須要2.0的dll那麼在獲取源代碼以後只須要將對應的項目更改爲2.0以後,並把log4net
目錄下的對應版本的log4net.dll拷貝到binaries
目錄下便可。而後從新編譯便可得到對應版本的Enyim.Caching.dll
的文件和log4net.xml
文件。固然、你也可使用兼容配置,不知道怎麼配置?快去google吧!
若是你的程序沒有使用強簽名的話。壓根不用擔憂這個問題。我已經將源碼中的簽名去掉了。值得注意的是、在你的項目中、你除了要引用Enyim.Caching.dll
以外還必須保證log4net.xml
和它放在同個目錄下。
另外放一個多語言版本的下載地址,→點我下載多語言支持版本←去下載多語言版本。數據庫PS:若是地址失效了請告知博主。謝謝windows
在windows平臺下安裝和管理Memcached是很方便的。下載MemCacheD Manager 下載完成以後咱們甚至不須要下載Memcached的服務器端就能經過GUI界面來管理咱們的多個MemCached服務,筆者在windows server2008 R2 sp1下親測是可使用的。可是在一樣系統環境下時在雲主機上沒法直接使用該軟件,須要先經過下載Memcached的windows安裝程序經過命令直接安裝,該軟件在添加服務實例的時候一直報找不到網絡路徑的錯誤,猜想多是權限或者網卡問題。可是筆者未找到解決辦法。筆者使用的是阿里雲主機。
若是在其餘版本下沒法使用請留言告知博主,謝謝。最後讓咱們感謝偉大的informer爲咱們提供的好工具。
安裝完成以後、在服務中就能夠看到你剛纔啓動的Memcached的服務、若是不出意外的話,你們能夠經過telnet ipaddress port
的命令來遠程到指定主機管理和查看該memcached服務的狀態,固然、前提是你的服務器和客戶端都開啓了telnet服務。查看命令爲stats
就能夠看到服務相關的運行參數
數組這些配置都是能夠本身指定的。若是你是使用的MemCacheDManager那麼你是能夠直接經過該軟件的界面來直接指定Memcached的監聽端口以及ip、內存大小、key大小、最大鏈接數等,默認端口是11211。若是使用命令行的話則須要在啓動命令中加上指定的參數信息:緩存
-p 設置TCP端口號(默認不設置爲: 11211)
-U UDP監聽端口(默認: 11211, 0 時關閉)
-l 綁定地址(默認:全部都容許,不管內外網或者本機更換IP,有安全隱患,若設置爲127.0.0.1就只能本機訪問)
-d 以daemon方式運行
-u 綁定使用指定用於運行進程
-m 容許最大內存用量,單位M (默認: 64 MB)
-P 將PID寫入文件,這樣可使得後邊進行快速進程終止, 須要與-d 一塊兒使用
在linux下:./usr/local/bin/memcached -d -u root -l 192.168.1.197 -m 2048 -p 12121
在window下:{安裝路徑}\memcached.exe -d RunService -l 127.0.0.1 -p 11211 -m 500
在windows下注冊爲服務後運行:
sc.exe create Memcached_srv binpath= 「{安裝路徑}\memcached.exe -d RunService -p 11211 -m 500″start= auto net start Memcached
能夠參考這篇博文Memcached 命令解析安全
Memcached的命令格式爲:
<command name> <key> <flags> <exptime> <bytes> <data block>
<command name>
:命令類型[set,add,get,gets,replace]等等<key>
:關鍵字<flags>
:存儲主鍵以外的額外信息<exptime>
:數據有效期、0時爲永久,單位是秒(s)<bytes>
:存儲的字節數<data block>
:數據的存儲塊(能夠理解爲k-v中的v)特別須要說明下的是若是你在命令行下使用set 那麼當你的data block長度小於bytes時將不會存儲,而大於的又會報塊錯誤信息。只有在等於的時候纔會執行成功獲得正確的返回。
Memcached有不少語言的客戶端實現。本次咱們使用的是EnyimMemcached客戶端。經過上面獲取的源代碼。咱們編譯後獲取到了Enyim.Caching的dll。只須要將該dll引入到咱們的項目中便可。值得注意的是、Enyim.Caching使用了log4net。所以咱們在引入的時候須要將經過源碼編譯出的dll以及一個log4net和log4net.xml一併帶上。當讓。你也能夠本身重新配置log4net這並不影響使用、咱們須要知道的是Enyim須要log4net的支持便可。要在web中使用Enyim首先咱們須要在配置信息中對Enyim進行對應的配置,下面咱們來按照這個步驟試一下吧。^_^~
1. 在config文件中增長Enyim的配置信息
在web.config中須要對Enyim作一些配置,在ConfigSections節點之中註冊enyim節點
<configSections> <sectionGroup name="enyim.com"> <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching"/> </sectionGroup> </configSections> <enyim.com> <memcached> <servers> <!--在這裏添加你的緩存服務器地址,能夠是多個,IP地址以及對應的端口--> <add address="127.0.0.1" port="11211" /> <!--<add address="127.0.0.1" port="11211" />--> </servers> <!--這裏進行鏈接池大小、鏈接超時設置等參數的配置--> <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" /> </memcached> </enyim.com>
上面就是咱們須要在配置文件中的新增的配置信息,其中每一個memcached
節點下的servers
節點的屬性是能夠多個的。
2. 引入Enyim的dll文件,若是你項目沒有使用log4net的話只須要將log4net的dll以及配置文件一併放在你的運行目錄下便可
值得注意的是、項目版本。如上面所說、Log4net的版本應該和Enyim.caching的版本一致。不然會致使在使用過程當中出現無發加載log4net的狀況。
3. 使用Enyim對緩存進行簡單的常規數據類型進行操做。
要進行緩存數據的操做、那麼首先咱們應該知道Memcached支持那些數據類型、以及在Enyim中支持了那些操做方法。
首先說一下在Enyim中支持的操做方法:
append
:向一個已經存在的key追加數據、追加的數據類型是一個byte[]
數組,若是key不存在、則返回false
反之返回true
。而且其casUnique
的值會+1。所以可能引發cas操做的回滾。
bool Store
:有五個重載。可對key執行修改、重寫、和新增三個操做。並能在value的指定位置進行寫入或複寫數據,同時還能更新該緩存過時時間以及在間隔多少秒以後緩存失效。具體的讀者能夠看源代碼中MemcachedClient
類的具體的實現和註釋。返回true表示成功、false表示失敗。
ServerStats Stats
:獲取cache服務器的運行狀態。返回一個ServerStats
類型、該類型中會包含服務器上的cache當前狀態以及item數量get次數miss次數等信息。
bool Remove
:用於刪除緩存中的指定key值。返回true表示成功、false表示失敗
void FlushAll
:讓cache中的全部item都失效、可是未清除、可是咱們也沒法在經過命令獲取。不過能夠從itemscount中看到任然有那麼多個item在cache中。但此時狀態已經標記爲失效了。
★long Increment(string key, uint amount)和long Decrement(string key, uint amount)
:在key存在的狀況下、若是原來的key值不是一個string
類型的數字時、此時會將原來的value值變爲此時的amount對象。若是原來的值是一個string
類型的數字的話。則會把該key的value修改成該key原來的value + amount
的結果。Enyim在此處對於數據類型的實現有必定的問題
。因爲幾乎不使用所以再也不深刻解釋這個問題。這兩個方法執行成功以後都會返回操做以後的value值。若是失敗則返回數字0
。key不存在的時候返回-1
object get
:取回一個key對應的值。若是沒找到key則返回null。這是咱們用的最多的幾個方法之一。根據key獲取對應的值。也能夠根據一個IEnumerable<string>
獲取多個key的值。最簡單的就是直接使用一個List<string>
來裝多個key。把這個list傳遞進去便可,
T get<T>
:取回一個T對象。若是沒找到key則返回null。
bool CheckAndSet
:檢查並更新key對應的值。首先會檢查key的casUnique值、若是這個值和本客戶端最後一次獲取該key的casUnique不一樣、則返回false,不進行更新。不然進行值的更新。這個方法是爲了解決在多線程下、因爲命令執行隊列的非原子性可能會致使你獲取該key以後、其餘線程同時獲取並修改了該key、而在你提交更新的時候可能會把其餘線程提交的數據覆蓋掉。所以或先檢查獲取的casUnique的值和cache中該key的是否一致。不一致則代表有其餘線程已經操做過了須要你再次獲取改key後重現提交修改。以保證不會弄髒緩存數據。CheckAndSet實際上是gets和cas
命令的結合使用。
關於memcached的一些疑問補充說明
- Memcached的相關操做是原子性的嗎?
被髮送的單個命令是原子性的。你同時發送
set
和get
命令他們不會影響對方。他們會被串行化前後執行。多線程下也是如此。可是命令的序列卻不是原子性的,所以你獲取一個item以後在set回去時有可能會複寫被其餘進程set了的item.所以在1.2.5
之後的版本有了gets
和cas
的高級命令來解決這個問題。
- Memcached的key最大長度是多少?
答案是
250
個字符。
- Memcached的單個item的最大大小是?
答案是
1M
- 特別說明——關於Memcached的集羣和單點故障解決方案的說明
在windows下筆者未找到很好的解決辦法。Memagent+livevent是在linux下的解決方案、在windows下並不實用。因爲做爲緩存服務器對於客戶端來講不管是linux和windows都沒有任何關係、惟一的問題在於部署和運維。筆者比較懶、就再也不安裝linux作測試了。大體查了一下、網上已經有不少文章介紹Memcached的集羣部署了。再次再也不贅述、本文只談論Enyim在.net下的使用。 此文和此文值得閱讀
自此、Memcached在.Net中的使用就介紹到這裏。咱們不妨總結一下、在Memcached的.Net客戶端Enyim來操做Memcached是一件很簡單的事情。因爲Enyim的高度封裝、我能很方便的使用和控制咱們的緩存數據。經過Enyim、咱們能夠將更多的精力投入的緩存存儲的數據結構的設計中去、如何根據業務設計出符合項目實際運用的緩存數據結構纔是咱們的重點