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

- CacheHelper緩存幫助類
- DemoTest 為測試有無緩存的Demo代碼
- Program 你們懂得 就不多說了
二、編寫緩存類
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">緩存字典容器對應(yīng)key</param>
/// <param name="func">委托方法 傳入操作對象</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{}
但是實際開發(fā)使用緩存應(yīng)該不是一個地方使用緩存、頻繁的使用if else 判斷代碼有點冗余、所有我就使用采用泛型委托方式封裝方法 這個大家可以自行選擇
以上一般采用靜態(tài)字典添加緩存數(shù)據(jù)、為了有更好的兼容性我這里直接采用泛型(泛型的好處這里就不多說了、總之性能相對更好、能夠提高代碼的重用性)
三、編寫有緩存和沒有緩存方法
public class DemoTest
{
/// <summary>
/// 使用緩存測試
/// </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}次請求------");
//int result = DataSource.GetDataByDB(666);
//key的名字一定要確保請求的準(zhǔn)確性 DataSource GetDataByDB 666缺一不可
string key = "DataSource_GetDataByDB_666";
ListPeople = CacheHelper.GetCache(key, () => DemoTest.GetListData());
Console.WriteLine($"第{i}次請求獲得的數(shù)據(jù)為:{people}");
}
return ListPeople;
}
/// <summary>
/// 沒有使用緩存
/// </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}次請求------");
//int result = DataSource.GetDataByDB(666);
//key的名字一定要確保請求的準(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}次請求獲得的數(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;
}
}
四、控制臺上端調(diào)用
class Program
{
static void Main(string[] args)
{
{
Console.WriteLine("******************緩存測試****************");
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
var iResulr = DemoTest.CacheTest(0);
stopwatch.Stop();
Console.WriteLine("有緩存消耗時間為" + stopwatch.ElapsedMilliseconds);
}
{
Console.WriteLine("*****************沒有緩存測試****************");
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
var iResulr = DemoTest.NoCacheTest(0);
stopwatch.Stop();
Console.WriteLine("沒有緩存消耗時間為" + stopwatch.ElapsedMilliseconds);
}
}
}
循環(huán)10萬次有緩存消耗時間

循環(huán)10萬次沒有有緩存消耗時間

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


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

