Memcached命令格式通常爲:
command
其中描述以下:
參數 | 描述 |
---|---|
command | 操做命令,通常爲set/add/replace/get/delete等 |
key | 緩存的key,Memcache內部限制不能超過250個字符, |
flag | 標識數據格式,好比JSON、XML等 |
expiration time | 過時時間,單位爲s,0爲不過時,最好設置過時時間,以避免保存大量無效數據,最大過時時間爲30天,超過30天則緩存獲取不到 |
bytes | 字節數,好比1234,則字節數爲4 |
value | 緩存中的值 |
好比如下命令:數據庫
set name 0 0 4 test// key 爲name,value爲test,字節數4個,緩存不過時
經常使用命令列表以下:json
命令 | 描述 |
---|---|
set | 添加或者更新 |
get | 獲取數據 |
add | 數據不存在的時候添加 |
replace | 數據存在的時候替換value的值 |
append | 後面追加 |
prepend | 前面追加 |
1.協議簡單緩存
server和client的通訊並不使用複雜的XML或者json協議,而是使用簡單的文本協議和二進制協議
2.內置內存存儲方式服務器
Memcached是純內存存儲,不支持持久化,所以當Memcached重啓或者機器重啓的時候全部數據會丟失。
所以會存在數據重啓沒法恢復的問題。app
3.Memcached使用客戶端分佈式分佈式
Memcached服務端沒有分佈式的功能,各個實例之間並不會互相通訊或者數據共享,所以須要依賴客戶端實現分佈式。
1.所以會存在數據重啓沒法恢復的問題 能夠經過配合持久化數據庫MemcachedDB使用 2.沒法經過key作範圍查詢 3.沒有提供高可用相關支持,只能經過客戶端邏輯來處理,好比寫入的時候同時寫入主備服務器
Memcached使用Slab Allocator機制分配和管理內存,這種分配機制能夠減小內存碎片的產生,減輕系統管理內存的負擔。memcached
Slab Allocator的分配機制其實很簡單,就是將內存分割成各類尺寸的內存快(Chunk)並將尺寸相同的內存塊分組Slab Class。其中分配的快能夠從新利用,不會釋放到內存中。
其中分配給Slab Class的內存空間爲Page(默認大小爲1MB)。
內存分配結構大體以下:
code
分配的內存快大小目前默認最小內存塊爲:88Bytes,Growth Factor決定了內存塊增加的幅度,默認值爲1.25,能夠經過啓動參數配置。server
這種分配方式在必定程度上也會形成內存的浪費,好比要保存100字節的數據的時候,只能放到112Bytes的內存塊中,剩餘的12Byte內存空間被浪費。
結構中各個部分數量的計算:
Page個數 = 內存總空間 / 1MB 各個Page中Chunk的個數 = 1MB / Chunk的大小 Chunk大小計算 = 初始值 * Growth Factor
當設置緩存的時候,會根據Item的大小來決定保存到那個Slab Class中,其中Item大小爲:
key長 + value長度 + 後綴長度 + item長度大小(32個字節)
其中Memcached能夠保存的數據Item最大爲1MB。
對於Memcached的使用中通常會出現如下問題:
1. 容量問題 單一節點沒法突破內存上限 2. 服務高可用 服務宕機會致使訪問所有穿透數據庫 3. 擴展問題 沒法突破單實例請求峯值
Memcached當達到內存上線的時候,會對內存數據進行垃圾回收,垃圾回收有兩種方式:
1.Lazy模式,Memcached不會自動去檢查數據的過時狀況,而是在查詢的時候,檢查數據的過時狀況,而後對數據進行相應處理。 2.使用LRU算法進行內存垃圾回收(最近最少使用算法) 其中垃圾回收是在Slab Class範圍內的,並非全局的LRU
對於Memcached使用集羣的方式,有兩種算法來計算緩存落在那一臺緩存機器。
方法一: key.hashCode() / 緩存節點個數 缺點:當對分佈式緩存中添加、刪除或者節點故障剔除操做中,會致使全部的歷史數據都沒法找到 方法二:使用一致性哈希算法能夠解決1中的問題
可使用明明空間,對於不一樣的系統,使用不一樣的明明空間,好比前綴:ns_