理解 Memcached

来源:http://www.cnblogs.com/loveyx/archive/2016/03/27/5326310.html
-Advertisement-
Play Games

一、Memcached是什麼? Memcached是一個高性能的分散式記憶體對象緩存系統,可以在記憶體中緩存數據和對象來減少讀取資料庫的次數,從而提醒性能。Memcached基於一個K/V對的hashmap。 二、Memcached的特征 1. 協議簡單:基於文本協議和二進位協議進行通信 2. 基於li ...


一、Memcached是什麼?

Memcached是一個高性能的分散式記憶體對象緩存系統,可以在記憶體中緩存數據和對象來減少讀取資料庫的次數,從而提醒性能。Memcached基於一個K/V對的hashmap。

二、Memcached的特征

1. 協議簡單:基於文本協議和二進位協議進行通信

2. 基於libevent的事件處理

3. 內置記憶體存儲方式

數據存儲在記憶體中,重啟服務或系統後數據會全部消失

當記憶體容量達到指定值後,基於LRU(Least Recently Used)演算法自動刪除不適用的緩存。

4. memcached不互相通信的分散式

服務端沒有分散式供能,取決於客戶端的實現。

三、Memcached安裝

安裝命令:

sc create "Memcached Server1" start= auto binPath= "‪D:\Tools\memcached\memcached.exe -d runservice -m 32 -p 11220 -l 127.0.0.1" DisplayName= "Memcached Server1"

PS:修改下服務名字及埠號,就可以在一臺電腦上配置多個服務了。

啟動命令:

sc start "Memcached Server1"

卸載命令:

sc delete "Memcached Server1"

參數詳解:

-d選項是啟動一個守護進程,
-m是分配給Memcache使用的記憶體數量,單位是MB,我這裡是10MB,
-u是運行Memcache的用戶,我這裡是root,
-l是監聽的伺服器IP地址,如果有多個地址的話,我這裡指定了伺服器的IP地址192.168.0.200,
-p是設置Memcache監聽的埠,我這裡設置了12000,最好是1024以上的埠,
-c選項是最大運行的併發連接數,預設是1024,我這裡設置了256,按照你伺服器的負載量來設定,
-P是設置保存Memcache的pid文件,我這裡是保存在 /tmp/memcached.pid,

四、Memcached記憶體存儲機制:Slab Allocation

Slab Allocator的基本原理是按照預先規定的大小,將分配的記憶體分割成特定長度的塊, 以完全解決記憶體碎片問題。

image

Slab術語:

Page: 分配給Slab的記憶體空間,預設是1MB。分配給Slab之後根據slab的大小切分成chunk。

Chunk: 用於緩存記錄的記憶體空間

Slab Class: 特定大小的chunk的組。

memcached根據收到的數據的大小,選擇最適合數據大小的slab(圖2)。 memcached中保存著slab內空閑chunk的列表,根據該列表選擇chunk, 然後將數據緩存於其中

image

接下來,我們看一下具體的例子應用,看看chunk是怎麼分配的?

var str = "我是中國人";
for (var i = 0; i < 100; i++)
 {
        var temp = str;
        for (int j = 0; j < i; j++)
        {
            temp += str;
         }
         client.Store(StoreMode.Set, "k" + i, temp);
 }
 Console.WriteLine("chunk_size\tchunks_per_page\tchunk_key_num");
 foreach (var item in GetSlabsItemList())
{
         Console.WriteLine("{0}\t\t{1}\t\t{2}",item.chunk_size, item.chunks_per_page, item.items_number);
 }
 Console.ReadKey();

生成了100個K/V對,每一對數據量都會遞增,我們看看結果怎麼樣,如圖:

image

chunk_size表示chunk塊的大小,也可以看出目前所有的chunk塊的總數。

chunk_key_num表示當前chunk包含了多少個key。

結合上圖應該更好理解了。

五、實戰Memcached

本次實戰使用Enyim作為客戶端,具體配置如下。

app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="enyim.com">
                  <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />      
    </sectionGroup> 
  </configSections>
  <enyim.com>
    <memcached protocol="Binary">
      <servers>
        <add address="127.0.0.1" port="11220" />
        <add address="127.0.0.1" port="11221" />
        <add address="127.0.0.1" port="11222" />
      </servers>
    </memcached>
  </enyim.com>
  <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
</configuration>

實現代碼:
class Program
    {
        private static MemcachedClient client = new MemcachedClient("enyim.com/memcached");

        static void Main(string[] args)
        {
            var max = 10000;
            for (var i = 0; i < max; i++)
            {
                client.Store(StoreMode.Set, "k" + i, "v" + i);
            }
            for (var i = 0; i < max; i++)
            {
                Console.WriteLine(client.Get("k" + i));
            }
            ServerStats ss = client.Stats();
            foreach (var endpoint in ss.GetRaw("All"))
            {
                Console.WriteLine("endpoint: {0}", endpoint.Key);
                IPEndPoint ipendpoint = new IPEndPoint(endpoint.Key.Address, endpoint.Key.Port);
                Console.WriteLine("\t\tStatItem.ItemCount:{0}", ss.GetRaw(ipendpoint, StatItem.ItemCount));
                Console.WriteLine("\t\tStatItem.UsedBytes:{0}", ss.GetRaw(ipendpoint, StatItem.UsedBytes));
                Console.WriteLine("\t\tStatItem.MaxBytes:{0}", ss.GetRaw(ipendpoint, StatItem.MaxBytes));
            }

            Console.ReadKey();
        }
    }

從代碼中,可以看出,我採用了多個服務的方式,然後我插入了10000個K/V對,Enyim客戶端會根據演算法將數據劃分到不同的memcached服務中,結果如下。

image

分散式演算法參考:http://xiexiejiao.cn/java/memcached-consistent-hashing.html

參考資料:

http://kb.cnblogs.com/page/42731/

http://kb.cnblogs.com/page/42732/

http://kb.cnblogs.com/page/42733/

http://kb.cnblogs.com/page/42734/

http://xiexiejiao.cn/java/memcached-consistent-hashing.html


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

-Advertisement-
Play Games
更多相關文章
  • 靜態載入 動態載入 動態下載蘋果提供的多種字體 其他 列印出當前所有可用的字體 檢查某字體是否已經下載 這是一篇很簡短的文章,介紹了 iOS 自定義字體載入的三種方式。 靜態載入 這個可以說是最簡單最直觀的一種載入自定義字體的方式。只要字體包含到工程中,然後修改工程的 plist 文件,添加 Fon ...
  • 本次學習的內容為根據DBHelper對資料庫里的數據進行增刪改查 具體內容為: 一、編寫程式 1.創建工程——Mangage 2.在src目錄下創建五個包,分別為DAO,DBHelper,Entity,Servlet,tools 3.分別在編寫testDAO測試文件,userDAO、DBHelper ...
  • 今天在ubuntu和CentOS下,用源碼反覆安裝了許多次mysql,趁還沒忘記,趕緊記下來。。。 在ubuntu和CentOS下安裝過程倒是沒什麼差別。 0.下載源碼,傳到伺服器上 1.準備cmake和libncurse ubuntu 下用 apt-get install cmake 和apt-g ...
  • 難點主要在參數的傳遞方式吧,不過查資料後發現很簡單。 1.使用-e參數傳遞命令,適用於簡單語句 mysql -uuser -ppasswd -e "create database dbtest;" 2.使用EOF傳遞複雜語句 mysql -uuser -ppasswd <<EOF create da ...
  • 一、變數的顯示與設置 1、變數的顯示運用echo命令 +$符號: 上圖例子顯示的是系統變數,咱們可以自己設置變數 2、設置變數運用“=”符號 設置了變數NIU 值為“niunai” 變數設置規則: (1)等號兩邊不能有空格的出現 (2)變數只能是數字和字母的組合,但數字不能在前面 (3)變數值可以用... ...
  • 今天要查看伺服器和TUTK版本,看了一下資料: 新接手了幾台linux的伺服器,第一步當然是要瞭解這些伺服器的軟硬體配置.現在就寫出我這次用的一些命令. 首先當然要取得機器的IP,用戶名和密碼(呵呵,不知道就找原來的管理員要哈) 登陸之後,首先看到的就是機器的名稱,一般提示符就有了,如 [root@ ...
  • 破解的目的是將受限的個人版變為全功能的Pro版,破解後就可以使用所有功能了,界面也變成了黑色的主題。 破解網址(支持最新版的5.3.4f1): http://www.ceeger.com/forum/read.php?tid=23396&page=1 已測試破解沒有問題。 ...
  • 今天真是個鬱悶的日子,因為老師兩個星期前給我的一個任務,用遞歸演算法將Oracle資料庫中用戶信息及許可權顯示在jquery-treeView上,網上雖然有大神寫出了這類演算法,但是不貼全部代碼,真的很難跟著寫出來啊(或者本人能力有限),今天和老師爭論了一下午,老師都差點懷疑我能力有問題了,雖然我確實能力 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...