C#中缓存的使用
簡介
緩存是指可以進行高速數據交換的存儲器,它先于內存與CPU交換數據,因此速率很快。由于CPU從內存中讀取數據的速度比從磁盤讀取快幾個數量級,并且存在內存中,減小了數據庫訪問的壓力, 所以緩存幾乎每個項目都會用到。一般常用的有MemoryCache、Redis 今天就給大家帶來MemoryCache的使用介紹!
類別
內存緩存過期時間有4種
?永不過期?絕對過期時間?相對現在的過期時間?滑動過期時間
當然也可以通過這三種過期時間衍生出 滑動窗口+絕對過期時間等等官網地址
我們也可以查看官方文檔 來詳細了解MemoryCache 這里就不做過多解讀了?MemoryCache地址
使用
回到剛才的問題 我們來介紹怎么設置過期時間!
永不過期
就是在我程序發布后只要我們不去清理該緩存,該緩存會一直有效!
///?<summary>///?永不過期時間///?</summary> static?void?NeverExpire() {_cache.Set("NeverExpire",?"1"); }絕對過期時間
用的是絕對時間點 可以理解成"截止日期"
static?void?AbsoluteExpiration(){DateTime?time?=?new?DateTime(2022,?04,?01,?23,?59,?59);_cache.Set("AbsoluteExpiration",?"20220401235959",?time); }相對現在的過期時間
相對現在的過期時間,就比如說我們設置緩存后的一分鐘內有效,可以參考我們常見的 短信登錄,后端隨機生成一個驗證碼并存入redis,并且設置該key的過期時間,然后就是校驗了,發送手機號碼和驗證碼到后臺, 從redis中取出對應的驗證碼就行校驗,如果正確就把該驗證碼刪掉,防止可以驗證多次
static?void?ExpirationTimeRelativeToThePresent(){_cache.Set("AbsoluteExpiration",?"123456",?new?TimeSpan(0,?0,?60));}滑動過期時間
緩存在設定的時間內沒有被使用,則失效,使用后緩存的過期時間重新被刷新
static?void?SlidingExpirationTime(){_cache.Set("SlidingExpirationTime",?"3",?new?MemoryCacheEntryOptions(){SlidingExpiration?=?new?TimeSpan(0,?0,?2),AbsoluteExpiration?=?DateTimeOffset.Now.AddMilliseconds(1000)});}我們來看看官網的定義如圖所示 !
然后再來解釋第二個參數MemoryCacheEntryOptions, 設置緩存項的絕對到期日期: 是當前緩存設置后的1000分鐘。像我們經常玩的英雄聯盟手游 ,我們一天不登陸,緩存的token失效, 就要重新登錄獲取token,我們每天都在玩觸發了滑動過期時間,就不需要每次啟動app時登錄賬號,但是 玩了一段時間后,發現我們還是需要重新登錄我們的賬號這個就是滑動過期時間中絕對過期時間!
獲取緩存值
ConcurrentDictionary<object, CacheEntry> _entries:一個多線程安全的字典類型, 其實緩存的本質就是這個字典,將所有緩存都放入這個字典中,然后通過字典的key(字典的key其實和緩存實體CacheEntry的key值一樣)獲取CacheEntry實體(CacheEntry實體包含key和value, 也就是我們代碼中設置的key和value)。
static?void?GetCache(){//方式一_cache.Get("NeverExpire").ToString();//方式二string?value?=?"";if?(!_cache.TryGetValue("NeverExpire",?out?value)){throw?new?Exception("不存在該緩存或者已過期");} }清除緩存值
static?void?GetCache(){string?value?=?"";if?(_cache.TryGetValue("NeverExpire",?out?value)){_cache.Remove("NeverExpire");} }可能大家發現了,我們在移除時根本就不需要value值,再去使用臨時變量,是不是有點痛苦!
其實C#也考慮到了這個問題,那么c#從7.0開始支持棄元,棄元不只是書寫和語義上的提升,它還可以減少內存分配。
將上面代碼進行一個簡化
static?void?GetCache(){if?(_cache.TryGetValue("NeverExpire",?out?_)){_cache.Remove("NeverExpire");} }完整代碼
class?Program{public?static?IMemoryCache?_cache?=?new?MemoryCache(new?MemoryCacheOptions());static?void?Main(string[]?args){_cache.Get("NeverExpire").ToString();string?value?=?"";if?(!_cache.TryGetValue("NeverExpire",?out?value)){throw?new?Exception("不存在該緩存或者已過期");}if?(_cache.TryGetValue("NeverExpire",?out?value)){_cache.Remove("NeverExpire");}if?(_cache.TryGetValue("NeverExpire",?out?_)){_cache.Remove("NeverExpire");}}///?<summary>///?永不過期時間///?</summary>static?void?NeverExpire(){_cache.Set("NeverExpire",?"1");}///?<summary>///?絕對過期時間///?</summary>static?void?AbsoluteExpiration(){DateTime?time?=?new?DateTime(2022,?04,?01,?23,?59,?59);_cache.Set("AbsoluteExpiration",?"20220401235959",?time);}///?<summary>///?相對現在的過期時間///?</summary>///?static?void?ExpirationTimeRelativeToThePresent(){_cache.Set("AbsoluteExpiration",?"123456",?new?TimeSpan(0,?0,?60));}///?<summary>///?滑動過期時間///?</summary>static?void?SlidingExpirationTime(){_cache.Set("key3",?"3",?new?MemoryCacheEntryOptions(){SlidingExpiration?=?new?TimeSpan(0,?0,?2),AbsoluteExpiration?=?DateTimeOffset.Now.AddMilliseconds(1000)});}}最后大家如果喜歡我的文章,還麻煩給個關注并點個贊, 希望net生態圈越來越好!
總結
- 上一篇: Xamarin效果第八篇之视频监控
- 下一篇: C# 线程问题之死锁