在系統(tǒng)架構(gòu)設計中,使用緩存是最常用的降低數(shù)據(jù)庫負載和提升性能的策略,緩存的主要目的是減少對數(shù)據(jù)庫的 Read 操作。但是在不同的情況下,我們需要使用不同形式的緩存。
比如,如果數(shù)據(jù)表中的數(shù)據(jù)是靜態(tài)的、不會發(fā)生變化的,那就非常容易,我們只需要在系統(tǒng)啟動的時候,將其加載到內(nèi)存,以后每次從內(nèi)存讀取數(shù)據(jù)即可。
再比如,數(shù)據(jù)表中的數(shù)據(jù)會發(fā)生變化(增刪改),但是變化的頻率非常低,而恰巧我們的系統(tǒng)對數(shù)據(jù)實時性的敏感度也不是特別高,那我們可以使用定時刷新的緩存,DataRabbit 中也內(nèi)置了對這種緩存的支持,可以參見 DataRabbit 輕量的ORM框架(16)-- Entity緩存 。
再比如,數(shù)據(jù)表中的記錄非常多,并且修改方面只會有Insert操作,那么我們可以使用HotCache,把那些經(jīng)常使用的記錄緩存在內(nèi)存中,并且設定超時機制。HotCache我們會在后面介紹。
再比如,某個數(shù)據(jù)表的修改經(jīng)常是Insert和Update操作,但是無論如何Update,每條記錄有些固定欄位的值都是不會發(fā)生變化的,那我們可以把這些不會發(fā)生變化的欄位封裝在一個【子對象】中,然后在內(nèi)存中緩存這些子對象。
舉了這么多例子,現(xiàn)在我們進入本文正題,假設我們的某個數(shù)據(jù)表中的數(shù)據(jù)會發(fā)生變化(增刪改),但是變化的頻率比較低,但是我們的系統(tǒng)對這個表的數(shù)據(jù)的實時性的敏感度也特別高,那這時候我們就需要用到【實時同步的實體緩存】,這個緩存中的數(shù)據(jù)在任何時候都與數(shù)據(jù)表中的數(shù)據(jù)是完全一致的。
DataRabbit 中的SyncEntityCache就是這樣的緩存。
當然,使用這樣的實時同步緩存有一個前提是必須保證的,那就是對目標數(shù)據(jù)表的修改都必須經(jīng)由SyncEntityCache來進行,這個前提應該還是比較容易保證的。
我們來看看ISyncEntityCache接口的內(nèi)容:
該接口有兩個泛型參數(shù):TPKey和TEntity,TPKey表示數(shù)據(jù)表主鍵的類型,TEntity就是目標Entity的類型。
其三個屬性分別是:
TransactionScopeFactory 表明目標數(shù)據(jù)表位于哪個數(shù)據(jù)庫中。
PKeyName 即主鍵列的名稱。
PKeyAutoIncreased 表示主鍵是否為自增類型。
然而,能被緩存的Entity必須實現(xiàn)ISyncCachedEntity接口:
基接口ICachedEntity的GetID()方法用于返回Entity的主鍵字段的值。ISyncCachedEntity繼承了ICloneable接口,表明Entity是必須可以復制的,繼承這個接口的緣由后面會介紹到。
當系統(tǒng)啟動時,我們調(diào)用Initialize方法從數(shù)據(jù)庫中加載目標表的所有記錄。接著我們就可以通過GetEntityCopy()方法和GetEntityCopyList()方法來讀取需要的Entity。注意這兩個方法的名稱中包含了“Copy”,這表明它們會返回緩存的Entity的副本。所以,即使你對返回的副本進行修改,也不會影響到緩存中的Entity。
顯然,這兩種方法的效率會因為Entity的clone而有輕微降低。但是,如果你 能保證 讀取的Entity僅用于Read,那么你可以調(diào)用GetEntityList4Read()這個效率更高的方法,它將直接返回緩存中的Entity。
另外,你看到ISyncEntityCache提供了基本的增刪改的方法,我們必須調(diào)用這些方法來修改目標數(shù)據(jù)表中的記錄,而且這些方法會自動同步緩存中的Entity使其與數(shù)據(jù)庫中一致。
最后,ISyncEntityCache提供了Reload()方法,該方法用于目標數(shù)據(jù)表中的記錄在意外的情況下發(fā)生修改時(即修改不是通過ISyncEntityCache進行的),手動刷新緩存以獲得與數(shù)據(jù)庫中的數(shù)據(jù)完全的一致性。
DataRabbit.Application.Cache.SyncEntityCache 類實現(xiàn)了ISyncEntityCache接口,并且這個實現(xiàn)是線程安全的,你可以在多線程的環(huán)境下放心使用。
DataRabbit3.0及以上版本對上述策略都給予了充分的支持,你可以下載 最新版本 試試。
關于DataRabbit的更多信息目錄,參見 這里 。
DataRabbit 輕量的數(shù)據(jù)訪問框架(20)-- 實時同步的實體緩存 SyncEntityCache
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

