Nginx實現負載均衡&Nginx緩存功能

1、Nginx是什麼

  Nginx (engine x) 是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。Nginx是由伊戈爾·賽索耶夫爲俄羅斯訪問量第二的Rambler.ru站點(俄文Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。
  其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4發佈。
  Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器。其特色是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
  目前淘寶在nginx作了二次開發:tengine(見下文)。
  php

2、Nginx實現反向代理

2.1 正向代理和反向代理

  正向代理:是一個位於客戶端和目標服務器之間的服務器,爲了從目標服務器取得內容,客戶端向代理髮送一個請求並指定目標(目標服務器),而後代理向目標服務器轉交請求並將得到的內容返回給客戶端。
  簡單來講:
  我是一個用戶,我訪問不了某網站,可是我能訪問一個代理服務器;
  這個代理服務器呢,他能訪問那個我不能訪問的網站;
  因而我先連上代理服務器,告訴他我須要那個沒法訪問網站的內容;
  代理服務器去取回來,而後返回給我;
  從網站的角度,只在代理服務器來取內容的時候有一次記錄;
  有時候並不知道是用戶的請求,也隱藏了用戶的資料,這取決於代理告不告訴網站。
  反向代理:對於客戶端而言它就像是目標服務器,而且客戶端不須要進行任何特別的設置。客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接着反向代理將判斷向何處(目標服務器)轉交請求,並將得到的內容返回給客戶端,就像這些內容本來就是它本身的同樣。
  簡單來講,
  用戶訪問 http://ooxx.me/readme;
  但ooxx.me上並不存在readme頁面;
  他是偷偷從另一臺服務器上取回來,而後做爲本身的內容吐給用戶;
  但用戶並不知情┐(゚~゚)┌
  這裏所提到的 ooxx.me 這個域名對應的服務器就設置了反向代理功能;
  正向代理和反向代理的區別:
  (1)從用途上來說:
  正向代理的典型用途是爲在防火牆內的局域網客戶端提供訪問Internet的途徑。正向代理還可使用緩衝特性減小網絡使用率。反向代理的典型用途是將防火牆後面的服務器提供給Internet用戶訪問。反向代理還能夠爲後端的多臺服務器提供負載平衡,或爲後端較慢的服務器提供緩衝服務。
  另外,反向代理還能夠啓用高級URL策略和管理技術,從而使處於不一樣web服務器系統的web頁面同時存在於同一個URL空間下。
  (2)從安全性來說:
  正向代理容許客戶端經過它訪問任意網站而且隱藏客戶端自身,所以你必須採起安全措施以確保僅爲通過受權的客戶端提供服務。
  反向代理對外都是透明的,訪問者並不知道本身訪問的是一個代理。css

2.2 nginx實現反向代理

  nigix代理是基於ngx_http_proxy模塊實現的。該模塊有不少配置選項,如:html

proxy_passnginx

  指定將請求代理至server的URL路徑。web

proxy_set_header數據庫

  將發送至server的報文的某首部進行重寫。vim

proxy_send_timeout後端

  在鏈接斷開以前兩次發送到server的最大間隔時長;過了這麼長時間後端仍是沒有收到數據,鏈接會被關閉。centos

proxy_read_timeout瀏覽器

  是從後端讀取數據的超時時間,兩次讀取操做的時間間隔若是大於這個值,和後端的鏈接會被關閉。

proxy_connect_timeout

  是和後端創建鏈接的超時時間。
  接下來,咱們就來仔細說說重點的配置選項:

2.2.1 proxy_pass配置

1)替換uri
  經常使用於頁面很固定的時候。好比雙十一的大促主頁面。
  語法以下:

location /uri {
    proxy_pass http://ip:port/newuri/;        //location的/uri將被替換爲/newuri
}

  舉例以下:

location /mobi {
    proxy_pass http://172.17.251.66/mobile/;        //將/mobi 的請求跳轉到新服務器上/mobile目錄下
}

  在這裏,咱們須要注意的是,http://ip:port/newuri;,這個地方最後面加不加/意義是不一樣的。
  如上文,咱們就加上了/,則意味着所有替換。
  若是咱們不加/,則是將新路徑當作其上級目錄,訪問的是新路徑下的原路徑。舉例以下:

location /mobi {
    proxy_pass http://172.17.251.66/mobile;        //將/mobi 的請求跳轉到新服務器上/mobile/mobi目錄下
}

2)轉換url
  至關於分流,基於url來分流,把一類的請求發送到一個機器(一個集羣)中,具體操做看機器的設置。
  若是location的URI是經過模式匹配定義的,其URI將直接被傳遞,而不能爲其指定轉換的另外一個URI。
  舉例以下:

location ~ ^/mobile {
    proxy_pass http://172.17.251.66;
}

  這段代碼的意思是,只要有/mobile的網址,會直接轉到http://172.17.251.66/mobile下。
  
3)URL重定向
  也就是整個url的重定向。好比兩個網站合併或者更換域名時,原先的域名已經不用了,可是有些頁面還在訪問,就能夠經過這種方法來整個重定向,重定向到新的域名中。
  若是在location中使用的URL重定向,那麼nginx將使用重定向後的URI處理請求,而再也不考慮以前定義的URI。

location /youxi{
    rewrite ^(.*)$ /mobile/$1 break;
    proxy_pass http://172.17.251.66;
}

  這段代碼的意思就是,只要你訪問的是帶/youxi的頁面,就會自動重定向到http://172.16.100.1/mobile/$1上。$1指的是^(.*)$中括號內的部分。這樣就實現了整個url的重定向。
  在這裏,咱們也來詳細說說ngx_http_rewrite_module模塊,這是一個很是好用的模塊。

2.2.1.1ngx_http_rewrite_module模塊

1)rewrite 用法
  將用戶請求的URI基於regex所描述的模式進行檢查,匹配到時將其替換爲replacement指定的新的URI。
  其語法是:

  rewrite regex replacement [flag]

  注意:若是在同一級配置塊中存在多個rewrite規則,那麼會自下而下逐個檢查;被某條件規則替換完成後,會從新一輪的替換檢查。
  隱含有循環機制,但不超過10次;若是超過,提示500響應碼, [flag]所表示的標誌位用於控制此循環機制。
  若是replacement是以http://或https://開頭,則替換結果會直接以重向返回給客戶端。
  下面咱們來講一說flag的具體選項:
[flag]

last:重寫完成後中止對當前URI在當前location中後續的其它重寫操做,然後對新的URI啓動新一輪(從第一個開始)重寫檢查;提早重啓新一輪循環。
break:重寫完成後中止對當前URI在當前location中後續的其它重寫操做,然後直接跳轉至重寫規則配置塊以後的其它配置;結束循環,建議在location中使用。
redirect臨時重定向,重寫完成後以臨時重定向方式直接返回重寫後生成的新URI給客戶端,由客戶端從新發起請求; 不能以http://或https://開頭 ,使用相對路徑,狀態碼: 302。
permanent:重寫完成後以永久重定向方式直接返回重寫後生成的新URI給客戶端,由客戶端從新發起請求,狀態碼:301。

  由下圖咱們能夠更清楚的看出跳轉到的位置:

2)return用法
  return的用法語法以下:

  return code [text];
  return code URL;
  return URL;

  中止處理,並返回給客戶端指定的響應碼。
  

2.2.2 proxy_set_header配置

  proxy_set_header用於將發送至server的報文的某首部進行重寫。經常使用於nginx作負載均衡時, 獲取客戶端IP時, 添加forward頭部。
  語法以下:

proxy_set_header Host $host;            //目的主機地址
proxy_set_header X-REMOTE-IP $remote_addr;      //上一跳地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    //客戶端主機地址

  原有請求報文中若是存在X-Forwared-For首部, 則將client_addr以逗號分隔補原有值後, 不然則直接添加此首部;

2.3 nginx實現負載均衡

  nginx負載均衡是ngx_http_upstream_module模塊的功能, 須要在配置文件http塊上下文中定義upstream塊, 指定一組負載均衡的後端服務器, 而後在上面講到的proxy_pass中引用, 就能夠反向代理時實現負載均衡了。
  須要注意的是:ngx_http_upstream段要在server段前面,要定義在http段中。
  語法以下:

server address [parameters];

  接着,咱們來看一看選項:
paramerters

weight: 負載均衡策略權重, 默認爲1;
max_fails: 在必定時間內(這個時間在fail_timeout參數中設置) 檢查這個服務器是否可用時產生的最多失敗請求數
fail_timeout: 在經歷了max_fails次失敗後, 暫停服務的時間。 max_fails能夠和fail_timeout一塊兒使用, 進行對後端服務器的健康狀態檢查;
backup: 當全部後端服務器都宕機時, 能夠指定代理服務器自身做爲備份, 對外提供維護提示頁面;
down: 永久不可用。

  須要注意一下的是:max_failsfail_timeout是配對使用的,前者是定義在必定時間內檢查這個服務器是否鏈接可用時產生的最多失敗請求的次數,後者是規定這個時間,而且這個時間也是在通過前者的失敗次數後,暫停服務的時間。
示例:

max_fails=3
    fail_timeout=10s

  意思就是 10秒內失敗3次,則暫停服務10秒。
  舉例:

upstream dynamic {
    server backend1.example.com weight=5;
    server backend2.example.com:8080 max_fails=3; fail_timeout=5s ;
    server 192.0.2.1 max_fails=3;
    server backup1.example.com:8080 backup;
    server backup2.example.com:8080 backup;
}

  固然,咱們還有一個專業的健康檢測模塊 nginx_upstream_check_module-master,能夠根據須要使用。
  upstream塊裏能夠用多個server選項配置多個後端服務器,同時還可配置對後端服務器的健康狀態檢查,能夠在server後面加上max_fails
proxy_next_upstream指定檢查策略,默認爲返回超時爲失敗)和fail_timeout參數實現;也能夠用health_check選項來實現,health_check能夠指定的參數較多, 不過須要定義在location上下文中。
  另外, 能夠指定代理服務器自身做爲備份server, 當全部後端服務器都宕機時, 對外提供維護提示頁面。
  還能夠指定負載均衡策略: 主要有round_robin(加權輪詢, 默認) 、haship_hashleast_conn(最少鏈接)和least_time(最少響應時間,商業版本),策略定義在upstream上下文便可。
  具體實例參照tengine實現動靜分離(見下文)。

3、tengine

  Tengine是由淘寶網發起的Web服務器項目。它在Nginx的基礎上,針對大訪問量網站的需求,添加了不少高級功能和特性。Tengine的性能和穩定性已經在大型的網站如淘寶網,天貓商城等獲得了很好的檢驗。它的最終目標是打造一個高效、穩定、安全、易用的Web平臺。
  從2011年12月開始,Tengine成爲一個開源項目,Tengine團隊在積極地開發和維護着它。Tengine團隊的核心成員來自於淘寶、搜狗等互聯網企業。Tengine是社區合做的成果,咱們歡迎你們參與其中,貢獻本身的力量。

tengine實現動靜分離

一、下載並解壓安裝包
  進入官網下載安裝包,

  這裏附上官網網址:tengine.taobao.org
  小編下載的是2.2.1版本。你們能夠根據本身的須要來下載。接着,咱們使用rz命令上傳至虛擬機。
  上傳完成後,咱們來解壓:

tar xvf tengine-2.1.1.tar.gz

二、編譯安裝tengine
  首先,咱們要安裝依賴的包和包組:

yum install pcre-devel  openssl-devel -y
    yum groupinstall "development tools" -y

  安裝完成後,咱們進入這個目錄:

cd tengine-2.1.1

  而後,咱們就能夠進行編譯安裝了:

./configure --prefix=/usr/local/tengine
    make && make install

三、修改配置文件
  咱們的需求是讓這臺機器充當調度器,坐到動靜分離,因此咱們須要在配置文件中添加下面這些:
  配置文件爲/usr/local/tengine/conf/nginx.conf
http段,添加以下內容:

upstream server-cluster{
        server 172.17.77.77:80;
        server 172.17.252.111:80;

        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        check_http_send "HEAD / HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
}

upstream staticsrvs{
        server 172.17.22.22:80;
        server 172.17.1.7:80;

        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        check_http_send "HEAD / HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
}

server段,添加以下內容:

location /stats {
        check_status;      //定義一個web監聽頁面
}
//如下部分用來實現動靜分離
location ~* .jpg|.png|.gif|.jpeg$ {
        proxy_pass http://staticsrvs;
}
location ~* .css|.js|.html|.xml$ {
        proxy_pass http://staticsrvs;
}
location / {
        proxy_pass http://server-cluster;
}

  若是有下面這一段,咱們須要把它註釋掉:

location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

  這樣,咱們的配置文件就修改完成了。
  在咱們啓動服務前,若是咱們的機器開啓了nginx服務或者http服務,要記得把服務關閉,由於tengine服務使用的也是80端口
  咱們來啓動服務:

cd /usr/local/tengine/sbin
./nginx -t              //檢查配置文件語法錯誤
./nginx                 //啓動服務
./nginx -s reload       //從新加載服務

  固然,咱們也能夠直接把這個服務寫到咱們的啓動腳本里,這樣,之後咱們經過service或者systemctl就能夠控制了。
  centos7裏的啓動腳本在/usr/lib/systemd/system/nginx.service
  在centos6中,咱們若是以前使用yum安裝過nginx,咱們就能夠複製一個nginx的服務腳本,更名爲tengine,並設置開機自啓,具體操做以下:

cp /etc/init.d/nginx /etc/init.d/tengine
    vim /etc/init.d/tengine

四、測試
  因爲咱們在配置文件中定義了一個web的監聽頁面,因此咱們能夠去訪問一下:

  上圖中就是咱們的監聽頁面,若是某一服務器出現故障,則會標紅提示。
  咱們的網站也是能夠正常訪問的:

  接着,咱們來測試一下咱們的動靜分離實現狀況,咱們把兩臺靜態的服務器的nginx服務down掉:

systemctl stop nginx

  而後咱們來看看咱們的監聽頁面,須要刷新幾回:

  咱們能夠看到,掛掉的兩臺服務器已經標紅了。接着咱們來訪問一下咱們的網站:

  能夠看到,全部的靜態文件,包括圖片cssjs等文件都沒有顯示了,咱們的動靜分離實驗圓滿完成。

4、nginx實現緩存

4.1 爲何須要緩存

  緩存的最根本的目的是爲了提升網站性能,減輕頻繁訪問數據,而給數據庫帶來的壓力。合理的緩存,還會減輕程序運算時,對CPU帶來的壓力。在計算機現代結構中,操做內存中的數據比操做存放在硬盤上的數據是要快N個數量級的,操做簡單的文本結構的數據,比操做數據庫中的數據快N個數量級 。
  例如:每次用戶訪問網站,都必須從數據庫讀取網站的標題,每讀一次須要15毫秒的時間,若是有100個用戶(先不考慮同一時間訪問),每小時訪問10次,那麼就須要讀取數據庫1000次,須要時間15000毫秒。若是把頁面直接變成頁面緩存,則每次訪問就不須要去數據庫讀取,大大提高了網站性能。
  

4.2 緩存服務的工做原理


  緩存的工做原理能夠很清楚的從上圖中看出來。經過緩存,咱們就能夠減小大量的重複讀取過程,從而節省咱們的資源,提高網站的性能。
  緩存數據分爲兩部分(索引,數據):
  一、存儲數據的索引,存放在內存中;
  二、存儲緩存數據,存放在磁盤空間中;
  

4.3 nginx緩存模塊

  Nginx實現緩存是經過代理緩存pxory_cache, 這也是ngx_http_proxy_module模塊提供的功能, 這裏配置選項較多, 經常使用的選項有: proxy_cache_pathproxy_cacheproxy_cache_valid

4.3.1 proxy_cache_path

  proxy_cache_path定義一個完整的緩存空間,指定緩存數據的磁盤路徑、索引存放的內存空間以及一些其餘參數,如緩存刪除策略。
  注意:該選項只能定義在http塊上下文中。
  如:

proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10;   //緩存數據存儲在/data/cache目錄中

  下面咱們來看看具體的選項:

levels:配置在該目錄下再分兩層目錄,一層1個隨機字符做爲名稱,二層2個隨機字符做爲名稱,levels最多三層,每層最多兩個字符,這是爲了加快訪問文件的速度;最後使用代理url的哈希值做爲關鍵字與文件名,一個緩存數據以下: /data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c;
keys_zone:用來爲這個緩存區起名,並設置大小。上面的例子就是指定名稱爲web,這個名稱後面proxy_cache須要引用;而10m就是內存空間的大小;
max_size:指定最大緩存數據磁盤空間的大小;
inactive:在inactive指定的時間內,未被訪問的緩存數據將從緩存中刪除

4.3.2 proxy_cache

  proxy_cache用來引用上面proxy_cache_path定義的緩存空間, 現時打開緩存功能, 以下:

  proxy_cache web;             //引用上面定義上的緩存空間, 同一緩存空間能夠在幾個地方使用

4.3.3 proxy_cache_valid

  proxy_cache_valid設置不一樣響應代碼的緩存時間, 如:

proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 1m;

4.4 配置nginx緩存實例

  先配置proxy_cache_path,再配置proxy_cache引用、打開緩存空間,接着配置兩個proxy_cache_valid;爲方便調試測試,咱們能夠經過add_header給請求響應增長一個頭部信息,表示從服務器上返回的cache狀態怎麼樣(有沒有命中),主要配置以下:
  定義一個完整的緩存空間;緩存數據存儲在/data/cache目錄中;配置在該目錄下再分兩層目錄;名稱爲web(proxy_cache引用);10m內存空間大小;最大緩存數據磁盤空間的大小;10分鐘未被訪問的緩存數據將從緩存中刪除

http {

    proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10m;

    server {
        listen 80;
        server_name localhost;
        #charset koi8-r;
        #access_log logs/host.access.log main;
        add_header Magedu-Cache "$upstream_cache_status form $server_addr";    //給請求響應增長一個頭部信息,表示從服務器上返回的cache狀態怎麼樣(有沒有命中)
        location / {
            proxy_pass http://webserver;    //引用上面定義的upstream負載均衡組
            proxy_cache web;    //引用上面定義上的緩存空間,同一緩存空間能夠在幾個地方使用
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;    //對代碼200和302的響應設置10分鐘的緩存,對代碼404的響應設置爲1分鐘;
        }
    }
}

5、memcached

5.1 memcached是什麼

  Memcached是一個自由開源的,高性能,分佈式內存對象緩存系統。它是一種基於內存key-value存儲,用來存儲小塊的任意數據(字符串、對象)。這些數據能夠是數據庫調用、API調用或者是頁面渲染的結果。
  Memcached簡潔而強大。它的簡潔設計便於快速開發,減輕開發難度,解決了大數據量緩存的不少問題。它的API兼容大部分流行的開發語言。本質上,它是一個簡潔的key-value存儲系統。
  通常的使用目的是,經過緩存數據庫查詢結果,減小數據庫訪問次數,以提升動態Web應用的速度、提升可擴展性。

5.2 安裝配置memcached

5.2.1 安裝

  直接使用yum安裝便可。

yum install memcached -y

5.2.2 配置文件

  memcached的配置文件與咱們常見服務的配置文件不一樣,他的配置文件很是簡單,配置文件爲/etc/sysconfig/memcached。咱們來看一下里面的東西:

PORT="11211" #端口
USER="memcached" #啓動用戶
MAXCONN="1024" #最大鏈接
CACHESIZE="64" #緩存空間大小

  配置文件裏只有經常使用的一些設置,咱們能夠直接經過修改文件來更改配置,也能夠等到咱們啓動服務的時候添加下面的選項來更改配置:

-d 指定memcached進程做爲一個守護進程啓動
-m <num> 指定分配給memcached使用的內存,單位是MB,默認爲64;
-u <username> 運行memcached的用戶
-l <ip_addr> 監聽的服務器IP地址,若是有多個地址的話,使用逗號分隔,格式能夠爲「IP地址:端口號」,例如:-l 指定192.168.0.184:19830,192.168.0.195:13542;端口號也能夠經過-p選項指定
-p <num> Listen on TCP port , the default is port 11211.
-c <num>設置最大運行的併發鏈接數,默認是1024
-R <num> 爲避免客戶端餓死(starvation),對連續達到的客戶端請求數設置一個限額,若是超過該設置,會選擇另外一個鏈接來處理請求,默認爲20
-k 設置鎖定全部分頁的內存,對於大緩存應用場景,謹慎使用該選項
-P 保存memcached進程的pid文件
-s <file> 指定Memcached用於監聽的UNIX socket文件
-a <perms> 設置-s選項指定的UNIX socket文件的權限
-U <num> Listen on UDP port , the default is port 11211, 0 is off.

  咱們來開啓服務:

systemctl start memcached.service

  若是咱們想要鏈接memcached,須要用到telnet工具,若是沒有安裝的話,直接yum安裝便可。咱們來鏈接一下:

[root@rs01 ~]# telnet 172.17.77.77 11211
Trying 172.17.77.77...
Connected to 172.17.77.77.
Escape character is '^]'.
stats        //查看狀態
STAT pid 15480
STAT uptime 304
STAT time 1510475514
STAT version 1.4.15
STAT libevent 2.0.21-stable  
STAT pointer_size 64      
STAT rusage_user 0.027883
STAT rusage_system 0.074357
STAT curr_connections 10
STAT total_connections 11
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0                     //總命中次數
STAT get_misses 0                   //總未命中次數
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 7
STAT bytes_written 0
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
END

  通常咱們衡量一個緩存的性能好壞,一方面是看速度,還有就是看它的命中率。若是一個緩存的命中率很低,就沒有太多存在的必要。因此,咱們的緩存策略也是很重要的。
  接着,咱們就來看看在memcached中去插入數據的命令:
  命令爲set,語法以下:

set key flags exptime bytes [noreply]
value

  咱們來看看各個選項的意思:

key 是經過被存儲在Memcached的數據並從memcached獲取鍵(key)的名稱。
flags 是32位無符號整數,該項目被檢索時用的數據(由用戶提供),並沿數據返回服務器存儲。
exptime 以秒爲單位的過時時間,0表示沒有延遲,若是exptime大於30天,Memcached將使用它做爲UNIX時間戳過時。
bytes 是在數據塊中,須要被存儲的字節數。基本上,這是一個須要存儲在memcached的數據的長度。
noreply (可選) 參數告知服務器不發送回覆
value 是一個須要存儲的數據。數據須要與上述選項執行命令後,將經過新的一行。

  咱們來依照上述語法添加一條進去:

set name 1 1800 4 
keer
STORED          //代表存上了

  如今咱們能夠來查看一下:

get name
VALUE name 1 4
keer
END

  能夠看出,咱們剛剛添加的內容已經添加上了,咱們再來查看一下狀態:

stats  
……
STAT get_hits 1                     //總命中次數
STAT get_misses 0                   //總未命中次數
……

  發現咱們的總命中次數多了一次,就是由於咱們剛剛執行了get命令,而且是成功的,咱們如今來嘗試一下get一個不存在的內容:

get age
END

  而後再來看一下狀態:

stats  
……
STAT get_hits 1                     //總命中次數
STAT get_misses 1                   //總未命中次數
……

  由於咱們去獲取了一個不存在的內容,因此miss數+1。
  固然,這只是咱們作的演示,真正的生產環境是不容許咱們這麼玩的0.0會被玩壞=。=
  咱們還須要記住的一點是,只要咱們的機器斷電了,或或者系統重啓了,memcached裏面的數據就所有沒有了。由於咱們的memcached是存放在內存中的非關係型數據庫,是徹底工做在內存中的,因此只要一斷電就完全玩完了╮(╯﹏╰)╭
  可是咱們的nginx數據是存在磁盤中的,只有索引放在內存中,因此即便掉電了,由於磁盤中的數據還在,索引也能夠根據數據從新生成。
  因此,這樣就要涉及到一個選擇問題了,看你是追求性能,仍是追求安全。咱們能夠根據不一樣的需求來選擇不一樣的方式存儲數據。
  

5.2.3 memcached測試腳本

  在咱們的生產環境,咱們是可使用程序來調用的。好比咱們可使用php客戶端連過來來調用memcached
  爲了使咱們的php鏈接上memcache的客戶端,咱們須要安裝一個包——php-memcache。咱們直接使用yum安裝便可:

yum install php-memcache

  安裝完成後,咱們須要重啓一下php-fpm服務:

  systemctl restart php-fpm

  咱們以前在/data/web/下建立過一個phpinfo.php文件,咱們能夠來經過瀏覽器查看一下:

  能夠看出咱們的memcache已經和php創建了鏈接。
  接下來,給你們提供一個簡單的php測試memcache的小腳本:

vim /data/web/memcached.php
<?php
$mem = new Memcache;
$mem->connect("172.17.77.77", 11211); #鏈接Memcached,ip是你作實驗機器的ip

$version = $mem->getVersion();
echo "Server's version: ".$version."<br/>\n"; #輸出Memcached版本信息

$mem->set('magedu', 'Hello World', 0, 600); #向Memcached存儲數據'Hello World',時間爲600s
echo "Store data in the cache (data will expire in 600 seconds)<br/>\n";

$get_result = $mem->get('magedu'); #獲取testkey的值
echo "$get_result is from memcached server.";
?>

  而後咱們就能夠去訪問了:

  bing~咱們的測試已經成功啦~


  以上~若是有不足之處還請你們多多指教喏٩(๑>◡<๑)۶

相關文章
相關標籤/搜索