memcached是一個自由開源,高性能,分佈式內存對象存儲系統
python
基於內存的key-valued存儲,用來存儲小塊的任意數據(字符串,對象)
算法
他是一個簡潔的key-value存儲系統
數據庫
# 分爲服務器和客戶端兩部分 # 1. 服務端: memcached # 2. 客戶端: memcache
使用目的: 經過緩存數據庫查詢結果,減小數據庫訪問次數,以提升動態Web應用的速度,提升可擴展性
json
# 1. C/S模式架構: 由C語言編寫,總共2000多行代碼。 # 協議簡單: 使用的是基於文本行的協議,能經過telnet/nc直接操做Memcached服務存取數據. # 2. 支持epoll/queue異步I/O模型: 使用libevent做爲事件處理通知機制. # 3. Key/Value鍵值對數據類型 # 4. 純內存緩存,效率高 # 5. 支持分佈式集羣 # 6. 多進程
完整緩存
緩存
# 例如:京東的商品分類,就能夠事先放在Memcached裏,而後在對外提供數據訪問,這個被稱之爲「數據預熱」
熱點緩存
服務器
# 熱點緩存通常是用於由用戶更新的商品,例如淘寶的賣家,當賣家新增商品後,淘寶網的程序就會把商品寫入數據庫,而後讀取寫入的數據,把這部分數據,放入 Memcached中,下一次訪問這個商品的請求直接從Memcached中取走了。
做爲集羣節點的session會話共享機制
session
# 須要被緩存的數據以key/value鍵值對的形式保存在服務器端預分配的內存區中,每一個被緩存的數據都有惟一的標識key,操做Memcached中的數據就是經過這個惟一標識的key進行的。
# Memcached採用了以下機制: # 1. 採用slab內存分配機制 # 2. 採用LRU對象清除機制 # 3. 採用hash機制快速檢索item
memcached是利用Slab Allocation機制來分配和管理內存的,提早將
大內存分配大小爲1MB
的若干個slab
,而後針對每一個slab
再進行小對象填充
,這個小對象稱爲chunk
,避免大量重複的初始化和清理,減輕了內存管理器的負擔。多線程
Slab Allocation
內存分配的原理是按照預先規定的大小,將分配給Memcached服務的內存預先分割成特定長度的內存塊(chunk),再把尺寸相同的內存塊(chunk)分紅組(chunks slab class),這些內存塊不會釋放,能夠重複利用架構
# 小結 # 1. Memcached早期內存管理機制爲malloc(動態內存分配) # 2. lab內存分配機制能夠解決內存碎片的問題 # 3. Memcached服務的內存預先分割成特定長度的內存塊,稱爲chunk,用於緩存數據的內存空間或內存塊,至關於磁盤的block,只不過磁盤的每個block都是相等的,而chunk只有在同一個Slab Class內纔是相等的。 # 4. Slab Class指特定大小(1MB)的包含多個chunk的集合或組,一個Memcached包含多個Slab Class,每一個Slab Class包含多個相同大小的chunk。 # 5. Slab機制缺點: 例如,Chunk空間會有浪費(經過調優因子以及大小接近的數據放入一個MC實例)
# 不主動檢測item對象是否過時,而是在get時纔會檢查item對象是否過時以及是否應該刪除。 # 當刪除item對象時,通常不釋放內存空間,而是作刪除標記,將指針放入slot回收插槽,下次分配的時候能夠直接使用。 # 當內存空間滿的時候,將會根據LRU算法把最近最少使用的item對象刪除。 # 數據存入能夠設定過時時間,可是數據過時後不會被當即刪除,而是在get時檢查item對象是否過時以及是否應該刪除。 # 若是不但願系統使用LRU算法清除數據,能夠用使用-M參數。
# 用戶名 memcached # 用戶組 memcached # 端口 11211 # 源碼包 /root/memcached-1.5.9.tar.gz # 解壓後源碼 /root/memcached-1.5.9 # 編譯目錄 /root/ # 安裝目錄 /usr/local/memcached # 工做目錄 /var/sites/memcached
[root@memcached-1 ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) [root@memcached-1 ~]# uname -r 3.10.0-514.el7.x86_64
# 安裝libevent依賴和gcc編譯工具 yum -y install libevent libevent-devel gcc
groupadd memcached; useradd -s /sbin/nologin -d /dev/null -M -g memcached memcached;
wget -O ./memcached-1.5.9.tar.gz http://www.memcached.org/files/memcached-1.5.9.tar.gz tar xvf memcached-1.5.9.tar.gz cd memcached-1.5.9 ./configure --prefix=/usr/local/memcached --prefix=/usr/local/memcahced/ make && make install
mkdir -p /var/sites/memcached-1.5.9/etc/ cp /root/memcached-1.5.9/scripts/memcached.sysconfig /var/sites/memcached-1.5.9/memcached cat /var/sites/memcached-1.5.9/memcached |sed -e "s/#.*/ /g" |uniq |awk '{if (length !=0) print $0}' USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="" PORT="11211"
/usr/local/memcahced/bin/memcached -m 16m -p 11211 -d -u memcached -c 8192 # 驗證啓動結果 [root@localhost memcahced]# ps -ef |grep memcached |grep -v grep memcach+ 10363 1 0 07:48 ? 00:00:00 ./bin/memcached -m 16m -p 11211 -d -u memcached -c 8192 # 啓動多實例Memcached /usr/local/memcahced/bin/memcached -m 16m -p 11212 -d -u memcached -c 8192 # 啓動多實例Memcached指定PID文件 memcached -m 16m -p 11211 -d -u root -c 8192 -P /var/run/11211.pid # 此時咱們能夠經過kill 命令指定pid文件關閉Memcached kill `cat /var/run/11211.pid` # 加入開機自啓動 # 把上述兩個實例的啓動命令放入/etc/rc.local,以便下次開機能夠自啓動。 tail -2 /etc/rc.local memcached -m 16m -p 11211 -d -u root -c 8192 memcached -m 16m -p 11212 -d -u root -c 8192 # 關閉能夠用killall ,pkill
#進程與鏈接設置: -d 以守護進程(daemon)方式運行服務 -u 指定運行Memcached的用戶,若是當前用戶爲root,須要使用此參數指定用戶 -l 指定Memcached進程監聽的服務器IP地址,能夠不設置此參數 -p(小寫)指定Memcached服務監聽TCP端口號。默認爲11211 -P(大寫)設置保存Memcached的pid文件($$),保存PID到指定文件 #內存相關設置: -m 指定Memcached服務能夠緩存數據的最大內存,默認爲64MB -M Memcached服務內存不夠時禁止LRU,若是內存滿了會報錯 -n 爲key+value——flags分配的最小內存空間,默認爲48字節 -f chunk size增加因子,默認爲1.25 -L 啓用大內存頁,能夠下降內存浪費,改進性能 #併發鏈接設置: -c 最大的併發鏈接數,默認是1024 -t 線程數,默認4.因爲Memcached採用的是NIO,因此太多線程做用不大 -R 每一個event最大請求數,默認是20 -C 禁用CAS(能夠禁止版本計數,減小開銷) #測試參數: -v 打印較少的errors/warnings -vv 打印很是多調試信息和錯誤輸出到控制檯 -vvv 打印極多的調試信息和錯誤輸出,也打印內部狀態轉變 #其餘選項可經過在命令行輸入「memcached -h」命令來顯示
向Memcached中添加數據時,注意添加的數據通常爲鍵值對的形式,例如: key1->values1, key2->values2
併發
yum -y install nc telnet
# 向memcached寫入數據 printf "set key1 0 0 5\r\nzhou\r\n" nc 127.0.0.1 11211 # replace 更新數據 printf "replace key1 0 0 7\r\nxmh\r\n" | nc 127.0.0.1 11211 # 配合printf配置nc從Memcached中讀取數據 printf "get key1\r\n" | nc 127.0.0.1 11211 # 經過printf配合nc從Memcached中刪除數據 printf "delete key1\r\n" | nc 127.0.0.1 11211
telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. set user01 0 0 7 #寫入數據,建立key,長度等 jason12 #數據長度要和value一致 STORED get user01 #瀏覽數據 VALUE user01 0 7 jason12 END delete user01 #刪除數據,刪除的是key DELETED get user01 #再次瀏覽數據,數據被刪除 END quit #quit退出 Connection closed by foreign host.
# 1. set 設置數據 # 2. get 獲取數據 # 3. delete 刪除數據 # 4. replace 更新數據 # 操做Memcached 相關命令語法 set key1 0 0 6 \r\n benet \r\n <command name><key><flags><exptime><bytes><datablock><string><datablock> command # 命令參數(set、get、delete、replace) key # key 用於查找緩存值,要求小於250字符,不包含空格和控制字段 flags # 用戶端用來表示數據格式數值,如json、xml、壓縮等 exptime # 在緩存中保存鍵值對的時間長度(以秒爲單位,0 表示永遠) bytes # 在緩存中存儲的字節數 datablock # 文本行,以\r\n結尾 string # 鍵值對應的緩存內容
memcached-tool
源碼包內置了一個 perl 寫的
scripts/memcached-tool
管理腳本,能夠用來查看 Memcached 的運行狀態。
注:這個腳本並不會自動安裝到安裝目錄中,所以要使用的話要手動複製過去
cd /root/memcached-1.5.9 cp /root/memcached-1.5.9/scripts/memcached-tool /usr/local/memcahced/bin/