您好,登錄后才能下訂單哦!
內存緩存軟件 (內存比磁盤快)
分為服務端和客戶端
服務端 memcached
客戶端memcache
誕生的原因。
2003年誕生了memcached
web1.0 2005以前 企業提供內容為主。
web2.0 2005-2012 企業只提供平臺,用戶參與上傳和下載內容。
目標:
解決高并發訪問的問題,減輕傳統數據庫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鍵值對的形式保存在服務器端
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。