Velocity是微軟推出的分布式緩存解決方案,為開發可擴充性,可用的,高性能的應用程提供支援,可以緩存各種類型的資料,如CLR對象、XML、二進制資料等,并且支援叢集模式的緩存伺服器。Velocity也将內建在.NET Framework 4.0中,本文将介紹Velocity中的悲觀鎖定,緩存項版本、日志記錄、用戶端緩存以及路由表等知識。
在Velocity提供了一套悲觀鎖定模型,即在某個緩存項資料處理過程中,資料将處于鎖定狀态,來自于其它用戶端應用程式将無法對該緩存項進行處理。提供悲觀鎖定的方法主要三個,如下代碼所示:
<b>GetAndLock()</b>:擷取緩存項并對資料加鎖;
<b>PutAndUnlock()</b>:更新加鎖的資料并釋放鎖;
<b>Unlock()</b>:釋放鎖定。
先來看GetAndLock()方法,在擷取緩存項時并加鎖,此時如果其它用戶端試圖擷取該資料并加鎖(即調用GetAndLock方法)将會失敗,而不會阻塞;但用戶端如果隻想擷取資料(即調用Get方法),則會傳回相應資料,可以用圖1形象的來表示:
圖 1
可以看到,ClientA擷取資料成功并加鎖;ClientB再次想擷取資料并加鎖時,将會失敗;ClientC能夠擷取資料。
使用GetAndLock()方式可以指定鎖過期時間,并且會有輸出參數LockHandle,該參數将會在PutAndUnlock()方法或Unlock()中來釋放鎖,如下代碼所示:
<a href="http://11011.net/software/vspaste"></a>
Velocity中同樣提供了日志記錄的功能,我們可以在應用程式配置檔案中進行設定,它支援基于控制台、基于檔案以及Windows事件跟蹤三種方式的記錄,在配置檔案中首先添加配置區:
然後可以進行配置,如設定日志記錄級别等:
同樣也可以在代碼中設定,調用CacheFactory的兩個靜态方法CreateLogSinks和DisableLogSinks,如下代碼所示:
在Velocity中提供了一種基于版本的更新功能,當使用GetCacheItem()方法時将傳回一個緩存項,并攜帶有版本資訊,當每次對緩存項做更新時,在内部都會對它的版本增加。如下面的示例,有兩個客戶應用程式,它們同時擷取了同一個緩存項:
ClientA
ClientB
并且同時對緩存項做修改:
如果ClientA首先送出更改,在送出更改時攜帶版本資訊,由于版本資訊與内部的版本一緻,是以送出成功:
此時内部版本将會增加,現在ClientB如果再送出更改,将會失敗,因為版本無法比對,如圖2表示:
圖 2
在Velocity中還支援用戶端緩存,如果啟用了用戶端緩存後,在從緩存叢集中取回資料時,将會放在用戶端緩存中,這樣下次取資料時将會直接從用戶端緩存中取出,能夠極大的提高效率,有點像是緩存的緩存。當叢集中的資料發生變化時,Velocity将會使用事件通知機制通知用戶端緩存重新整理資料,如圖3所示:
圖 3
要啟用用戶端緩存,一是使用配置檔案,設定IsEnabled屬性為True,如下代碼所示:
直接指定啟用用戶端緩存即可,另外也可以在建立CacheFactory時指定,如下代碼所示:
Velocity中在緩存用戶端,提供了一種路由用戶端Routing Client,它能夠提供比簡單用戶端Simple Client更好的性能,在Routing Client中會有一個路由表Routing Table,它用來跟蹤緩存對象,它是全局緩存中的分區映射的一個子集,同時分發緩存操作(Put、Get等)到确定的緩存宿主。路由用戶端使用此路由表來優化性能,因為該表可以跟蹤緩存對象,是以當有請求到緩存宿主時,可以進行實體上的定位。如圖4所示:
圖4
是否在應用程式中啟用路由用戶端,可以由開發者來确定,如在配置中啟用路由用戶端,這裡可以通過訓示deployment來設定是路由用戶端(routing)還是簡單用戶端(simple):
另外還可以通過代碼來設定,如下面的代碼,在建立CacheFactory時指定構造函數參數:
最後我們再看一幅圖,來了解一下Velocity的組成部分,可以看到它可以分為用戶端緩存、服務端緩存以及管理工具三部分,如圖5所示:
圖 5
本文介紹了Velocity中的悲觀鎖定,緩存項版本、日志記錄、用戶端緩存以及路由表等知識,希望對大家有用。至此,關于微軟的分布式緩存服務Velocity就用短短的三篇文章介紹到這裡,期待在.NET Framework 4.0中Velocity能夠為我們帶來更多的驚喜。
相關文章:
本文轉自lihuijun51CTO部落格,原文連結:http://blog.51cto.com/terrylee/151996 ,如需轉載請自行聯系原作者