memcached文檔

memcached文檔

memcached介紹

Memcached 是國外 社區 網站 LiveJournal 的開發團隊開發的 高性能的分佈式內
存緩存服務器。一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪
問次數,以提高動態 Web 應用的速度、提高可擴展性

基於 libevent 的事件處理

libevent 是一套跨平臺的事件處理接口的封裝,能夠兼容包括這些操作系統:
Windows/Linux/BSD/Solaris 等操作系統的的事件處理。
包裝的接口包括:
poll 、 select(Windows) 、 epoll(Linux) 、 kqueue(BSD) 、 /dev/pool(Solaris)
Memcached 使用 libevent 來進行網絡併發連接的處理,能夠保持在很大併發情
況下,仍舊能夠保持快速的響應能力。

Memcached 的主要特點

  • 基於 C/S 架構, 協議簡單
  • 基於 libevent 的事件處理
  • 自主內存存儲處理
  • 基於客戶端的 Memcached

自主的內存存儲處理

  • 數據 存儲方式: Slab Allocation
  • 數據 過期 方式: Lazy Expiration + LRU

數據存儲方式: Slab Allocation

Slab Allocator 的基本原理是按照預先規定的大小,將分配的內存分割成特定長度的塊,以完全解決內存碎片問題。
Slab Allocation 的原理相當簡單。 將分配的內存分割成各種尺寸的塊(chunk),並把尺寸相同的塊分成組(chunk 的集合)

Page : 分配給 Slab 的內存空間,默認是1MB 。分配給 Slab 之後根據 slab 的大小
切分成 chunk 。

Chunk : 用於緩存記錄的內存空。

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

memcached 根據收到的數據的大小,選擇最適合數據大小的 slab 。

memcached 中保存着 slab 內空閒 chunk 的列表,根據該列表選擇 chunk ,然後將數據緩存於其中。

Slab Alloction 缺點

這個問題就是,由於分配的是特定長度的內存,因此無法有效利用分配的內存。例如,將 100 字節的數據緩存到 128 字節的 chunk 中,剩餘的 28 字節就浪費了

數據過期方式

  • Lazy Expiration

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

  • LRU

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

memcached語法

命令:
統計類:stats, stats items, stats slabs, stats sizes
存儲類:set, add, replace, append, prepend
命令格式:<command name> <key> <flags> <exptime> <bytes>  <cas unique>
檢索類:get, delete, incr/decr
清空:flush_all

示例:
telnet> add KEY <flags> <expiretime> <bytes> \r
telnet> VALUE


-p <num> 監聽的 TCP 端口 ( ( 缺省 : 11211)
-d 以守護進程方式運行 Memcached
-u <username> 運行 Memcached 的賬戶,非 root 用戶
-m <num> 最大的內存使用,  單位是 MB , 缺省是  64 MB
-c <num> 軟連接數量,  缺省是  1024
-v 輸出警告和錯誤信息
-vv 打印客戶端的請求和返回信息
-h 打印幫助信息
-i 打印 memcached 和 libevent
-M:內存耗盡時,不執行LRU清理緩存,而是拒絕存入新的緩存項,直到有多餘的空間可用時爲止;
-f <factor>:增長因子;默認是1.25-t <threads>:啓動的用於響應用戶請求的線程數
-U <num>:Listen on UDP port <num>, the default is port 11211, 0 is off.


memcached默認沒有認證機制,可借用於SASL進行認證;
SASL:Simple Authentication Secure Layer



啓動
systemctl start memcached

連接
telnet localhost 11211

Memcached 一些特性和限制

  • 在 Memcached 中可以保存的 item 數據量是沒有限制的,只有內存足夠
  • Memcached 單進程最大使用內存爲 2G ,要使用更多內存,可以分多個端口開啓多個 Memcached 進程
  • 最大 30 天的數據過期時間, 設置爲永久的也會在這個時間過期,常量 REALTIME_MAXDELTA 60* * 60* * 24* * 30 控制

  • 最大鍵長爲 250 字節,大於該長度無法存儲,常量 KEY_MAX_LENGTH 250 控制

  • 單個 item 最大數據是 1MB ,超過 1MB 數據不予存儲,常量 POWER_BLOCK 1048576 進行控制,它是默認的 slab 大小

  • 最大同時連接數是 200 ,通過 conn_init() 中的 freetotal 進行控制,最大軟連接數是 1024 ,通過settings.maxconns=1024 進行控制

  • 跟空間佔用相關的參數: settings.factor=1.25, settings.chunk_size=48, 影響 slab
  • 調優slab 比如memcached -f 1.5 -vv
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章