因MemoryCache鬧了個笑話

2021-10-21 00:00:56 字數 2995 閱讀 9463

是這麼一回事:

我正在苦思乙個業務邏輯,捋著我還剩不多的秀髮,一時陷入冥想中……

突然聊天圖示一頓猛閃,開啟一看,有同事語音;

大概意思是:同事把專案中redis部分快取換成memorycache/memcached,還強調memorycache/memcached的效率是redis的2~5倍;

當時我想到的是memcached,聽到的似乎也是,心想:怎麼可能,就算有效能差,也不至於那麼多;

因為當時同事**還沒提交,然後就陷入討論ing,最後還是沒聊通,我就跑到同事那當面溝通(要去打架嗎,不不不,文明人);

溝通中…..,好幾分鐘過去了,突然同事說:他用的是微軟的memorycache

雖然從讀音上我還沒區分出來,但一聽微軟,我就感覺我成笑話啦;

然後趕緊讓同事開啟**,我擦,真成笑話啦,還理直氣壯的溝通了好幾十分鐘。

為什麼會那麼「理直氣壯」?

最後因為memorycache成就了一場笑話,那memorycachememcached有什麼區別呢?

memcached是分布式快取,是儲存在公共機器上的,供不同程式使用的,存在一定的網路傳輸消耗。

這樣比較感覺有點勉強,雖然memcached是分布式的,但也是基於記憶體的,在資料儲存記憶體的邏輯還是不同的,不過這裡不打算講解原始碼,我要說應用,哈哈哈。

附加-為什麼redis讓同事感覺效能不好

真實場景是這樣的,客戶端開啟多執行緒頻繁讀取redis資料,當訪問比較多時,導致redis讀取資料超過20毫秒,對於web專案來說其實這還好,20毫秒的響應使用者根本無法感知。但對於乙個高效能要求的服務程式來說,對通訊要求就比較高,所以簡單分析了一下拖慢的原因,大概以下兩點:

回歸正題,既然說到memorycache,就來簡單聊聊,主要分享在專案實戰中如何使用;

主要依賴包:microsoft.extensions.caching.memory

memorycache的使用很簡單,就是在呼叫方法設定和獲取值就對啦;來直接看demo吧;

1. 控制台demo

其實有很多程式是基於後台服務執行的,並不都是web,所以寫了乙個控制台的demo,方便小夥伴參考;

1.2 編寫示例**及註冊相關服務

注:autofac不是必須的,根據自己需要進行選擇使用,這裡是為了要使用autofac的切面程式設計功能。

1.3 兩種方式進行快取處理

通常在非web程式中,有以下兩種方式進行快取處理:

**嵌入到業務邏輯,在真實業務邏輯處進行快取獲取或設定;

這樣很大乙個缺點是每乙個快取的資料都需要手動到指定業務邏輯中新增快取處理,**後期不好維護,快取功能的開啟和關閉也不好控制,需要修改**進行滿足。

面向切面程式設計,無需嵌入多餘**到業務中

通過面向切面的思想,以動態**的原理攔截方法,在方法前後進行處理,如下:

快取邏輯直接放在***中處理即可,如下:

註冊服務時,開啟autofac的面向切面功能即可

執行看效果,第二次都是從快取中獲取資料,美美噠:

注:推薦使用面向切面的形式進行處理,這樣快取功能可插拔,**維護性也好。

2.webapidemo(專案名稱為:memorycachewebapidemo)

在webapi中使用就比較簡單啦,關於memorycache的依賴包已經整合在框架中,如果需要使用,直接註冊服務就可以用啦;通常在webapi中進行快取處理的方式有三種:

這裡就用過濾器的形式進行demo演示,走起來~~~

2.1 編寫過濾器

快取如果能在最前面處理,就優先在最前面,所以使用的resourcefilter過濾器;關於過濾器之前寫過一篇文章很詳細(跟我一起學.netcore之mvc過濾器,這篇看完走路可以仰著頭走),這裡就不贅述了。

然後在startup.cs中註冊服務和將自定義過濾器註冊即可,如下:

然後啟動執行,多次請求除錯看看效果(小夥伴自己在過濾器中除錯即可);

在webapi中也可以使用業務層面向切面的方式進行相關業務處理,整合autofac即可;小夥伴可以參照這篇文章(跟我一起學.netcore之asp.netcore中整合autofac擴充套件)。關於aop面向切面程式設計這塊,後續單獨整理一篇分享;

在一些開發專案中,可能會使用dictionary進行資料快取,如果是這樣,可以嘗試使用memorycache,效能合理利用cpu,而且還是執行緒安全的;另外在高併發場景,可以用其作為多級快取,因為memorycache還能設定過期時間,搭配redis配合使用,效果槓槓的。

乙個被程式搞醜的帥小伙,關注"code綜藝圈",跟我一起學~~~

因乙個delete引發的思考

請看這樣一段 class test test volatile int m value int main int argc,char ar 請問這段 如何輸出?可能會有人回答崩了呀,然而實驗多次,程式依舊堅挺,輸出也正確,為啥呢?我們最主要的問題就在於delete到底做了什麼,釋放記憶體導致是怎麼釋...

Just for fun 分解乙個正整數的質因數

為什麼我要記錄這個問題,因為之前面試的時候遇到過,當時自己寫的演算法不好,所以,在此記錄一下 是基於python3寫的 人生苦短,寫演算法請用python,web的話請用php def prime n l while n 1 for i in range 2,n 1 if n i 0 n int n...

做乙個「因房」痛苦的廣州人

嗯,看了題目也知道不是俺,因為俺不是廣州人。不過最近因為房子問題關注了一下新聞,發現原來因為房子而痛苦萬分的人還真不少。下面的這篇來自於 南方 2006 5 24 今天 的一篇報道。看看吧,鬱悶的很。原文出處 http www.nanfangdaily.com.cn southnews dd dsb...