黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

DataRabbit 輕量的數(shù)據(jù)訪問框架(20)-- 實時

系統(tǒng) 2239 0

在系統(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)容:

DataRabbit 輕量的數(shù)據(jù)訪問框架(20)-- 實時同步的實體緩存 SyncEntityCache

該接口有兩個泛型參數(shù):TPKey和TEntity,TPKey表示數(shù)據(jù)表主鍵的類型,TEntity就是目標Entity的類型。

其三個屬性分別是:

TransactionScopeFactory 表明目標數(shù)據(jù)表位于哪個數(shù)據(jù)庫中。

PKeyName 即主鍵列的名稱。

PKeyAutoIncreased 表示主鍵是否為自增類型。

然而,能被緩存的Entity必須實現(xiàn)ISyncCachedEntity接口:

DataRabbit 輕量的數(shù)據(jù)訪問框架(20)-- 實時同步的實體緩存 SyncEntityCache

基接口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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論