亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

[Asp.net5]Caching-緩存架構與源碼分析

2019-11-14 14:20:10
字體:
來源:轉載
供稿:網友

首先奉獻caching的開源地址[微軟源碼]

1.工程架構

 

為了提高程序效率,我們經常將一些不頻繁修改,但是使用了還很大的數據進行緩存。尤其是互聯網產品,緩存可以說是提升效率優化第一利器。微軟為我們實現了倆種緩存方式:內存緩存、分布式緩存。個人理解如果緩存在前端電腦內存的緩存叫做內存緩存,如果緩存在其它設備上,那么叫做分布式緩存。

  • 倆種緩存方式的優缺點

  我開發程序經歷過三個時間點,開始的時候從來不使用緩存,之后將數據緩存在內存中,最后使用分布式緩存。內存緩存的優點是速度快,缺點是內存損耗比較大,可能緩存的數據太大的時候就放不下了,另外一個缺點就是對于多前端程序的原則上是不支持的。而分布式緩存的優點是,理論上緩存大小沒有上線,可以通過擴充物理硬件進行擴展,對于多前端支持的較好。

Microsoft.Framework.Caching.Abstractions

這個工程定義的是緩存的整體架構。我們的思想是面向接口編程,而不是面向實現編程。所以該工程定義了我們想要的接口

從上圖顯而易見,微軟將內存緩存和分布式緩存割裂開來,而不是我們一般意義上定義一個ICache接口,之后讓IMemoryCache和IDistributedCache分別繼承ICache接口。

所以我們用分布式緩存,內存緩存原則不能無縫的直接切換。需要我們修改程序代碼,或者進行適配封裝。

  • 分布式緩存

   這部分包含內容只包含簡單的倆點:配置項(DistributedCacheEntryOptions)、緩存接口(IDistributedCache)。而DistributedCacheEntryExtentions是DistributedCacheEntryOptions的擴展方法包裝類,CaceheExtensions是IDistributedCache擴展方法包裝類,CacheItemPRiority是優先級枚舉。

  • 內存緩存

  內存緩存,微軟的設計就比較復雜,考慮到方方面面。首先時緩存的配置項(IMemoryCacheEntryOptions)、緩存接口(IMemoryCache)以及它們擴展項(MemoryCacheEntryExtentions、CacheExtentions)。

  但是微軟的想法,緩存不止應該只有過期失效,當我程序update一個字段后,我想通知內存緩存,我更改了,那又該怎么辦呢?于是微軟設計了右上角的部分(*由于代碼的持續更新原因右上角部分的接口已經被去掉,由IList<IChangeToken> ExpirationTokens { get; }屬性替代,但是原則都是一樣的,即外部通知內部,數據已經更新)。

  既然外部數據更新能通知緩存,那反向呢?緩存更新是否能夠通知外部使用對象呢?答案是這個可以支持,所有上邊框,下面的部分。

  既然能外部修改通知內部,內部修改也能通知外部應用程序。設計已經趨近完美了?微軟說還不夠,于是上圖左邊的部分產生了。它的意義就是,我可以為緩存創建一個范圍,至于范圍是做什么的?答案是“我也不知道”,但是從內存緩存的實現上來看,是用于整體緩存token等信息的。

  緩存配置項的時間選項:AbsoluteExpiration、AbsoluteExpirationRelativeToNow、SlidingExpiration。分別表示的是絕對的過期時間點、相對于現在多久的絕對過期時間點,有效期時長。我們注意下類型AbsoluteExpiration是DateTimeOffset不是DateTime。(*DateTimeOffset 是對于1970年1月1日0時的時間偏移量,和DateTime相比,缺少時區的概念。而此處不需要有時區相關概念,所以選用了DateTimeOffset )。

 

 Microsoft.Extensions.Caching.Memory

  內存緩存的實現。此處代碼結構如下圖所示:

  • 大邏輯

  1,緩存太大時,壓縮緩存空間(個人理解)

  系統創建內存緩存對象(MemoryCache)的時候,同時創建GcNotification對象,之后GcNotification對象立馬失效。GC需要析構的時候,會調用GcNotification的析構函數,析構函數被調用后會執行CallBack函數(定義在MemoryCache),之后再次注冊析構函數,循環往復的如此。所以當內存占用太高的時候,緩存會縮減緩存空間。

        if (reRegister && !Environment.HasShutdownStarted)            {                GC.ReRegisterForFinalize(this);            }    
注冊析構函數

  2,緩存對象(MemoryCache)的釋放,沒有對象引用緩存的話,難免GC會回收緩存對象。那么怎么避免緩存被GC回收?下面代碼的思路還是不錯的

        ~MemoryCache()        {            Dispose(false);        }        public void Dispose()        {            Dispose(true);        }        protected virtual void Dispose(bool disposing)        {            if (!_disposed)            {                if (disposing)                {                    GC.SuppressFinalize(this);                }                _disposed = true;            }        }        private void CheckDisposed()        {            if (_disposed)            {                throw new ObjectDisposedException(typeof(MemoryCache).FullName);            }        }
緩存對象析構

  3,IEntryLink對象的跨線程訪問

  緩存過期的時候,很可能不是本線程訪問的,可能是另外一個線程,通過獲取IEntryLink,之后通過IChangeToken對象通知緩存,所以不同線程間必須是可以共享IEntryLink對象。此處使用的是CallContext.LogicalGetData與CallContext.LogicalSetData。關于線程見數據通信,請參考“如何實現對上下文(Context)數據的統一管理”

    internal static class EntryLinkHelpers    {        private const string ContextLinkDataName = "EntryLinkHelpers.ContextLink";        public static EntryLink ContextLink        {            get            {                var handle = CallContext.LogicalGetData(ContextLinkDataName) as ObjectHandle;                if (handle == null)                {                    return null;                }                return handle.Unwrap() as EntryLink;            }            set            {                CallContext.LogicalSetData(ContextLinkDataName, new ObjectHandle(value));            }        }        internal static IEntryLink CreateLinkingScope()        {            var parentLink = ContextLink;            var newLink = new EntryLink(parent: parentLink);            ContextLink = newLink;            return newLink;        }        internal static void DisposeLinkingScope()        {            var currentLink = ContextLink;            var priorLink = ((EntryLink)currentLink).Parent;            ContextLink = priorLink;        }    }
EntryLinkHelpers代碼示例

 

 

未完待續......


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美午夜久久久| 亚洲丝袜av一区| 久久综合久久美利坚合众国| 久久久精品国产亚洲| 色狠狠久久aa北条麻妃| 久久成人亚洲精品| 97涩涩爰在线观看亚洲| 日韩三级成人av网| 日韩欧美在线视频日韩欧美在线视频| 国产成人精品免费久久久久| 亚洲成色999久久网站| 亚洲天堂网在线观看| 国产在线观看精品| 国产综合在线视频| 91黑丝在线观看| 国产免费亚洲高清| 久久久中精品2020中文| 亚洲人成电影在线播放| 欧亚精品中文字幕| 色综合久久久久久中文网| 色偷偷偷综合中文字幕;dd| 久久影院免费观看| 久久夜精品香蕉| 福利视频导航一区| 性视频1819p久久| 黑人精品xxx一区一二区| 按摩亚洲人久久| 中文字幕在线观看亚洲| 亚洲二区在线播放视频| 欧美精品电影在线| 红桃视频成人在线观看| 91在线观看免费高清| 中文字幕日韩欧美| 亚洲国产精品久久久久秋霞不卡| 欧美极品少妇xxxxⅹ喷水| 欧美性xxxxxxx| 久热精品视频在线| 国产精品免费看久久久香蕉| 亚洲欧美国产一区二区三区| 亚洲天堂av图片| 久久婷婷国产麻豆91天堂| 精品一区二区亚洲| 精品免费在线观看| 欧美在线视频导航| 中文字幕欧美日韩va免费视频| 亚洲国产精品专区久久| 久久精品国产久精国产一老狼| 欧美中文在线免费| 尤物yw午夜国产精品视频明星| 国产精品自拍偷拍| 欧美日韩激情网| 亚洲精品国产精品自产a区红杏吧| 91国偷自产一区二区三区的观看方式| 欧美性做爰毛片| 欧美一区二区三区精品电影| 久久精品免费电影| 亚洲аv电影天堂网| 亚洲精品wwww| 亚洲欧美综合另类中字| 91免费看视频.| 亚洲人精选亚洲人成在线| 日产日韩在线亚洲欧美| 久久综合久久美利坚合众国| 成人黄色在线观看| 亚洲精品国产综合区久久久久久久| 色999日韩欧美国产| 欧美另类第一页| 国产日韩一区在线| 精品国产拍在线观看| 久久久久久久久久国产精品| 日韩电影中文字幕在线观看| 日韩精品欧美国产精品忘忧草| 国产精品av免费在线观看| 国产日韩在线观看av| 欧美大片第1页| 国产a∨精品一区二区三区不卡| 色综合伊人色综合网站| 亚洲一区二区免费在线| 97精品伊人久久久大香线蕉| 精品亚洲一区二区三区| 国产精品久久久久福利| 精品一区电影国产| 欧美劲爆第一页| 亚洲精品自拍偷拍| 51精品国产黑色丝袜高跟鞋| 日韩av网址在线观看| 亚洲男人的天堂网站| 亚洲国产精品久久久久| 欧美精品videosex性欧美| 久久久在线观看| 色综合久久悠悠| 日产精品久久久一区二区福利| 国产成人在线一区| 欧洲亚洲妇女av| 97视频人免费观看| 欧美一区二区三区精品电影| 91亚洲一区精品| 久久人人爽人人爽人人片av高请| 色偷偷88888欧美精品久久久| 国产亚洲欧美另类中文| 97视频在线观看视频免费视频| 国产精品亚洲欧美导航| 欧美性xxxx| 日韩在线免费观看视频| 欧美午夜丰满在线18影院| 亚洲精品美女久久久| 亚洲天堂色网站| 亚洲自拍偷拍视频| 精品福利樱桃av导航| 中文字幕免费国产精品| 另类天堂视频在线观看| 高清日韩电视剧大全免费播放在线观看| 国产亚洲欧美日韩精品| 国产精品久久久久久久久久新婚| 日韩在线视频国产| 久久免费观看视频| 国产97色在线|日韩| 国产精品电影网| 亚洲精品国产欧美| 国产精品一区二区三区久久久| 久久久久久久久久久av| 欧美野外猛男的大粗鳮| www.日本久久久久com.| 国产精品美女久久| 国产日韩欧美视频在线| 色偷偷偷亚洲综合网另类| 国产精品视频网站| 国产性色av一区二区| 精品中文字幕久久久久久| 国产精品高清在线观看| 91久久国产精品91久久性色| 精品福利在线观看| 欧洲亚洲免费视频| 久久躁日日躁aaaaxxxx| 国产精品久久色| 欧美色播在线播放| 欧美精品video| 不卡中文字幕av| 青青草国产精品一区二区| 亚洲人成电影网站色…| 国产一区二区三区三区在线观看| 日韩二区三区在线| 国产精品一区二区电影| 亚洲一区二区中文| 久久精品人人做人人爽| 成人久久一区二区三区| 91久久国产综合久久91精品网站| 日本成人在线视频网址| 欧美激情在线狂野欧美精品| 51久久精品夜色国产麻豆| 富二代精品短视频| 国产美女91呻吟求| 国产在线久久久| 国产精品自产拍在线观| 国产精品一久久香蕉国产线看观看| 精品亚洲男同gayvideo网站| 国色天香2019中文字幕在线观看| 一区二区三区四区视频| 亚洲精品福利在线观看| 91在线视频导航| 狠狠色狠狠色综合日日五| 欧美老女人性视频| 久国内精品在线| 欧美国产视频一区二区|