dotnet緩存

来源:https://www.cnblogs.com/snail-wn/archive/2023/02/21/17141894.html
-Advertisement-
Play Games

Net 內置記憶體緩存 asp.net 中是有緩存的實現:HttpContext.Cache,緩存的數據是放到 Web 伺服器的進程 記憶體里。 在控制台、WinForm、子線程、SignalR 等不支持 HttpContext 的地方還可以使用 MemoryCache.Default(System.R ...


Net 內置記憶體緩存

asp.net 中是有緩存的實現:HttpContext.Cache,緩存的數據是放到 Web 伺服器的進程 記憶體里。

在控制台、WinForm、子線程、SignalR 等不支持 HttpContext 的地方還可以使用 MemoryCache.Default(System.Runtime.Caching 這個程式集中) ,HttpContext.Cache 其實就是 對 MemoryCache 的封裝。

//寫入:
MemoryCache.Default.Add("age", 666, DateTimeOffset.Now.AddMinutes(1)); 
//讀取: 
if(MemoryCache.Default.Contains("name")) 
{  
    int age = (int)MemoryCache.Default["age"];                
} 

進程內緩存最大的優點就是效率高。在可預期數據量不大的情況下推薦使用。 如果數據量比較大或者集群伺服器比較多,就要用單獨的分散式緩存了,也就是搞一臺 或者多台專門伺服器保存緩存數據,所有伺服器都訪問分散式緩存伺服器。

Memcached

簡介

Memcached 是一個專門用來做緩存的伺服器,而且緩存的數據都在記憶體中。Memcached 就相當於一個 Dictionary 鍵值對集合,保存的是鍵值對,然後根據 key 取 value。 當然 web 伺服器和 Memcached 之間還是要網路間通訊,效率還是沒有進程內緩存效率 高。Memcached 程式重啟之後數據就會消失。

安裝

memcached.exe -d install

卸載

memcached.exe -d uninstall

.Net 連接 memcached 安裝

Memcached 的.Net 開發包:Install-Package EnyimMemcached

  1. Memcache 存入的是鍵值對。Memcache 存入數據的 3 中模式 Set、Replace、Add,根據名 字就能猜出來:
  • Set:存在則覆蓋,不存在則新增
  • Replace:如果存在則覆蓋,並且返回 true;如果不存在則不處理,並且返回 false;
  • Add:如果不存在則新增,並且返回 true;如果存在則不處理,並且返回 false;

沒特殊要求一般用 Set 就可以了。

MemcachedClientConfiguration mcConfig = new MemcachedClientConfiguration(); mcConfig.AddServer("127.0.0.1:11211");
//必須指定埠 
using (MemcachedClient client = new MemcachedClient(mcConfig)) 
{  
    client.Store(Enyim.Caching.Memcached.StoreMode.Set, "name", "rsfy"); 
} 

如果保存普通類對象,則對象必須可序列化(不同 Memcached 客戶端保存對象的機制 都不盡相同)。

2)存入設置過期時間 設置最後一個 TimeSpan 類型的參數:

client.Store(Enyim.Caching.Memcached.StoreMode.Set, "name", "yzk",TimeSpan.FromSeconds(5)); 

如果之前對於同一個 Key 設置過一個過期時間,之後又設置過一個,以最後一次的為準。

3)讀取:如果找不到,則返回 null

client.Get("name");

當然也可以用

public bool TryGet(string key, out object value)

當然還支持泛型的

public T Get<T>(string key)
  1. Remove(string key)則是刪除一個 key 對應的內容。 Key 的長度最高是 250 個字元,Value 最長 1M。 與 Store、Get、Remove 配套的還有 ExecuteXXX 方法,唯一區別就是返回值信息更詳細。

5)Key 的選擇: Memcaced就相當於一個大鍵值對,不同系統放到Memcached中的數據都是不隔離的, 因此設定 Key 的時候要選擇好 Key,這樣就不容易衝突。建議規則“系統名字_模塊名字_業務_Key”,比如“Shop_Admin_FilterWords”

6) Increment、Decrement 是用來對計數器進行增減的,不過用得少。用 Redis 更合適。

Cas 操作:

用來解決併發問題:讀出一個值,做一些判斷或者處理,再寫回,有可能有併發的問題。 Cas 是 Memcached 1.2.5 之後引入的特性,類似於資料庫的“樂觀鎖”,查詢的時候查出一個 cas 值,在寫入的時候帶著這個 cas 值,如果發現 cas 值已經變了,則說明已經有別人改過了。 下麵的程式:

var cas = client.GetWithCas("Name"); 
Console.WriteLine("按任意鍵繼續");
Console.ReadKey();
var res = client.Cas(Enyim.Caching.Memcached.StoreMode.Set, "Name", cas.Result + "1", cas.Cas); 
if(res.Result) {  
    Console.WriteLine("修改成功"); 
} else {  
    Console.WriteLine("被別人改了"); 
}  

啟動兩個實例,測試效果。 Memcached 一般就是做緩存用,因此也不要用這個 Cas。

memcached 的集群

memcached 重啟之後短時間內大量的請求會涌入資料庫,給資料庫造成壓力,解決這 個的方法就是使用集群,有多台 Memcached 伺服器提供服務。 當 memcached 伺服器壓力大了之後也有必要搞 memcached 集群來分擔壓力。 Memcached 伺服器的“雪崩”問題:如果所有緩存設置過期時間一樣,那麼每隔一段 時間就會造成一次資料庫訪問的高峰:

**解決的方法就是緩存時間設置不一樣,比如加上一個隨機數。 **

Memcached 的集群實現很簡單,集群節點直接不進行通訊、同步,只要在多個伺服器 上啟動多個 Memcached 伺服器即可,客戶端決定把數據寫入不同的實例,不搞主從複製, 每個資料庫實例保存一部分內容。 然後 mcConfig.AddServer("127.0.0.1:11211");添加多個伺服器 ip 地址,然後客戶端根據 自己的演算法決定把數據寫入哪個 Memcached 實例,取資料庫的時候再根據同樣的定位演算法 去哪台伺服器上去取。 節點定位演算法有很多種,最常用的有兩種 Ketama、VBucket。Ketama 是根據 Key 算出一 個 hash 值,根據 hash 值再算到伺服器;而 VBucket 也是根據 key 算出 hash 值,但是不是直 接根據 hash 值算出服務地址,而是維護一個 VBucket 表,在表中指定不同的 hash 值由不同 的伺服器處理,還可以臨時改變指向。建議用 Ketama 就可以了。節點定位演算法會自動處理 故障伺服器。

mcConfig.NodeLocatorFactory = new KetamaNodeLocatorFactory()。

緩存要求都 不高。

Memcached 封裝示例

public static class MemcachedHelper
{
    public static readonly MemcachedHelperClientConfiguration mcConfig = new MemcachedClientConfiguration();
    public static readonly MemcachedClient client = null;
    static MemcachedHelper()
    {
        mcConfig.AddServer("127.0.0.1:11211");
        client = new MemcachedClient(mcConfig);
    }

    public static T GetOrSet<T>(string key, object value) where T : class
    {

        var getdata = Get<T>(key);
        if (getdata != null)
        {
            return getdata;
        }
        else
        {
            Set(key, value);
            return Get<T>(key);
        }
    }

    public static void Set(string key, object value)
    {
        client.Store(Enyim.Caching.Memcached.StoreMode.Set, key, JsonConvert.SerializeObject(value));
    }

    public static T Get<T>(string key) where T : class
    {
        try
        {
            return JsonConvert.DeserializeObject<T>(client.Get(key).ToString());
        }
        catch (Exception e)
        {
            return null;
        }
    }

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Spring Boot 是什麼 世界上最好的文檔來源自官方的《Spring Boot Reference Guide》,是這樣介紹的: Spring Boot makes it easy to create stand-alone, production-grade Spring based A ...
  • 最近OpenAI的ChatGPT真的是到處都在刷屏,我想你已經看過很多關於ChatGPT的文章或者視頻了,我就不過多介紹了。 不過你碰巧還不知道的話,可以先百度一下,然後再回來繼續。 與ChatGPT對話很有趣,甚至很有啟發性。有人用它聊天,有人用它寫代碼,太多省時省力的工作,都可以由它完成,我們的 ...
  • MD_CHANGE_MRP_DATA:在我看來,它是MRP上最重要的BAdI。它允許您在物料需求計劃或 MD04 交易記錄期間更改任何物料需求計劃元素。最常見的用途是使物料需求計劃元素與物料需求計劃無關,但它也可用於其他更改,例如數量更改。您可以在文檔“使用 BAdI MD_CHANGE_MRP_D ...
  • 這篇文章主要描述分散式通信中的發佈訂閱模式,這是一種非同步通信模式,它可以解耦消息的生產者和消費者,提高系統的穩定性。同時,文章也描述了Kafka的架構以及主題、分區和消費組。 ...
  • 輸入輸出 print()函數 sep=' ' 數據之間一空格分割,預設是空格 end='\n' 在列印後會額外的加一個數據,預設是換行符 print("hello", "world") print("hello", "world", sep=' ') """ 上面兩行代碼輸出語句分別為: hello ...
  • cron 有2種表達形式 6個時間刻度的話 * * * * * * 分別對應 秒 分 時 日 月 星期 ; 7個時間刻度的話 * * * * * * * 分別對應 秒 分 時 日 月 星期 年; >>>註意 時間刻度之間得用 ‘空格’分隔 對應的通配符有: * ? / - , 星號(*): 指的是 ...
  • 阿裡雲物聯網平臺專用工具基本涵蓋了阿裡雲物聯網平臺提供你主要管理功能,可以方便創建產品、設備、物模型,查看設備實時屬性,事件,發送服務和查看服務日誌等等 ...
  • 近期,業務調整,需要內網讀取數據後存入到外網,同時,其他伺服器也需要讀取數據,於是我又盯上了RabbitMQ。在展開業務代碼前,先看下RabbitMQ整體架構,可以看到Exchange和隊列是多對多關係。 下麵,我們詳細說說RabbitMQ的隊列模式:簡單隊列、工作隊列、發佈訂閱模式、路由模式、主題 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...