參考文章:memcached詳細
參考文章:memcached深入理解
首先需要安裝libevent
然後安裝memcache
啟動memcached
執行 /usr/local/bin/memcached -p(設定埠號) 11211 -m(設定最大記憶體數) 64m -vv(除錯資訊和錯誤資訊輸出到控制台)-u(指定使用者) root -d(作為daemon在後台啟動)
-n 45指定chunk size 實際的chunksize = 大於等於(45+48(item 結構體的大小,64位機器為48,32位機器為32,這裡用64位機器舉例))且能除盡8 的最小那個數,93 不行,94 不行,95不行,96可以,於是就是96
想要終止memcached,使用ps -aux|grep memcached 查詢程序號,然後使用kill命令殺死程序
memcached 記憶體儲存:使用slab alloction機制
slab
page(預設為1m)
chunk
乙個slab class 可以由多個page組成
每個slab class 中有大小相同的chunk空間用於儲存鍵值對資料
slab alloction的實現機制的缺點:不能充分利用記憶體的空間,選中的chunk多數時候都比要儲存的資料要大,所以會造成浪費
優點:不容易產生記憶體碎片
memcached還有其他的一些常用的命令如下:
-p 監聽的埠
-l 連線的ip位址, 預設是本機
-d start 啟動memcached服務
-d restart 重起memcached服務
-d stop|shutdown 關閉正在執行的memcached服務
-d install 安裝memcached服務
-d uninstall 解除安裝memcached服務
-u 以的身份執行 (僅在以root執行的時候有效)
-m 最大記憶體使用,單位mb。預設64mb
-m 記憶體耗盡時返回錯誤,而不是刪除項
-c 最大同時連線數,預設是1024
-f 塊大小增長因子,預設是1.25
-n 最小分配空間,key+value+flags預設是48
-h 顯示幫助
1.1 memcached配置
memcached伺服器在啟動時需要對關鍵的引數進行配置,下面我們就看一看memcached在啟動時需要設定哪些關鍵引數以及這些引數的作用。
1)-p memcached的tcp監聽埠,預設配置為11211;
2)-u memcached的udp監聽埠,預設配置為11211,為0時表示關閉udp監聽;
3)-s memcached監聽的unix套接字路徑;
4)-a 訪問unix套接字的八進位制掩碼,預設配置為0700;
5)-l 監聽的伺服器ip位址,預設為所有網絡卡;
6)-d 為memcached伺服器啟動守護程序;
7)-r 最大core檔案大小;
8)-u 執行memcached的使用者,如果當前為root的話需要使用此引數指定使用者;
9)-m 分配給memcached使用的記憶體數量,單位是mb;
10)-m 指示memcached在記憶體用光的時候返回錯誤而不是使用lru演算法移除資料記錄;
11)-c 最大併發連數,預設配置為1024;
12)-v –vv –vvv 設定伺服器端列印的訊息的詳細程度,其中-v僅列印錯誤和警告資訊,-vv在-v的基礎上還會列印客戶端的命令和相應,-vvv在-vv的基礎上還會列印記憶體狀態轉換資訊;
13)-f 用於設定chunk大小的遞增因子;
14)-n 最小的chunk大小,預設配置為48個位元組;
15)-t memcached伺服器使用的執行緒數,預設配置為4個;
16)-l 嘗試使用大記憶體頁;
17)-r 每個事件的最大請求數,預設配置為20個;
18)-c 禁用cas,cas模式會帶來8個位元組的冗餘;
memcached的一致性hash演算法(平衡性,單調性,分散性,負載)
它的最終目的是實現在移除、新增乙個cache機器時對已經存在的key對映關係的影響能夠盡可能的降到最小。
如果存在slab class1:chunk=80bytes,slab class2:chunk=160bytes,slab class3:chunk=240bytes,如果slab class3 chunk被佔滿了,下乙個資料還是選擇了slab class3,首先memcached會嘗試給該slab class3再分配乙個page,但是如果分配失敗了,就會在這個slab class裡面執行lru,將新資料存入,即使是slab class1,2都是空的也會這樣做。
chunk 裡面包含了乙個item ,item裡面為 item結構體(固定的,32位系統為32byte,64位系統為48byte)+key+value
◎memcached的理論引數計算方式
影響 memcached 工作的幾個引數有:
常量realtime_maxdelta 60*60*24*30
最大30天的過期時間
conn_init()中的freetotal(=200)
最大同時連線數
常量key_max_length 250
最大鍵長
settings.factor(=1.25)
factor將影響chunk的步進大小
settings.maxconns(=1024)
最大軟連線
settings.chunk_size(=48)
乙個保守估計的key+value長度,用來生成id1中的chunk長度(1.2)。id1的chunk長度等於這個數值加上item結構體的長度(32),即預設的80位元組。
常量power_smallest 1
最小classid(1.2)
常量power_largest 200
最大classid(1.2)
常量power_block 1048576
預設slab大小
常量chunk_align_bytes (sizeof(void *))
保證chunk大小是這個數值的整數倍,防止越界(void *的長度在不同系統上不一樣,在標準32位系統上是4)
常量item_update_interval 60
佇列重新整理間隔
常量largest_id 255
最大item鍊錶數(這個值不能比最大的classid小)
變數hashpower(在1.1中是常量hashpower)
決定hashtable的大小
根據上面介紹的內容及引數設定,可以計算出的一些結果:
1、在memcached中可以儲存的item個數是沒有軟體上限的,之前我的100萬的說法是錯誤的。
2、假設newhash演算法碰撞均勻,查詢item的迴圈次數是item總數除以hashtable大小(由hashpower決定),是線性的。
3、memcached限制了可以接受的最大item是1mb,大於1mb的資料不予理會。
4、memcached的空間利用率和資料特性有很大的關係,又與dont_prealloc_slabs常量有關。 在最差情況下,有198個slab會被浪費(所有item都集中在乙個slab中,199個id全部分配滿)。
儲存:儲存的資料的key+value的長度找到合適的slabs,如果沒有空間則分配新page,如果沒有page了則使用lru置換舊資料,然後儲存到相應位置
查詢:儲存的key+value 長度找到合適的slabs,然後遍歷slabs上面的元素,直到找到,感覺有點像hashmap。
如果要用到分布式,需在客戶端使用分布式演算法定位到對應的memcached伺服器,然後再執行上面步驟,一般使用一致性hash演算法。
linux memcached相關命令
telnet localhost 200001 登陸 stats 檢視狀態 flush all 清理 quit 退出 echo flush all nc localhost 200001 1 資料儲存 假設key為test,value為12345 printf set test 0 0 5 r n1...
linux memcached開機啟動
方法一 在 etc rc.d rc.local 加入以下 usr local memcached bin memcached u root d m 2048 l 192.168.70.1 p 11211 p tmp memcached.pid 所有機器都能訪問 usr local memcached...
linux memcached狀態查詢
linux memcached狀態查詢 如何檢視memcache伺服器端版本 memcached h memcache的執行狀態可以方便的用 stats 命令顯示。首先用telnet 127.0.0.1 11211這樣的命令連線上memcache,然後直接輸入stats就可以得到當前memcache...