詳解C#中普通緩存的使用
一、首先,新建控制臺(tái)程序(.NET Core)、以下為項(xiàng)目結(jié)構(gòu)

- CacheHelper緩存幫助類
- DemoTest 為測(cè)試有無(wú)緩存的Demo代碼
- Program 你們懂得 就不多說(shuō)了
二、編寫緩存類
public class CacheHelper
{
//緩存容器
private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>();
/// <summary>
/// 添加緩存
/// </summary>
public static void Add(string key, object value)
{
CacheDictionary.Add(key, value);
}
/// <summary>
/// 獲取緩存
/// </summary>
public static T Get <T>(string key)
{
return (T)CacheDictionary[key];
}
/// <summary>
/// 緩存獲取方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key">緩存字典容器對(duì)應(yīng)key</param>
/// <param name="func">委托方法 傳入操作對(duì)象</param>
/// <returns></returns>
public static T GetCache<T>(string key, Func<T> func)
{
T t = default(T);
if (CacheHelper.Exsits(key))
{
//緩存存在,直接獲取原數(shù)據(jù)
t = CacheHelper.Get<T>(key);
}
else
{
//緩存不存在,去生成緩存,并加入容器
t = func.Invoke();
CacheHelper.Add(key, t);
}
return t;
}
/// <summary>
/// 判斷緩存是否存在
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static bool Exsits(string key)
{
return CacheDictionary.ContainsKey(key);
}
public static T GetCache<T>(string key, Func<T> func)我這里直接使用泛型委托封裝了緩存的方法了。當(dāng)然你也可以不封裝直接使用if else 判斷
if (CacheHelper.Exsits(key)){} else{}
但是實(shí)際開(kāi)發(fā)使用緩存應(yīng)該不是一個(gè)地方使用緩存、頻繁的使用if else 判斷代碼有點(diǎn)冗余、所有我就使用采用泛型委托方式封裝方法 這個(gè)大家可以自行選擇
以上一般采用靜態(tài)字典添加緩存數(shù)據(jù)、為了有更好的兼容性我這里直接采用泛型(泛型的好處這里就不多說(shuō)了、總之性能相對(duì)更好、能夠提高代碼的重用性)
三、編寫有緩存和沒(méi)有緩存方法
public class DemoTest
{
/// <summary>
/// 使用緩存測(cè)試
/// </summary>
/// <param name="count"></param>
/// <returns></returns>
public static List<People> CacheTest(int count)
{
People people = new People();
List<People> ListPeople = new List<People>();
for (int i = count; i < 100000; i++)
{
Console.WriteLine($"------第{i}次請(qǐng)求------");
//int result = DataSource.GetDataByDB(666);
//key的名字一定要確保請(qǐng)求的準(zhǔn)確性 DataSource GetDataByDB 666缺一不可
string key = "DataSource_GetDataByDB_666";
ListPeople = CacheHelper.GetCache(key, () => DemoTest.GetListData());
Console.WriteLine($"第{i}次請(qǐng)求獲得的數(shù)據(jù)為:{people}");
}
return ListPeople;
}
/// <summary>
/// 沒(méi)有使用緩存
/// </summary>
/// <param name="count"></param>
/// <returns></returns>
public static List<People> NoCacheTest(int count)
{
People people = new People();
List<People> ListPeople = new List<People>();
for (int i = count; i < 100000; i++)
{
Console.WriteLine($"------第{i}次請(qǐng)求------");
//int result = DataSource.GetDataByDB(666);
//key的名字一定要確保請(qǐng)求的準(zhǔn)確性 DataSource GetDataByDB 666缺一不可
string key = "DataSource_GetDataByDB_666";
//if (CacheHelper.Exsits(key))
//{
// //緩存存在,直接獲取原數(shù)據(jù)
// result = CacheHelper.Get<int>(key);
//}
//else
//{
// //緩存不存在,去生成緩存,并加入容器
// result = 78;
// CacheHelper.Add(key, result);
//}
ListPeople = GetListData();
Console.WriteLine($"第{i}次請(qǐng)求獲得的數(shù)據(jù)為:{people}");
}
return ListPeople;
}
/// <summary>
/// 讀取數(shù)據(jù)源 這里模擬數(shù)據(jù)源讀取 循環(huán)3000
/// </summary>
/// <returns></returns>
public static List<People> GetListData()
{
List<People> peoplesList = new List<People>();
for (int i = 0; i < 3000; i++)
{
People people = new People()
{
Age = i,
Name = "陳大寶" + i.ToString()
};
peoplesList.Add(people);
}return peoplesList;
}
}
四、控制臺(tái)上端調(diào)用
class Program
{
static void Main(string[] args)
{
{
Console.WriteLine("******************緩存測(cè)試****************");
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
var iResulr = DemoTest.CacheTest(0);
stopwatch.Stop();
Console.WriteLine("有緩存消耗時(shí)間為" + stopwatch.ElapsedMilliseconds);
}
{
Console.WriteLine("*****************沒(méi)有緩存測(cè)試****************");
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
var iResulr = DemoTest.NoCacheTest(0);
stopwatch.Stop();
Console.WriteLine("沒(méi)有緩存消耗時(shí)間為" + stopwatch.ElapsedMilliseconds);
}
}
}
循環(huán)10萬(wàn)次有緩存消耗時(shí)間

循環(huán)10萬(wàn)次沒(méi)有有緩存消耗時(shí)間

以上為循環(huán)10萬(wàn)次驗(yàn)證后分析:以上消耗時(shí)間為毫秒、有緩存 22282毫秒大致為0.37分鐘左右。沒(méi)有緩存 82417毫秒大致為1.37分鐘左右、兩者相差1分鐘左右、那么有朋友可能會(huì)發(fā)現(xiàn)你這也沒(méi)快多少啊、但是兄弟們實(shí)際我們?cè)谠L問(wèn)時(shí)一分鐘已經(jīng)是相當(dāng)久了、你能想象調(diào)用一次接口訪問(wèn)時(shí)間如果超過(guò)一分鐘是什么感覺(jué)?那毫無(wú)疑問(wèn)肯定得炸毛、而且我們?cè)L問(wèn)數(shù)據(jù)實(shí)際第一次肯定是要到關(guān)系型數(shù)據(jù)中獲取數(shù)據(jù)的、如果使用緩存直接第二次直接取內(nèi)存緩存(不用去再去操作數(shù)據(jù)庫(kù)IO了)、但是不使用緩存每次去操作數(shù)據(jù)庫(kù)、當(dāng)用戶量稍微多一點(diǎn)數(shù)據(jù)庫(kù)它是有性能開(kāi)銷越來(lái)越大、所以緩存是非常有效的、也是我們最能直觀立竿見(jiàn)影的效果。


總結(jié)一下哈:
到這里,緩存的使用基本結(jié)束了。最好值得一提的是,緩存盡量在數(shù)據(jù)量小、重復(fù)查詢量大的情況下使用。因?yàn)榫彺嬉彩且膬?nèi)存的,畢竟我們服務(wù)器內(nèi)存是有限的!、當(dāng)然了會(huì)有小伙伴會(huì)說(shuō)我們都已經(jīng)用Redis等等、確實(shí)現(xiàn)在緩存當(dāng)然用的比較多是Redis了、Redis好處這里就不先談了、總之本次文章是讓沒(méi)有了解普通緩存是如何使用得的小伙伴熟悉并了解、其實(shí)在這種方式在有些場(chǎng)景也是有它的好處的。
以上就是詳解C#中普通緩存的使用的詳細(xì)內(nèi)容,更多關(guān)于c# 普通緩存的使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能(1)(窗體應(yīng)用)
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)易計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
VS中模仿WPF模板創(chuàng)建最簡(jiǎn)單的WPF程序
這篇文章主要為大家詳細(xì)介紹了VS中模仿WPF模板創(chuàng)建最簡(jiǎn)單的WPF程序的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05
C#中判斷本地系統(tǒng)的網(wǎng)絡(luò)連接狀態(tài)的方法
C#中一般通過(guò)InternetGetConnectedState函數(shù)返回本地系統(tǒng)的網(wǎng)絡(luò)連接狀態(tài),下面簡(jiǎn)單介紹下,需要的朋友可以參考下2013-10-10
詳解C#應(yīng)用程序如何實(shí)現(xiàn)多屏顯示
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)把主屏運(yùn)行程序中多個(gè)窗體移動(dòng)到各個(gè)擴(kuò)展屏幕位置顯示,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-05-05
c# 實(shí)現(xiàn)子窗口關(guān)閉父窗口也關(guān)閉的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇c# 實(shí)現(xiàn)子窗口關(guān)閉父窗口也關(guān)閉的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
C#使用正則表達(dá)式實(shí)現(xiàn)漢字轉(zhuǎn)拼音
這篇文章主要為大家詳細(xì)介紹了C#如何使用正則表達(dá)式實(shí)現(xiàn)漢字轉(zhuǎn)拼音的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01

