麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

【PaPaPa】實(shí)現(xiàn)緩存決策

2019-11-17 01:59:57
字體:
供稿:網(wǎng)友

【PaPaPa】實(shí)現(xiàn)緩存決策 - 讓你的緩存變的有智慧

我有話說

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

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

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

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

緩存決策

先澄清下,這個名字是我杜撰的,因?yàn)槲矣X得在我的項(xiàng)目中它起到了這樣的作用。

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

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

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

說白了就是選擇使用數(shù)據(jù)庫還是緩存。

如何適合緩存決策

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

因?yàn)槲覒校晕乙朕k法偷懶。

我希望有一個類庫可以幫助我來判斷當(dāng)前的數(shù)據(jù)是到緩存里取,還是數(shù)據(jù)庫里取。

而為了實(shí)現(xiàn)這樣的一個功能,我覺得我應(yīng)該建立一個規(guī)則,這個規(guī)則來幫助我判斷當(dāng)前數(shù)據(jù)在緩存里是不是有一份拷貝。

我對緩存的判斷規(guī)則有什么要求?

就以目前項(xiàng)目來說,我緩存是整表緩存的,所以我需要判斷的是當(dāng)前數(shù)據(jù)是屬于哪個表。

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

只要滿足上面的條件,說明當(dāng)前數(shù)據(jù)在緩存里是有拷貝的。

如何管理這些判斷規(guī)則?

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

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

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

 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

這里的代碼用到了老趙博客中的一篇關(guān)于“逆泛型”的代碼,這里是未經(jīng)優(yōu)化的,寫的倉促。

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

這里只是創(chuàng)建了一個最基礎(chǔ)的封裝過的“字典”,用于管理判斷規(guī)則。

初始化判斷規(guī)則

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

細(xì)心的朋友可能會發(fā)現(xiàn),EqualsMonitorManager的TValue需要繼承自IEquatable接口,因?yàn)閮?nèi)部判斷相等是用了這個接口的Equals方法。

那么,我們第一個緩存決策類出現(xiàn)了,它就是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

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

TableName表示緩存的表名,F(xiàn)ields是使用了RedisHGet命令的一個參數(shù)名,表示哪些字段可以作為關(guān)鍵字來查詢數(shù)據(jù)或者說需要緩存哪些字段為關(guān)鍵字。

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

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 91 免费看片 | 中韩毛片 | 精品国产一区二区三区四区在线 | 黄色片网站免费在线观看 | 一区二区精品视频在线观看 | 成人免费观看毛片 | 国产1区2区在线 | 国产精品aⅴ | av成人免费观看 | 国产亚洲精品久久久久久久久 | 中国漂亮护士一级a毛片 | 毛片区| 中韩毛片 | 最新一区二区三区 | 91精品国产刺激国语对白 | 免费在线观看一级片 | 欧美成人理论片乱 | 国产一区免费 | 成人毛片网站 | 国产成人精品区一区二区不卡 | 久久精品99国产国产精 | 久久久tv | 色婷婷久久久久久 | 成人午夜视频免费看 | 国产在线地址 | 久久精品毛片 | 日韩a毛片免费观看 | 狠狠干夜夜操 | 九九热在线视频观看这里只有精品 | 欧美日性 | 香蕉视频h | 亚洲 91| 欧洲成人在线视频 | 超碰97国产在线 | 九色成人在线 | 国产精品久久久网站 | 91www成人久久| 久久综合精品视频 | 深夜福利视频绿巨人视频在线观看 | 亚洲人成电影在线 | 欧美人与牲禽动交精品一区 |