1.Memcached常用命令總結
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個,緩存不過期
常用命令列表如下:
命令 | 描述 |
---|---|
set | 添加或者更新 |
get | 獲取數據 |
add | 數據不存在的時候添加 |
replace | 數據存在的時候替換value的值 |
append | 后面追加 |
prepend | 前面追加 |
2.Memcached主要特征
1.協議簡單
server和client的通信並不使用復雜的XML或者json協議,而是使用簡單的文本協議和二進制協議
2.內置內存存儲方式
Memcached是純內存存儲,不支持持久化,因此當Memcached重啟或者機器重啟的時候所有數據會丟失。
因此會存在數據重啟無法恢復的問題。
3.Memcached使用客戶端分布式
Memcached服務端沒有分布式的功能,各個實例之間並不會互相通信或者數據共享,因此需要依賴客戶端實現分布式。
3.Memcached存在的問題
1.因此會存在數據重啟無法恢復的問題
可以通過配合持久化數據庫MemcachedDB使用
2.無法通過key做范圍查詢
3.沒有提供高可用相關支持,只能通過客戶端邏輯來處理,比如寫入的時候同時寫入主備服務器
4.Memcached內存存儲分析
Memcached使用Slab Allocator機制分配和管理內存,這種分配機制可以減少內存碎片的產生,減輕系統管理內存的負擔。
Slab Allocator的分配機制其實很簡單,就是將內存分割成各種尺寸的內存快(Chunk)並將尺寸相同的內存塊分組Slab Class。其中分配的快可以重新利用,不會釋放到內存中。
其中分配給Slab Class的內存空間為Page(默認大小為1MB)。
內存分配結構大致如下:
分配的內存快大小目前默認最小內存塊為:88Bytes,Growth Factor決定了內存塊增長的幅度,默認值為1.25,可以通過啟動參數配置。
這種分配方式在一定程度上也會造成內存的浪費,比如要保存100字節的數據的時候,只能放到112Bytes的內存塊中,剩余的12Byte內存空間被浪費。
結構中各個部分數量的計算:
Page個數 = 內存總空間 / 1MB
各個Page中Chunk的個數 = 1MB / Chunk的大小
Chunk大小計算 = 初始值 * Growth Factor
當設置緩存的時候,會根據Item的大小來決定保存到那個Slab Class中,其中Item大小為:
key長 + value長度 + 后綴長度 + item長度大小(32個字節)
其中Memcached可以保存的數據Item最大為1MB。
5.Memcached典型問題分析
對於Memcached的使用中一般會出現以下問題:
1. 容量問題
單一節點無法突破內存上限
2. 服務高可用
服務宕機會導致訪問全部穿透數據庫
3. 擴展問題
無法突破單實例請求峰值
Memcached當達到內存上線的時候,會對內存數據進行垃圾回收,垃圾回收有兩種方式:
1.Lazy模式,Memcached不會自動去檢查數據的過期情況,而是在查詢的時候,檢查數據的過期情況,然后對數據進行相應處理。
2.使用LRU算法進行內存垃圾回收(最近最少使用算法)
其中垃圾回收是在Slab Class范圍內的,並不是全局的LRU
對於Memcached使用集群的方式,有兩種算法來計算緩存落在那一台緩存機器。
方法一: key.hashCode() / 緩存節點個數
缺點:當對分布式緩存中添加、刪除或者節點故障剔除操作中,會導致所有的歷史數據都無法找到
方法二:使用一致性哈希算法可以解決1中的問題
數據一致性問題怎么解決
key沖突的問題解決
可以使用明明空間,對於不同的系統,使用不同的明明空間,比如前綴:ns_