01 . Memcached簡介及部署

Memcached簡介

memcached是一個自由開源,高性能,分佈式內存對象存儲系統python

基於內存的key-valued存儲,用來存儲小塊的任意數據(字符串,對象)算法

他是一個簡潔的key-value存儲系統數據庫

# 分爲服務器和客戶端兩部分
# 1. 服務端: memcached
# 2. 客戶端: memcache

使用目的: 經過緩存數據庫查詢結果,減小數據庫訪問次數,以提升動態Web應用的速度,提升可擴展性json

Memcached特色
# 1. C/S模式架構: 由C語言編寫,總共2000多行代碼。
# 				 協議簡單: 使用的是基於文本行的協議,能經過telnet/nc直接操做Memcached服務存取數據.

# 2. 支持epoll/queue異步I/O模型: 使用libevent做爲事件處理通知機制.

# 3. Key/Value鍵值對數據類型

# 4. 純內存緩存,效率高

# 5. 支持分佈式集羣

# 6. 多進程
Memcached應用

完整緩存緩存

# 例如:京東的商品分類,就能夠事先放在Memcached裏,而後在對外提供數據訪問,這個被稱之爲「數據預熱」

熱點緩存服務器

# 熱點緩存通常是用於由用戶更新的商品,例如淘寶的賣家,當賣家新增商品後,淘寶網的程序就會把商品寫入數據庫,而後讀取寫入的數據,把這部分數據,放入 Memcached中,下一次訪問這個商品的請求直接從Memcached中取走了。

做爲集羣節點的session會話共享機制session

Memcached原理

Memcached數據存儲機制
# 須要被緩存的數據以key/value鍵值對的形式保存在服務器端預分配的內存區中,每一個被緩存的數據都有惟一的標識key,操做Memcached中的數據就是經過這個惟一標識的key進行的。
Memcached內存管理機制
# 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實例)
Memcached過時機制
# 不主動檢測item對象是否過時,而是在get時纔會檢查item對象是否過時以及是否應該刪除。
# 當刪除item對象時,通常不釋放內存空間,而是作刪除標記,將指針放入slot回收插槽,下次分配的時候能夠直接使用。
# 當內存空間滿的時候,將會根據LRU算法把最近最少使用的item對象刪除。
# 數據存入能夠設定過時時間,可是數據過時後不會被當即刪除,而是在get時檢查item對象是否過時以及是否應該刪除。
# 若是不但願系統使用LRU算法清除數據,能夠用使用-M參數。

Memcached部署

結構規劃
# 用戶名 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
下載Memcached依賴
# 安裝libevent依賴和gcc編譯工具
yum -y install libevent libevent-devel gcc
添加用戶和組
groupadd memcached;
useradd -s /sbin/nologin -d /dev/null -M -g memcached 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"
啓動Memcached
/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
Memcached啓動命令
#進程與鏈接設置:
-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基本操做

向Memcached中添加數據時,注意添加的數據通常爲鍵值對的形式,例如: key1->values1, key2->values2併發

安裝工具
yum -y install nc telnet
printf配合nc向Memcached寫入數據
# 向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命令寫入數據
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.
Memcached命令解釋
# 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/
相關文章
相關標籤/搜索