天天看點

.NET緩存架構CacheManager在混合式開發架構中的應用(1)-CacheManager的介紹和使用

在我們開發的很多分布式項目裡面(如基于WCF服務、Web API服務方式),由于資料提供涉及到資料庫的相關操作,如果用戶端的并發數量超過一定的數量,那麼資料庫的請求處理則以爆發式增長,如果資料庫伺服器無法快速處理這些并發請求,那麼将會增加用戶端的請求時間,嚴重者可能導緻資料庫服務或者應用服務直接癱瘓。緩存方案就是為這個而誕生,随着緩存的引入,可以把資料庫的IO耗時操作,轉換為記憶體資料的快速響應操作,或者把整個頁面緩存到緩存系統裡面。緩存架構在各個平台裡面都有很多的實作,基本上多數是采用分布式緩存Redis、Memcached來實作。本系列文章介紹在.NET平台中,使用開源緩存架構CacheManager來實作資料的緩存的整個過程,本篇主要介紹CacheManager的使用和相關的測試。

CacheManager是一個以C#語言開發的開源.Net緩存架構抽象層。它不是具體的緩存實作,但它支援多種緩存提供者(如Redis、Memcached等)并提供很多進階特性。

CacheManager 主要的目的使開發者更容易處理各種複雜的緩存場景,使用CacheManager可以實作多層的緩存,讓程序内緩存在分布式緩存之前,且僅需幾行代碼來處理。

CacheManager 不僅僅是一個接口去統一不同緩存提供者的程式設計模型,它使我們在一個項目裡面改變緩存政策變得非常容易,同時也提供更多的特性:如緩存同步、并發更新、序列号、事件處理、性能計算等等,開發人員可以在需要的時候選擇這些特性。

使用Nuget為項目添加CacheManager包引用。CacheManager包含了很多的Package. 其中CacheManager.Core是必須的,其它的針對不同緩存平台上有不同的對應Package,整個Nuget包包含下面幾個部分的内容。

.NET緩存架構CacheManager在混合式開發架構中的應用(1)-CacheManager的介紹和使用

CacheManager緩存架構支援Winform和Web等應用開發,以及支援多種流行的緩存實作,如MemoryCache、Redis、Memcached、Couchbase、System.Web.Caching等。

縱觀整個緩存架構,它的特定很明顯,在支援多種緩存實作外,本身主要是以記憶體緩存(程序内)為主,其他分布式緩存為輔的多層緩存架構方式,以達到快速命中和處理的機制,它們内部有相關的消息處理,使得即使是分布式緩存,也能夠及時實作并發同步的緩存處理。

在網上充斥着基于某種單獨緩存的實作和應用的趨勢下,這種更抽象一層,以及提供更進階特性的緩存架構,在提供了統一程式設計模型的基礎上,也實作了非常強大的相容性,使得我一接觸到這個架構,就對它愛不釋手。

在GitHub上,緩存架構的前幾名,除了這個緩存架構外,也還有一些,不過從文檔的豐富程度等各方面來看,這個緩存架構還是非常值得擁有的。

CacheManager緩存架構在配置方面,支援代碼方式的配置、XML配置,以及JSON格式的配置處理,非常友善。

CacheManager緩存架構預設對緩存資料的序列化是采用二進制方式,同時也支援多種自定義序列化的方式,如基于JOSN.NET的JSON序列化或者自定義序列化方式。

CacheManager緩存架構可以對緩存記錄的增加、删除、更新等相關事件進行記錄。

CacheManager緩存架構的緩存資料是強類型的,可以支援各種正常類型的處理,如Int、String、List類型等各種基礎類型,以及可序列号的各種對象及清單對象。

CacheManager緩存架構支援多層的緩存實作,内部良好的機制可以高效、及時的同步好各層緩存的資料。

CacheManager緩存架構支援對各種操作的日志記錄。

CacheManager緩存架構在分布式緩存實作中支援對更新的鎖定和事務處理,讓緩存保持更好的同步處理,内部機制實作版本沖突處理。

CacheManager緩存架構支援兩種緩存過期的處理,如絕對時間的過期處理,以及固定時段的過期處理,是我們處理緩存過期更加友善。

....

很多特性基本上覆寫了緩存的正常特性,而且提供的接口基本上也是我們所經常用的Add、Put、Update、Remove等接口,使用起來也非常友善。

通過上面對CacheManager緩存架構的簡單了解,我們大概了解了它應用的一些功能,但是實際上我們如何使用它,我們需要做一些學習和了解,首先我們需要在整個應用架構裡面,知道緩存架構所扮演的角色。

一般來說,對于單機版本的應用場景,基本上是無需引入這種緩存架構的,因為用戶端的并發量很少,而且資料請求也是寥寥可數的,性能友善不會有任何問題。

如果對于分布式的應用系統,如我在很多随筆中介紹到我的《混合式開發架構》、《Web開發架構》,由于資料請求是并發量随着使用者增長而增長的,特别對于一些網際網路的應用系統,極端情況下某個時間點一下可能就會達到了整個應用并發的峰值。那麼這種分布式的系統架構,引入資料緩存來降低IO的并發數,把耗時請求轉換為記憶體的高速請求,可以極大程度的降低系統當機的風險。

我們以基于正常的Web API層來建構應用架構為例,整個資料緩存層,應該是在Web API層之下、業務實作層之上的一個層,如下所示。

.NET緩存架構CacheManager在混合式開發架構中的應用(1)-CacheManager的介紹和使用

在這個資料緩存層裡面,我們引入了CacheManager緩存架構,實作分布式的緩存處理,使得我們的緩存資料能夠在Redis伺服器上實作資料的處理,同時可以在系統重新開機的時候,不至于丢失資料,能夠快速恢複緩存資料。

為了實作對這個CacheManager緩存架構的使用,我們需要先進行一個使用測試,以便了解它的各個友善情況,然後才能廣泛應用在我們的資料中間層上。

我們建立一個項目,并在引用的地方打開管理NuGet程式包,然後搜尋到CacheManager的相關子產品應用,并加入到項目引用裡面,此為第一步工作。

.NET緩存架構CacheManager在混合式開發架構中的應用(1)-CacheManager的介紹和使用
.NET緩存架構CacheManager在混合式開發架構中的應用(1)-CacheManager的介紹和使用

我們建立一個客戶對象類,用來模拟資料的存儲和顯示的,如下代碼所示。

這個類先做了一個單例的實作,并初始化緩存Customer類對象,以及緩存管理類ICacheManager<object> manager,這個是我們後面用來操作緩存資料的主要引用對象。

我們編寫幾個函數,用來實作對資料的擷取,資料增加、資料删除的相關操作,并在資料增加、删除的時候,觸發緩存的更新,這樣我們下次擷取資料的時候,就是最新的資料了。

我們編寫一個Winform程式來對這個緩存測試,以友善了解其中的機制。

.NET緩存架構CacheManager在混合式開發架構中的應用(1)-CacheManager的介紹和使用

我們在測試讀取的時候,也就是對GetAll進行處理,插入以及删除主要就是為了測試緩存更新的處理。代碼如下所示。

我們跟蹤記錄,可以看到下面的日志資訊。

.NET緩存架構CacheManager在混合式開發架構中的應用(1)-CacheManager的介紹和使用

我們可以看到,其中第一次是緩存沒有的情況下進行初始化,初始化的記錄數量為3個,然後插入記錄後,再次擷取資料的時候,緩存更新後的數量就變為4個了。

我們前面介紹了插入記錄的背景代碼,它同時進行了緩存資料的更新了。

我們前面介紹的緩存初始化配置的時候,預設是使用記憶體緩存的,并沒有使用分布式緩存的配置,它的初始化代碼如下:

引入分布式的Redis緩存實作,我們的配置代碼隻需要做一定的改變即可,如下所示。

其他的使用沒有任何變化,我們同時增加一些測試資料友善我們查閱對應的緩存資料。

我們其中測試,一切和原來沒有什麼差異,程式的記錄資訊正常。

但是我們配置使用了Redis的緩存處理,是以可以使用“Redis Desktop Manager”軟體來檢視對應的緩存資料的,打開軟體我們可以看到對應的緩存記錄如下所示。

.NET緩存架構CacheManager在混合式開發架構中的應用(1)-CacheManager的介紹和使用

從上圖我們可以檢視到,我們添加的所有緩存鍵值都可以通過這個Redis的客戶來進行檢視,因為我們緩存裡面有基于Redis緩存的實作,同理如果我們配置其他的緩存實作,如MemCache等,那麼也可以在對應的管理界面上檢視到。

我們完成這些處理後,可以發現緩存資料是可以實作多層緩存的,最為高效的就是記憶體緩存(也是它的主緩存),它會自動協同好各個分布式緩存的資料版本沖突問題。

引入如Redis的分布式緩存有一個好處,就是我們的資料可以在程式重新啟動的時候,如果沒有在記憶體緩存裡面找到(沒有擊中目标),那麼會尋找分布式緩存并進行加載,進而即使程式重新開機,我們之前的緩存資料依舊儲存完好。

以上就是我基于對緩存架構的整體了解和其角色扮演做的相關介紹,以及介紹CacheManager的使用和一些場景的說明,通過上面簡單案例的研究,我們可以逐漸引入到更具實際價值的Web API 架構層面上進行使用,以期把緩存架構發揮其真正強大的價值,同時也為我們各種不同的緩存需要進行更高層次的探索,希望大家繼續支援。