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

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

【PaPaPa】實現緩存決策

2019-11-17 01:59:57
字體:
來源:轉載
供稿:網友

【PaPaPa】實現緩存決策 - 讓你的緩存變的有智慧

我有話說

本來這一篇我打算放到后面再說,可是之前泄漏了一點關于緩存決策的代碼后被好多人催更了。

在此感謝大家的支持,讓我更有動力的寫這個系列。你們的關注讓我覺得我的決定是對的,我會堅持下去把這個項目做完。

另外非常感謝老虎,在百忙之中給我們趕出需求文檔,當我們在享受周末的時候他還在公司加班,即便這樣,他依然為我們的開源項目奉獻著。

此時我不知道該說些什么,只能以我的行動來回報大家,廢話不多說了,入正題。

緩存決策

先澄清下,這個名字是我杜撰的,因為我覺得在我的項目中它起到了這樣的作用。

緩存:在我做的這個功能中涉及到內存和redis兩部分的緩存。

決策:我從百度找的翻譯,指做出決定或選擇,是一種“在各種替代方案中考慮各項因素作出選擇”的認知、思考過程。

那么緩存決策到底是干什么的?

說白了就是選擇使用數據庫還是緩存。

如何適合緩存決策

緩存決策的由來 - 我是懶人

因為我懶,所以我要想辦法偷懶。

我希望有一個類庫可以幫助我來判斷當前的數據是到緩存里取,還是數據庫里取。

而為了實現這樣的一個功能,我覺得我應該建立一個規則,這個規則來幫助我判斷當前數據在緩存里是不是有一份拷貝。

我對緩存的判斷規則有什么要求?

就以目前項目來說,我緩存是整表緩存的,所以我需要判斷的是當前數據是屬于哪個表。

既然如此,那我判斷的依據應該是這樣:緩存決策規則.表名列表.包含(數據.表名) == true

只要滿足上面的條件,說明當前數據在緩存里是有拷貝的。

如何管理這些判斷規則?

繼續上面提到的包含,我們再分析一下,包含的判斷依據其實是逐一比對相等,所以我想了個類名:EqualsMonitorManager,這里的Monitor是監視器的意思,后面的類都會跟這個詞有關。

這個類有4個基本的方法:Add、Remove、Get、IsMonitoring,看起來其實是很像字典的對吧?其實內部實現確實依賴了字典,對字典做了一些封裝。

為了方面以后擴展支持到更多場景而不局限于緩存,我定義的時候使用到了泛型。

 1     public static partial class EqualsMonitorManager<TKey, TValue> 2         where TValue : IEquatable<TValue> 3     { 4         PRivate static class MonitorCaller<TCallerKey> 5         { 6             public static Action<TCallerKey, TValue> Add; 7  8             public static Action<TCallerKey> Remove; 9 10             public static Func<TCallerKey, Func<TValue, bool>, TValue> Get;11 12             public static Func<TCallerKey, TValue, bool> IsMonitoring;13         }14 15         #region Members16 17         private static Dictionary<string, List<TValue>> _dicStringMonitor = new Dictionary<string, List<TValue>>();18 19         #endregion20 21         static EqualsMonitorManager()22         {23             StringMonitorCallerInit();24         }25 26         private static void StringMonitorCallerInit()27         {28             MonitorCaller<string>.Add = (string key, TValue value) =>29             {30                 if (!_dicStringMonitor.ContainsKey(key))31                 {32                     _dicStringMonitor.Add(key, new List<TValue>());33                 }34 35                 _dicStringMonitor[key].Add(value);36             };37 38             MonitorCaller<string>.Remove = (string key) =>39             {40                 if (_dicStringMonitor.ContainsKey(key))41                     _dicStringMonitor.Remove(key);42             };43 44             MonitorCaller<string>.Get = (string key, Func<TValue, bool> predicate) =>45             {46                 if (_dicStringMonitor.ContainsKey(key))47                     return _dicStringMonitor[key].FirstOrDefault(predicate);48                 else49                     return default(TValue);50             };51 52             MonitorCaller<string>.IsMonitoring = (string key, TValue value) =>53             {54                 if (!_dicStringMonitor.ContainsKey(key))55                 {56                     return false;57                 }58 59                 return _dicStringMonitor[key].Exists(x => x.Equals(value));60             };61         }62     }
View Code

 1     public static partial class EqualsMonitorManager<TKey, TValue> 2     { 3         public static void Add(TKey key, TValue value) 4         { 5             if (key == null) 6             { 7                 throw new ArgumentNullException(); 8             } 9             MonitorCaller<TKey>.Add(key, value);10         }11 12         public static void Remove(TKey key)13         {14             if (key == null)15             {16                 throw new ArgumentNullException();17             }18             MonitorCaller<TKey>.Remove(key);19         }20 21         public static TValue Get(TKey key, Func<TValue, bool> predicate)22         {23             if (key == null)24             {25                 throw new ArgumentNullException();26             }27             return MonitorCaller<TKey>.Get(key, predicate);28         }29 30         public static bool IsMonitoring(TKey key, TValue value)31         {32             if (key == null)33             {34                 throw new ArgumentNullException();35             }36 37             return MonitorCaller<TKey>.IsMonitoring(key, value);38         }39     }
View Code

這里的代碼用到了老趙博客中的一篇關于“逆泛型”的代碼,這里是未經優化的,寫的倉促。

這里我就不多解釋為什么會這么寫這個類了,有興趣可以去翻老趙的博客,寫的很詳細,對于初學者來說這里有點繞,建議可以去看看。

這里只是創建了一個最基礎的封裝過的“字典”,用于管理判斷規則。

初始化判斷規則

有了管理規則的類,那么我們的項目中首先要做的就是初始化這些規則,否則沒有規則后面的寫下去也用不了。

細心的朋友可能會發現,EqualsMonitorManager的TValue需要繼承自IEquatable接口,因為內部判斷相等是用了這個接口的Equals方法。

那么,我們第一個緩存決策類出現了,它就是RedisCacheMonitor。

 1     public class RedisCacheMonitor : IEquatable<RedisCacheMonitor> 2     { 3         public string Key { get { return MonitorConstant.REDIS_KEY; } } 4  5         public string TableName { get; set; } 6  7         public string[] Fields { get; set; } 8  9         #region IEquatable<RedisCacheMonitor> 成員10 11         public bool Equals(RedisCacheMonitor other)12         {13             if (other == null)14             {15                 return false;16             }17 18             return this.TableName == other.TableName;19         }20 21         #endregion22     }
View Code

我們可以發現,這個類的自由度很大,唯一的約束就是要實現IEquatable接口,這樣EqualMonitorManager的可擴展性就充分被利用了起來。而RedisCacheMonitor就可以任由我們來發揮,我們只需要告訴EqualMonitorManager如何去判斷相等即可。

TableName表示緩存的表名,Fields是使用了RedisHGet命令的一個參數名,表示哪些字段可以作為關鍵字來查詢數據或者說需要緩存哪些字段為關鍵字。

接下來就是如何把一個RedisCacheMonitor加入到EqualMonitorManager

1 var monitor = new RedisCacheMonitor() { TableName = "User", Fields = new string[] { "Id", "UserName" } };2 EqualsMonitorManager<string, RedisCacheMonitor>.Add(monitor.Key, monitor);

是的,就這么簡單,我們的緩存規則就加完了。剩下就是操作Redis,把User表緩存起來我就不

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97免费视频在线播放| 国产精品 欧美在线| 久久精品福利视频| 裸体女人亚洲精品一区| 91在线|亚洲| 日韩av在线导航| 久久久久久久久久国产精品| 欧美老少做受xxxx高潮| 狠狠躁夜夜躁人人爽超碰91| 国产精品第一区| 欧美国产在线视频| 久久久久久国产| 国产精品美女久久久免费| 国产精品高清网站| 成人午夜小视频| 精品国产一区二区三区四区在线观看| 欧美人与性动交| 国产一区二区三区四区福利| 欧美人与性动交| 国产成人高潮免费观看精品| 欧美大尺度在线观看| 久久成年人视频| 欧美色播在线播放| 欧美激情中文字幕在线| 欧美国产中文字幕| 亚洲欧美日韩国产精品| 亚洲最大福利视频网站| 国产精品爽爽爽| 日韩动漫免费观看电视剧高清| 欧美性少妇18aaaa视频| 热99久久精品| www.亚洲人.com| 欧美黑人巨大xxx极品| 国产精品欧美一区二区三区奶水| 久久久精品影院| 国产亚洲视频在线| 亚洲国产欧美一区| 成人xvideos免费视频| 日韩av有码在线| 欧美性猛交xxxx偷拍洗澡| 亚洲成色www8888| 97久久精品人搡人人玩| 亚洲黄色www| 国语对白做受69| 中文字幕av一区| 这里只有精品丝袜| 亚洲黄色www网站| 欧美激情成人在线视频| 国产精品日韩在线一区| 亚洲自拍欧美另类| 国产欧美在线播放| 国产精品久久久久aaaa九色| 国产精品一区二区三区久久| 青草青草久热精品视频在线观看| 色哟哟网站入口亚洲精品| 少妇高潮久久77777| 中文字幕成人精品久久不卡| 久久视频免费在线播放| 亚洲a级在线播放观看| 免费91麻豆精品国产自产在线观看| 91精品国产91久久久久久久久| 欧美亚洲视频一区二区| 亚洲精品久久久一区二区三区| 久久久亚洲国产天美传媒修理工| 国产精品亚洲片夜色在线| 欧美成人午夜激情在线| 亚洲精品视频在线观看视频| 欧美一级bbbbb性bbbb喷潮片| 国产精品91免费在线| 欧美性猛交xxxx免费看久久久| 中文字幕日韩在线观看| www.色综合| 国产精品揄拍一区二区| 91精品视频大全| 久久久国产精品亚洲一区| 57pao成人永久免费视频| 欧美日韩国内自拍| 久久成人一区二区| 91av中文字幕| 5252色成人免费视频| 欧美wwwxxxx| 亚洲国产精品999| 欧美极品少妇全裸体| 亚洲二区在线播放视频| 91高潮精品免费porn| 亚洲综合自拍一区| 欧美亚州一区二区三区| 26uuu另类亚洲欧美日本一| 隔壁老王国产在线精品| 国产精品欧美日韩一区二区| 国产成人精品免高潮在线观看| 麻豆国产精品va在线观看不卡| 亚洲激情成人网| 欧美性猛交xxxx久久久| 欧美黑人一区二区三区| 欧美激情久久久久久| 性欧美长视频免费观看不卡| 国产欧美 在线欧美| 日韩精品在线免费观看视频| 欧美亚洲国产视频小说| 92福利视频午夜1000合集在线观看| 欧美怡红院视频一区二区三区| 欧美激情a∨在线视频播放| 日韩福利伦理影院免费| 97视频网站入口| 美日韩精品免费观看视频| 欧美日本黄视频| 久久人91精品久久久久久不卡| 色哟哟网站入口亚洲精品| 不卡在线观看电视剧完整版| 午夜精品久久久久久久久久久久| 欧美激情在线观看| 国产精品69精品一区二区三区| 亚洲国产精品va在线观看黑人| 亚洲aⅴ男人的天堂在线观看| 欧美最猛性xxxxx亚洲精品| 亚洲午夜av电影| 精品久久久久久久中文字幕| 亚洲白虎美女被爆操| 亚洲伊人久久大香线蕉av| 亚洲精品www久久久久久广东| 亚洲欧美日韩一区二区在线| 中文日韩电影网站| 国产97在线|亚洲| 国产国产精品人在线视| 亚洲性69xxxbbb| 色综合五月天导航| 亚洲午夜久久久影院| 久久天天躁狠狠躁夜夜躁| 国产成人精品午夜| 中文字幕亚洲一区| 日韩精品日韩在线观看| 韩国v欧美v日本v亚洲| 国产精品久久久久久久久久三级| 欧美性感美女h网站在线观看免费| 国产精品久久久久久av福利软件| 久久久久久伊人| 中文字幕一精品亚洲无线一区| 欧美性一区二区三区| 日韩激情视频在线播放| 欧美理论电影在线观看| 一本色道久久88精品综合| 亚洲欧美国产精品va在线观看| 欧美日韩ab片| 国产视频精品久久久| 亚洲第一区中文字幕| 国产精品27p| 国产剧情日韩欧美| 日韩精品极品在线观看播放免费视频| 亚洲在线免费视频| 久久久久久有精品国产| 国产精品1区2区在线观看| 欧美激情一级欧美精品| 夜夜嗨av色一区二区不卡| 欧美激情第6页| 亚洲精品第一国产综合精品| 欧美风情在线观看| 91夜夜揉人人捏人人添红杏| 国产精品欧美日韩一区二区| 国内偷自视频区视频综合| 久久久久久高潮国产精品视| 中文字幕在线看视频国产欧美| 日韩电影免费观看中文字幕| 91精品在线影院|