內存緩存軟件 (內存比磁盤快)php
分爲服務端和客戶端 html
服務端 memcached前端
客戶端memcachemysql
誕生的緣由。linux
2003年誕生了memcachednginx
web1.0 2005之前 企業提供內容爲主。web
web2.0 2005-2012 企業只提供平臺,用戶參與上傳和下載內容。算法
目標:sql
解決高併發訪問的問題,減輕傳統數據庫mysql的壓力。數據庫
不關注數據可靠性,只關心高併發讀寫。
差別化發展。
企業應用場景:
1、數據庫前端的緩存
讀數據: 開發程序從邏輯上,首先訪問memcached。若是memcached沒有所須要的數據在訪問mysql。
寫數據: 若是在寫數據庫的同時,把數據庫寫入到memcached。或者寫入mysql的同時,由mysyl複製到memcached。
linux運維角色,搭建memcached服務,提供服務(使用的信息問開發)
2、集羣后端的共享會話服務session
session門票。若是在網站內有了這個門票,就能夠瀏覽任意界面。
解決共享會話的方案:
1)nginx的調度算法IP_hash(缺點:致使負載不均衡)
2)經過memcached作會話共享。
3)cookies(放在用戶瀏覽器端)優勢:能夠大併發。缺點:容易篡改,不安全。
搭建memcached服務
1、libevent(epoll模型,libevent做爲事件通知機制)
yum install libevent-devel -y
rpm -qa libevent-devel
2、下載memcached
yum install memcached -y
rpm -qa memcached
3、啓動服務並檢查
[root@db01 ~]# memcached -m 16m -c 2048 -uroot -p 11211 -d
-m 指定內存 -c 多少訪問鏈接 -u 指定用戶 -p 指定端口號 -d 以守護進程的方式
[root@db01 ~]# netstat -lntp|grep memcache
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 4026/memcached
tcp 0 0 :::11211 :::* LISTEN 4026/memcached
MySQL數據庫管理 |
Memcached管理 |
MySQL的insert語句 |
Memcached的set命令 |
MySQL的select語句 |
Memcached的get命令 |
MySQL的delete語句 |
Memcached的delete命令 |
操做Memcached的相關命令的語法
如下爲操做Memcached的相關命令基本語法:
set key 0 0 0
<command name> <key> <flags> <exptime> <bytes>\r\n
<datablock>\r\n
<status>\r\n
命令 |
說明 |
command name |
set不管如何都進行寫入數據,會覆蓋老數據 add只有對應數據不存在時才添加數據 repalce只有數據存在時進行替換數據 append日後追加:append<key>datablock<status>? prepend往前追加:prepend<key>datablock<status> cas按版本號更改 |
key |
普通字符串,要求小於250個字符,不包含空格和控制字符 |
flags |
客戶端用來標識數據格式的數值,如json、xml、壓縮等 |
exptime |
存活時間s,0爲永遠,小於30天,60*60*24*30爲秒數 大於30天爲unixtime |
bytes |
byte字節數,不包含\r\n,根據長度截取存/取的字符串,能夠是0,即存空串 |
datablock |
文本行,以\r\n結尾,固然能夠包含\r或\n |
status |
STORED/NOT_FOUND |
下載telnet 和 nc包
yum install telnet nc -y
telnet方式
存進去 拿出來 刪除掉
[root@web03 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set k1 0 0 6
oldboy
STORED
get k1
VALUE k1 0 6
oldboy
END
delete k1
DELETED
用nc方式
[root@web03 ~]# printf "set key008 0 06\r\noldboy\r\n"|nc 127.0.0.1 11211
STORED
用printf方式查看
printf "get key008\r\n"|nc127.0.0.1 11211
刪除
printf "delete key008\r\n"|nc127.0.0.1 11211
三種 寫入 讀取刪除
[root@web03 ~]#printf "set key008 0 0 6\r\noldboy\r\n"|nc 127.0.0.1 11211
STORED
[root@web03 ~]# printf"get key008\r\n"|nc 127.0.0.1 11211
VALUE key008 0 6
oldboy
END
[root@web03 ~]# printf"delete key008\r\n"|nc 127.0.0.1 11211
DELETED
memcached查看幫助
memcached -h
Memcached啓動命令相關參數
命令參數 |
說明 |
進程與鏈接設置: |
|
-d |
以守護進程(daemon)方式運行服務 |
-u |
指定運行Memcached的用戶,若是當前用戶爲root,須要使用此參數指定用戶 |
-l |
指定Memcached進程監聽的服務器IP地址,能夠不設置此參數 |
-p(小寫) |
指定Memcached服務監聽TCP端口號,默認爲11211 |
-P(大寫) |
設置保存Memcached的pod文件($$),保存PID到指定文件 |
內存相關設置 |
|
-m |
指定Memcached服務能夠緩存數據的最大內存,默認爲64MB |
-M |
Memcached服務內存不夠時禁止LRU,若是內存滿了會報錯 |
-f |
chunk size增加因予,默認1.25 |
-L |
啓用大內存頁,能夠下降內存浪費,改進性能 |
併發鏈接設置 |
|
-c |
最大的併發鏈接數,默認是1024 |
-t |
線程數,默認4.因爲Memcached採用的是NIO,因此太多線程用處不大 |
-R |
每一個event最大請求數,默認20 |
-C |
禁用CAS(能夠禁止版本計數,減小開銷) |
調試參數 |
|
-v |
打印較少的errors/warnings |
-vv |
打印很是多調試信息和錯誤輸出到控制檯,也打印客戶端命令及響應 |
-vvv |
打印極多的調試信息和錯誤輸出,也打印內部狀態轉變 |
php所在服務器上安裝memcached客戶端,程序才能訪問memcached
把memcache-2.2.5.tgz數據包拉到/home/oldboy/tools/
而後進行編譯安裝
tar zxf memcache-2.2.5.tgz
cd memcache-2.2.5
/application/php/bin/phpize
./configure --enable-memcache --with-php-config=/application/php/bin/php-config
make
make install
cd ../
[root@web02 tools]# ll/application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
total 256
-rwxr-xr-x 1 root root 258064 Jun 9 14:44 memcache.so
echo '<?php phpinfo(); ?>' >/application/nginx/html/blog/a.php
[root@web02 php]# cat /application/nginx/html/blog/a.php
<?php
phpinfo();
?>
經過頁面:blog.etiantian.org/a.php檢查mc的配置狀況。
配置:
vim /application/php/lib/php.ini
extension_dir ="/application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/"
extension = memcache.so
重啓Php
pkill php-fpm
/application/php/sbin/php-fpm
再次經過頁面:blog.etiantian.org/a.php檢查mc的配置狀況。ctrl + F
搜索memcache頁面內容,若是有結果,表示成功。
管理memcachedweb端
把memadmin-1.0.12.tar.gz包拉進 /home/oldboy/tools/
tar zxvfC memadmin-1.0.12.tar.gz /application/nginx/html/blog/
進行指定解壓
Memcached狀態信息詳細說明
參數 |
值 |
描述 |
實際做用 |
pid |
28123 |
memcache服務進程ID |
查看服務信息 |
uptime |
20063728 |
服務已運行秒數 |
|
time |
1440577412 |
服務當前Unix時間戳 |
|
version |
1.4.4 |
Memcache版本 |
|
libevent |
1.4.13-stable |
libevent版本 |
|
pointer_size |
64 |
操做系統指針大小 |
|
rusage_user |
645314.961214 |
進程累計用戶時間 |
分析佔用CPU的狀況 |
rusage_system |
1134305.468357 |
進程累計系統時間 |
|
cuur_connections |
1361 |
當前鏈接數 |
分析鏈接數狀況 |
total_connections |
18299935 |
Memcached運行以來鏈接總數 |
|
connection_structures |
12455 |
Memcached分配的鏈接結構數量 |
|
reserved_fds |
20 |
內部使用的FD數 |
|
cmd_get |
60424570825 |
get命令請求次數 |
分析命令率狀況 |
get_hits |
58105159197 |
get命令命中次數 |
|
get_misses |
2319411628 |
get命令未命中次數 |
|
curr_items |
24628253 |
當前的對象數目 |
分析對象數LRU頻率 |
total_items |
854196259 |
當前存儲佔用的字節數 |
|
evictions |
7509 |
LRU釋放的對象數目 |
如今的Memcached是利用Slab Allocation機制來分配和管理內存的,過程以下:
1)提早將大內存分配大小爲1MB的若干個slab,而後針對每一個slab再進行小對象填充,這個小對象稱爲chunk,避免大量重複的初始化和清理,減輕了內存管理器的負擔。
Slab Allocation 內存分配的原理是按照預先規定的大小,將分配給Memcached服務的內存預先分割成特定長度的內存塊(chunk),再把尺寸相同的內存塊(chunk)分紅組(chunks slab class),這些內存塊不會釋放,能夠重複利用。
2)新增數據對象存儲說明。
Memcached服務器中保存着slab內空閒chunk的列表,它會根據該列表選擇chunk,而後將數據緩存於其中。當有數據存入時,Memcached根據接收到的數據大小,選擇最合適數據大小的slab,分配一個能存下這個數據的最小內存塊(chunk)。例如:有100字節的一個數據,就會被分配存入下面的112字節的一個內存塊中,這樣會有12字節被浪費掉,這部分空間就不能被使用了,這也是SlabAllocator機制的一個缺點。
須要被緩存的數據以key/value鍵值對的形式保存在服務器端