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

来源:http://www.cnblogs.com/keerya/archive/2017/11/11/7819842.html
-Advertisement-
Play Games

一、Nginx是什麼 Nginx (engine x) 是一個 高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器 。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。 ...


一、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(見下文)。
  

二、Nginx實現反向代理

2.1 正向代理和反向代理

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

2.2 nginx實現反向代理

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

proxy_pass

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

proxy_set_header

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

proxy_send_timeout

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

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實現動靜分離(見下文)。

三、tengine

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

tengine實現動靜分離

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

  這裡附上官網網址:tengine.taobao.org
  小編下載的是2.2.1版本。大家可以根據自己的需要來下載。接著,我們使用rz命令上傳至虛擬機。
  上傳完成後,我們來解壓:

    tar xvf tengine-2.1.1.tar.gz 

2、編譯安裝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

3、修改配置文件
  我們的需求是讓這台機器充當調度器,坐到動靜分離,所以我們需要在配置文件中添加下麵這些:
  配置文件為/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

4、測試
  由於我們在配置文件中定義了一個web的監聽頁面,所以我們可以去訪問一下:

  上圖中就是我們的監聽頁面,如果某一伺服器出現故障,則會標紅提示。
  我們的網站也是可以正常訪問的:

  接著,我們來測試一下我們的動靜分離實現情況,我們把兩台靜態的伺服器的nginx服務down掉:

    systemctl stop nginx

  然後我們來看看我們的監聽頁面,需要刷新幾次:

  我們可以看到,掛掉的兩台伺服器已經標紅了。接著我們來訪問一下我們的網站:

  可以看到,所有的靜態文件,包括圖片cssjs等文件都沒有顯示了,我們的動靜分離實驗圓滿完成。

四、nginx實現緩存

4.1 為什麼需要緩存

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

4.2 緩存服務的工作原理


  緩存的工作原理可以很清楚的從上圖中看出來。通過緩存,我們就可以減少大量的重覆讀取過程,從而節省我們的資源,提升網站的性能。
  緩存數據分為兩部分(索引,數據):
  1、存儲數據的索引,存放在記憶體中;
  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分鐘;
        }
    }
}

五、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~我們的測試已經成功啦~


  以上~如果有不足之處還請大家多多指教喏٩(๑>◡<๑)۶


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這是我自己早前聽課時整理的前端全套知識點,適用於初學者,也可以適用於中級的程式員,你們可以下載下來。我自認為還是比較系統全面的,可以抵得上市場上90%的學習資料。討厭那些隨便亂寫的資料還有拿出來賣錢的人!在這裡我免費的分享出來供大家使用! 在這個平臺真的可以學習到不少的東西!有很多的人都在無私的奉獻 ...
  • 關註微信公眾號《IT技術資源共用》獲取更多資源! 微信號:feng1376311650 或者掃二維碼關註獲取下麵全部資源: python: 【0001】Python安裝包,教程文檔,工具包 鏈接: http://pan.baidu.com/s/1hsnHizM 密碼:9x03 【0002】Pytho ...
  • E-R模型(實體關係模型) 當前物理的資料庫都是按照E-R模型進行設計的 E表示entry,實體 R表示relationship,關係 一個實體轉換為資料庫中的一個表 關係描述兩個實體之間的對應規則,包括 一對一 一對多 多對多 關係轉換為資料庫表中的一個列 *在關係型資料庫中一行就是一個對象 數據... ...
  • create table test( id int(10) unsigned not null auto_increment, name varchar(10) character set utf8, age int(10),primary key(id)) engine=MyISAM create ...
  • DBLINK資料庫鏈接是一個資料庫中的模式對象,使您可以訪問另一個資料庫上的對象。 dblink限定符允許您引用除本地資料庫以外的資料庫中的對象,如果省略了dblink,那麼Oracle假定您指的是本地資料庫中的一個對象,並非所有的SQL語句都允許您訪問遠程資料庫上的對象。 新增: 方法一:藉助配置 ...
  • 1、找到redis.conf,配置密碼 2、要重新啟動一下redis 3、用redis-cli重新登陸,我們查詢的時候提示“Authentication required”查詢失敗 4、重新帶密碼登陸,發現可以查詢了 參考: [1]博客,http://blog.csdn.net/zyz5119197 ...
  • 概述 MongoDB是目前非常流行的一種非關係型資料庫,作為入門系列的第一篇本篇文章主要介紹Mongdb的基礎概念知識包括命名規則、數據類型、功能以及安裝等。 環境: OS:Windows Version:3.4 一、安裝 1.下載解壓 在官網下載對應操作系統版本的安裝包,然後解壓;我這裡使用Win ...
  • 一、UDEV是什麼? Udev是一個針對Linux內核2.6的可提供自動創建的設備節點和命名的解決方法的一個文件系統;其實與/etc/目錄下的fstab文件類似 二、Udev如何獲取內核這些模塊的變化信息? 參考博客:http://blog.chinaunix.net/uid-24943863-id ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...