Memcache存儲機制與指令彙總

来源:http://www.cnblogs.com/phpstudy2015-6/archive/2017/03/31/6653199.html
-Advertisement-
Play Games

1、memcache基本簡介 memcached是高性能的分散式記憶體緩存伺服器。一般的使用目的是,通過緩存資料庫查詢結果,減少資料庫訪問次數,以提高動態Web應用的速度、提高可擴展性。 Memcache的運行圖: Memcache的特征 memcached作為高速運行的分散式緩存伺服器,具有以下的特 ...


1、memcache基本簡介

  memcached是高性能的分散式記憶體緩存伺服器。一般的使用目的是,通過緩存資料庫查詢結果,減少資料庫訪問次數,以提高動態Web應用的速度、提高可擴展性。

Memcache的運行圖:

Memcache的特征

memcached作為高速運行的分散式緩存伺服器,具有以下的特點。

  1、基於C/S架構協議簡單

  memcached的伺服器客戶端通信並不使用複雜的XML等格式,而使用簡單的基於文本行的協議。 因此,通過telnet也能在memcached上保存數據、取得數據。

  2、基於libevent的事件處理

  libevent是個程式庫,它將Linux的epoll、BSD類操作系統的kqueue等事件處理功能封裝成統一的介面。即使對伺服器的連接數增加,也能發揮O(1)的性能。memcached使用這個libevent庫,因此 能在Linux、BSD、Solaris等操作系統上發揮其高性能。

  3、內置記憶體存儲方式

  為了提高性能,memcached中保存的數據都存儲在memcached內置的記憶體存儲空間中。由於數據僅存在於記憶體中,因此重啟memcached、重啟操作系統會導致全部數據消失。另外,內容容量達到指值之後,就基於LRU(Least Recently Used)演算法自動刪除不使用的緩存。memcached本身是為緩存 而設計的伺服器,因此並沒有過多考慮數據的永久性問題。

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

  memcached儘管是“分散式”緩存伺服器,但伺服器端並沒有分散式功能。各個memcached不會互 相通信以共用信息。那麼,怎樣進行分散式呢?這完全取決於客戶端的實現。(如下圖所示)

 

2、理解memcache的記憶體存儲

  2.1、存儲機制

  Memcache採用的是Slab Allocator方式進行存儲數據。這一機制可以很好的整理記憶體,以便重覆利用,從而解決了記憶體碎片的問題。在該機制出現以前,記憶體的分配是通過對所有記錄簡單地進行malloc和free來進行的。但是,這種方式會導致記憶體碎片,加重操作系統記憶體管理器的負擔,最壞的情況下,會導致操作系統比memcached進程本身還慢。

  2.2Slab Allocator基本原理

  1、按照預先規定的大小,將分配的記憶體以page(預設每個page為1M)為單位分為特定的塊(chunk),並且把相同大小的chunk分成組(chunk的集合);

  2、存儲數據時,將會尋找與value大小相近的chunk區域進行存儲;

  3、記憶體一旦以page的形式分配出去,在重啟前不會被回收或者重新分配,以解決記憶體碎片問題。(分配的記憶體不會釋放,而是重覆利用)

  2.3、理解四個名詞

  【可參考下麵的形象解析圖進行理解】

  Slab

  用於表示存儲的最大size數據,僅僅只是用於定義(通俗的講就是表示可以存儲數據大小的範圍)。預設情況下,前後兩個slab表示存儲的size以1.25倍進行增長。例如slab1為96位元組,slab2為120位元組

  Page

  分配給Slab的記憶體空間,預設為1MB。分給Slab後將會根據slab的大小切割成chunk

  Chunk

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

  Slab calss

  特定大小的Chunk集合

  2.4Slab的記憶體分配具體過程

  Memcached在啟動時通過-m參數指定最大使用記憶體,但是這個不會一啟動就占用完,而是逐步分配給各slab的。如果一個新的數據要被存放,首先選擇一個合適的slab,然後查看該slab是否還有空閑的chunk,如果有則直接存放進去;如果沒有則要進行申請,slab申請記憶體時以page為單位,無論大小為多少,都會有1M大小的page被分配給該slab(該page不會被回收或者重新分配,永遠都屬於該slab)。申請到page後,slab會將這個page的記憶體按chunk的大小進行切分,這樣就變成了一個chunk的數組,再從這個chunk數組中選擇一個用於存儲數據。若沒有空閑的page的時候,則會對改slab進行LRU,而不是對整個memcache進行LRU。

形象解析圖:(這圖湊合湊合就好了哈,不是很專業2333

 

  2.5Memcache存儲具體過程

  Memcached並不是將所有大小的數據都放在一起的,而是預先將數據空間劃分為一系列slabs,每個slab只負責一定範圍內的數據存儲。memcached根據收到的數據的大小,選擇最適合數據大小的slab。假若這個slab仍有空閑chunk的列表,根據該列表選擇chunk,然後將數據緩存於其中;若無則申請page(1M)【可以參考上面我畫的形象圖23333】

具體分析:從上面我們瞭解到slab的作用。Slab的增長因數預設以1.25倍進行增長。那為什麼會導致有些不是1.25倍呢?答案是受小數的影響,你可以使用-f int測試個整數增長因數看看效果。【後面具體講解】

以下圖進行分析,例如slab中112位元組,表示可以存儲大於88位元組且小於或等於112位元組的value。

 

  2.6Slab Allocator缺點

  Slab Allocator解決了當初的記憶體碎片問題,但新的機制也給memcached帶來了新的問題。

  這個問題就是,由於分配的是特定長度的記憶體,因此無法有效利用分配的記憶體。例如,將100位元組 的數據緩存到128位元組的chunk中,剩餘的28位元組就浪費了(如下圖所示)。

 

  2.7、使用-f增長因數進行調優

  增長因數就是相鄰兩個chunk之間的增長倍數。這個參數memcache預設是1.25,但是我們先採用整數2來測試一下,看看效果。

  由圖中我們可以看到chunk size的增長是2倍的。

  我們再來看看-f 1.25的效果

為什麼1.25倍增長因數就不能保證全部相鄰的chunk size是1.25倍增長呢?

因為這些誤差是為了保持位元組數的對齊而故意設置的。

兩圖一對比,可見,因數為1.25組間差距比因數為2時小得多,更適合緩存幾百位元組的記錄。

因此,使用memcached時,最好是重新計算一下數據的預期平均長度,調整growth factor,以獲得最恰當的設置。

 

3、memcache刪除機制

  從上面我們知道,已經分配出去的記憶體是不會被釋放回收的,記錄超時後,客戶端就無法看到該記錄,其存儲空間即可重覆使用。

  3.1Lazy Expiration

  memcached內部不會監視記錄是否過期,而是在get時查看記錄的時間戳,檢查記錄是否過期。這種技術被稱為lazy(惰性)expiration。因此,memcached不會在過期監視上耗費CPU時間。

  3.2LRU刪除

  memcached會優先使用已超時的記錄的空間,但即使如此,也會發生追加新記錄時空間不足的情況, 此時就要使用名為Least Recently Used(LRU)機制來分配空間。顧名思義,這是刪除“最近最少 使用”的記錄的機制。因此,當memcached的記憶體空間不足時(無法從slab class獲取到新的空間時),就從最近未被使用的記錄中搜索,並將其空間分配給新的記錄。從緩存的實用角度來看,該模型十分理想。

不過,有些情況下LRU機制反倒會造成麻煩。memcached啟動時通過“­M”參數可以禁止LRU。

  啟動時必須註意的是,小寫的“­m”選項是用來指定最大記憶體大小的。不指定具體數值則使用預設 值64MB。

  指定“­M”參數啟動後,記憶體用盡時memcached會返回錯誤。話說回來,memcached畢竟不是存儲器,而是緩存,所以推薦使用LRU。

 

4、啟動memcache參數

【黑體字的參數較為常用】

-p<num>

監聽的TCP埠(預設:11211)

-U<num>

UDP監聽埠(預設:11211 0關閉)

-d

以守護進程方式運行

-u<username>

指定用戶運行

-m<num>.

最大記憶體使用,單位MB。預設64MB

-c<num>

最大同時連接數,預設是1024

-v

輸出警告和錯誤消息

-vv

列印客戶端的請求和返回信息

-h

幫助信息

-l<ip>

綁定地址(預設任何ip地址都可以訪問)

-P<file>

將PID保存在file文件

-i

列印memcached和libevent版權信息

-M

禁止LRU策略,記憶體耗盡時返回錯誤

-f<factor>

增長因數,預設1.25

-n<bytes>

初始chunk=key+suffix+value+32結構體,預設48位元組

-L

啟用大記憶體頁,可以降低記憶體浪費,改進性能

-l

調整分配slab頁的大小,預設1M,最小1k到128M

-t<num>

線程數,預設4。由於memcached採用NIO,所以更多線程沒有太多作用

-R

每個event連接最大併發數,預設20

-C

禁用CAS命令(可以禁止版本計數,減少開銷)

-b

Set the backlog queue limit (default: 1024)

-B

Binding protocol-one of ascii, binary or auto (default)

-s<file>

UNIX socket

-a<mask>

access mask for UNIX socket, in octal (default: 0700)

5、Memcache指令彙總

 

指令

描述

例子

get key

#返回對應的value

get mykey

set key 標識符 有效時間 長度

key不存在添加,存在更新

set mykey 0 60 5

add key標識符 有效時間 長度

#添加key-value值,返回stored/not_stored

add mykey 0 60 5

replace key標識符 有效時間 長度

#替換key中的value,key存在成功返回stored,key不存在失敗返回not_stored

replace mykey 0 60 5

append key標識符 有效時間 長度

#追加key中的value值,成功返回stored,失敗返回not_stored

append mykey 0 60 5

prepend key標識符 有效時間 長度

#前置追加key中的value值,成功返回stored,失敗返回not_stored

 

prepend mykey 0 60 5

incr key num

#給key中的value增加num。若key中不是數字,則將使用num替換value值。返回增加後的value

Incre mykey 1

decr

#同上

同上

delete key [key2…]

刪除一個或者多個key-value。成功刪除返回deleted,不存在失敗則返回not_found

delete mykey

flush_all [timeount]

#清除所有[timeout時間內的]鍵值,但不會刪除items,所以memcache依舊占用記憶體

flush_all 20

version

#返回版本號

version

verbosity

#日誌級別

verbosity

quit

#關閉連接

quit

stats

#返回Memcache通用統計信息

stats

stats slabs

#返回Memcache運行期間創建的每個slab的信息

stats slabs

stats items

#返回各個slab中item的個數,和最老的item秒數

stats items

stats malloc

#顯示記憶體分配數據

stats malloc

stats detail [on|off|dump]

#on:打開詳細操作記錄、off:關閉詳細操作記錄、dump顯示詳細操作記錄(每一個鍵的get、set、hit、del的次數)

stats detail on

stats detail off

stats detail dump

stats cachedump slab_id limit_num

#顯示slab_id中前limit_num個key

stats cachedump 1 2

stats reset

#清空統計數據

stats reset

stats settings

#查看配置設置

stats settings

stats sizes

#展示了固定chunk大小中的items的數量

Stats sizes

註意:標識符:一個十六進位無符號的整數(以十進位來表示),需和數據一起存儲,get的時候一起返回

ps:最近老是思考以後的方向,感覺有點迷茫,都不能好好學習了。要儘快調整好心態,切勿浮躁,欲速則不達。 

 

 

參考資料:

1、Memcached原理與使用詳解            作者:heiyeluren(黑夜路人)

  http://blog.csdn.net/heiyeshuwu

2 、memcached 全面剖析                作者:長野雅廣、前阪徹   charlee 譯

3、Memcache 記憶體分配策略和性能(使用)狀態檢查  作者:jyzhou

  http://www.cnblogs.com/zhoujinyi/p/5554083.html

 

 作者:那一葉隨風

 聲明:轉載時請在文章頁面明顯位置給出原文鏈接

 


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

-Advertisement-
Play Games
更多相關文章
  • 建表 在這裡呢我們先來建立兩張有外鍵關聯的張表。 CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`tbl_dept`( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHA ...
  • 在統計查詢中,經常會用到count函數,這裡是基礎的 MYSQL 行轉列 以及基本的聚合函數count,與group by 以及distinct組合使用 ...
  • 閱讀目錄 (1)選擇最有效率的表名順序(只在基於規則的優化器中有效) (2)WHERE子句中的連接順序 (3)SELECT子句中避免使用 ‘ * ‘ (4)減少訪問資料庫的次數 (5)在SQL*Plus , SQL*Forms和Pro*C中重新設置ARRAYSIZE參數, 可以增加每次資料庫訪問的檢 ...
  • 感慨一句,現在寫的sql語句自己是越來越看不懂了 。。。囧 使用場景:最近做畢設的時候碰見這麼一個場景(仿攜程網) 先看大的,按航班號查詢出3條數據。這個好弄 group by(航班)就行。點擊訂票,跳出兩個欄目,經濟艙和頭等艙分別帶餘票數。查航班餘票數好解決,條件那加 count(航班)就行。難點 ...
  • 本文出處:http://www.cnblogs.com/wy123/p/6646143.html SQLServer中開啟CDC之後,在某些情況下會導致事務日誌空間被占滿的現象為:在執行增刪改語句(產生事務日誌)的過程中提示,The transaction log for database '*** ...
  • 案例環境: 操作系統: Windows 2003 SE 32bit(SP2) 資料庫版本:Microsoft SQL Server 2005 - 9.00.5069.00 (Intel X86) Aug 22 2012 16:01:52 Copyright (c) 1988-2005 Microso... ...
  • MySQL - 事務 在學習事務這一概念前,我們需要需要構思一個場景 場景構思 假設該場景發生於一個銀行轉賬背景下,月中,又到了發工資的日子。潭州教育科技集團打算給Tuple老師發放一個月的工資。(此處,我們假設轉賬都是由人工操作的),整個過程本應該如下: 公司財務核對Tuple老師工資單 確認公司 ...
  • 接著上篇博客,我們來談談java操作cassandra分頁,需要註意的是這個分頁與我們平時所做的頁面分頁是不同的,具體有啥不同,大家耐著性子往下看。 上篇博客講到了cassandra的分頁,相信大家會有所註意:下一次的查詢依賴上一次的查詢(上一次查詢的最後一條記錄的全部主鍵),不像mysql那樣靈活 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...