Memcached 緩存數據庫應用實踐

1.1 數據庫對比

緩存: 將數據存儲到內存中,只有當磁盤勝任不了的時候,纔會啓用緩存php

   缺點:斷電數據丟失(雙電),用緩存存儲數據的目的只是爲了應付大併發的業務。html

數據庫: mysql(關係型數據庫,可以保證數據一致性,保證數據不丟失,當由於功能太多,致使性能不高) ===數據參考前端

緩存數據庫: memcache redis(非關係型數據庫,性能極高,但不保證數據完整性) === 業務的數據提供者mysql

     memcachedb 會將內存的數據寫入到磁盤中nginx

       redis 主要工做場所是內存中,可是按期備分內存數據到硬盤web

1.1.1 數據庫的選擇

  數據存儲,數據倉庫選擇mysql這種磁盤的數據庫面試

  高併發,業務大的應用選擇memcache這種內存數據庫redis

1.1.2 數據庫分類

  關係型數據庫 mysql算法

  非關係型數據庫(NOSQL) memcached redis MongoDBsql

1.2 memcached介紹

Memcached是一款開源的、高性能的純內存緩存服務軟件。Mem是內存的意思,cache是緩存的意思,d是daemon的意思。

  memcache 是項目名稱,也是一款軟件,其架構是C/S****架構

​ memcached官網:http://memcached.org/

1.2.1 memcache優勢

① 對於用戶來說,用戶訪問網站更快了,體驗更好了。

②對網站來講,數據庫壓力下降了。只有當內存沒有數據時纔會去請求數據庫。第一次寫入的數據也會請求數據庫。通常公司沒有預熱,只有當用戶讀取過數據庫纔會放到Memcached中。

② 提高了網站的併發訪問,減小服務器數量。

1.3 Memcached在企業中使用場景

1.3.1 做爲數據庫的前端緩存應用

   當數據庫(mysql)承受不了大併發的請求時,能夠將數據緩存到內存中(緩存數據庫),而後就能夠解決

 做爲數據庫的前端緩存最大目的:減小數據庫被大量訪問的壓力

1.3.2 做爲集羣后端的session會話保持

  session存儲在文件,數據庫,memcache,或內存等的服務端上,

   cookie 存放在客戶端瀏覽器上。

   session是一個存在服務器上的相似於一個散列表格的文件。裏面存有咱們須要的信息,在咱們須要用的時候能夠從裏面取出來。

   session依賴cookie存在,請求客戶端到達服務端後,服務端會隨機生成一個字符串,做爲該用戶的標識,該字符串經過cookie返回給客戶端,客戶端瀏覽器會以該字符串爲key放到session id裏面,隨機字符串的key裏面能夠先沒有值。若是用戶再次提交,請求信息中的用戶名密碼等用戶信息保存在隨機字符串的value中,請求到達服務端,用戶名密碼正確,隨機字符串會被受權,提一個標記給到sessionid中的隨機字符串的value中,證實該用戶已是登陸狀態,客戶端再次帶着該隨機字符串訪問服務端,服務端會知道該用戶已經登陸不需驗證,直接返回請求的信息。

session和cookie區別

  一、cookie數據存放在用戶的瀏覽器上,session數據存儲在服務器上

  二、cookie在本地的瀏覽器中,能夠被提取分析,安全性差。爲了安全,登陸帳戶等信息能夠緩存在session中。

  三、session會在必定時間內保存在服務器上,訪問量增大會給服務器帶來壓力,可使用緩存工具,如memcache等

1.3.3 網站開發如何判斷用戶信息

  最開始的技術方法:服務器在你的瀏覽器中寫一個cookies,這個cookies就包含了你的用戶名及登陸信息。由於cookies是存儲在本地瀏覽器中,因此第三方工具很容易盜取cookies信息。

最開始:

cookies cookies名字:內容(用戶名,登陸信息)

改進後:

本地瀏覽器存放:

cookies cookies名字:內容(session id 編號)

服務器存放:

session session id:內容(用戶名,登陸信息)

主流使用場景:cookies + session

1.3.4 session共享的不一樣解決方案

   一、session文件提供NFS共享

  二、session文件提供rsync scp共享

   三、將session的內容存放在數據庫(mysql)中,全部的機器均可以經過ip:port讀取

  四、將session的內容存放在緩存數據庫中,全部的機器均可以經過ip:port讀取

   好處:利用斷電、重啓丟失數據的特性。定時清理數據;提升併發

1.3.5 memcache原理優勢

  啓動Memcached吋,根據指定的內存大小參數,會被分配一個內存個間。當咱們讀取數據庫的各種業務數據後,數據會同吋放入Memcached緩存中,,下一次用戶請求一樣的數據,程序直接去Memcached取數據返回給用戶。

優勢:

  ① 對於用戶來說,用戶訪問網站更快了,體驗更好了。#

  ② 對網站來講,數據庫壓力下降了。只有當內存沒有數據時纔會去請求數據庫。第一次寫入的數據 也會請求數據庫。通常公司沒有預熱,只有,用戶讀取過數據庫纔會放到Memcached中。

  ③ 提高了網站的併發訪問,減小服務器數最。

img

原理圖

1.4 Memcached分佈式緩存集羣

  memcached天生不支持分佈式集羣,須要經過程序支持分佈式存儲

1.4.1 Memcached分佈式緩存集羣的特色

   1. 全部MC服務器內存的內容都是不同的。這些服務器內容加起來接近數據庫的容量。好比1T的數據庫,一臺緩存數據庫的內存沒有那麼大,所以分紅10臺緩存服務器。

  2. 經過在客戶端(Web)程序或者MC的負載均衡器上用HASH算法,讓同一內容都分配到一個MC服務器。

   3. 普通的HASH算法對於節點宕機會帶來大量的數據流動(失效),可能會引發雪崩效應。

  4. 一致性HASH可讓節點宕機對節點的數據流動(失效)降到最低。

普通的hash*算法*

img

  首先將key處理爲一個32位字符串,取前8位,在通過hash計算處理成整數並返回,而後映射到其中一臺服務器這樣獲得其中一臺服務器的配置,利用這個配置完成分佈式部署。在服務器數量不發生變化的狀況下,普通hash分佈能夠很好的運做,當服務器的數量發生變化,問題就來了。試想,增長一臺服務器,同一個key通過hash以後,與服務器取模的結果和沒增長以前的結果確定不同,這就致使了,以前保存的數據丟失。

一致性hash*算法*

img

一致性哈希算法

  優勢:在分佈式的cache緩存中,其中一臺宕機,遷移key效率最高

  將服務器列表進行排序,根據mHash($key) 匹配相鄰服務器

一致性hash****算法 將數據流動降到最低

參考資料

http://blog.csdn.net/cywosp/article/details/23397179
http://blog.csdn.net/zhangskd/article/details/50256111

第2章 memcached使用

2.1 安裝memcached

2.1.1 環境說明

[root@cache01 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core) 
[root@cache01 ~]# uname -r
3.10.0-693.el7.x86_64
[root@cache01 ~]# getenforce
Disabled
[root@cache01 ~]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@cache01 ~]# hostname -I
10.0.0.21 172.16.1.21

2.1.2 安裝memcached

[root@cache01 ~]# yum -y install memcached

2.1.3 查看配置

[root@cache01 ~]# cat /etc/sysconfig/memcached 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""

2.1.4 查看啓動腳本

[root@cache01 ~]# cat /usr/lib/systemd/system/memcached.service 
[Unit]
Description=Memcached 
Before=httpd.service
After=network.target

[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/memcached
ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS

[Install]
WantedBy=multi-user.target

2.1.5 啓動服務

[root@cache01 ~]# systemctl start memcached.service

2.2 管理memcached

2.2.1 memcached數據庫語法格式

set              key   0        0           10

<command name>  <key> <flags> <exptime> <bytes>\r\n

\n 換行且光標移至行首

\r 光標移至行首,但不換行

參數 說明
是在取回內容時,與數據和發送塊一同保存服務器上的任意16位無符號整形(用十進制來書寫)。客戶端能夠用它做爲「位域」來存儲一些特定的信息;它對服務器是不透明的。
是終止時間。若是爲0,該項永不過時(雖然它可能被刪除,以便爲其餘緩存項目騰出位置)。若是非0(Unix時間戳或當前時刻的秒偏移),到達終止時間後,客戶端沒法再得到這項內容
是隨後的數據區塊的字節長度,不包括用於分頁的「\r\n」。它能夠是0(這時後面跟隨一個空的數據區塊)。
\r\n 是大段的8位數據,其長度由前面的命令行中的 指定。

2.2.2 數據庫使用

寫入讀取數據

[root@cache01 ~]# printf "set key008 0 0 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211
STORED
[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211
VALUE key008 0 10
oldboy0987
END

寫入數據長度不符合,定義過大

[root@cache01 ~]# printf "set key009 0 0 11\r\noldboy0987\r\n"|nc 10.0.0.21 11211
[root@cache01 ~]# printf "get key009\r\n"|nc 10.0.0.21 11211
END

寫入數據長度不符合,定義太小

[root@cache01 ~]# printf "set key010 0 0 9\r\noldboy0987\r\n"|nc 10.0.0.21 11211
CLIENT_ERROR bad data chunk
ERROR
[root@cache01 ~]# printf "get key010\r\n"|nc 10.0.0.21 11211
END

時效性

[root@cache01 ~]# printf "set key011 0 10 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211
STORED
[root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211
VALUE key011 0 10
oldboy0987
END
[root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211
END

刪除數據

[root@cache01 ~]# printf "delete key008\r\n"|nc 10.0.0.21 11211
DELETED
[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211
END

2.3 memcache php版本客戶端安裝使用

命令集

#編譯進去php_mem
tar zxvf 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 --with-zlib-dir
make
make install
# 激活php_memcached
sed -i '$a extension=memcache.so' /application/php/lib/php.ini
pkill php
/application/php/sbin/php-fpm -t
/application/php/sbin/php-fpm
/application/php/bin/php -m|grep memcache

檢查當前環境

查看php的模塊

img View Code 查看php的模塊

*執行過程*

編譯安裝

[root@web06 memcache-2.2.5]# make install
Installing shared extensions:     /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
[root@web06 memcache-2.2.5]# ls /application/php/lib/php/extensions/no-debug-non-zts-20121212/
memcache.so
[root@web06 memcache-2.2.5]# sed -i '$a extension=memcache.so' /application/php/lib/php.ini
[root@web06 memcache-2.2.5]# pkill php
[root@web06 memcache-2.2.5]# /application/php/sbin/php-fpm -t
[17-Nov-2017 11:39:13] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful

[root@web06 memcache-2.2.5]# /application/php/sbin/php-fpm
[root@web06 memcache-2.2.5]# /application/php/bin/php -m|grep memcache
memcache

2.3.1 編寫測試文件

[root@web01 blog]# cat /application/nginx/html/blog/mc.php
<?php
    $memcache = new Memcache;
    $memcache->connect('10.0.0.21', 11211) or die ("Could not connect");
    $memcache->set('key20171117', 'hello,world');
    $get_value = $memcache->get('key20171117');
    echo $get_value;
?>

瀏覽器訪問

img

數據庫讀取測試

[root@cache01 ~]# printf "get key20171117 \r\n"|nc 10.0.0.21 11211 
VALUE key20171117 0 11
hello,world
END

2.4 web管理memcached

  使用的軟件memadmin

  官網:http://www.junopen.com/memadmin/

將程序包放如站點目錄,瀏覽器進行訪問便可

[root@web06 tools]# tar xf memadmin-1.0.12.tar.gz -C /application/nginx/html/blog/

默認用戶名密碼爲admin

img

添加一個新的memcached服務器

img

web界面管理全中文,較爲簡單

img

2.5 memcached數據緩存

經過程序實現

2.5.1 blog站點實現memcached存儲

[root@web06 ~]# cat /application/nginx/html/blog/wp-content/object-cache.php

img

2.6 memcached session共享

方法1:

  經過程序實現,web01只須要往memcahce寫session,web02從memcahce讀session(更具備通用性)

方法2:

  經過php的配置文件,讓php默認將session存儲在文件中,修改成存儲在memcached中

sed -i 's#session.save_handler = files#session.save_handler = memcache#;$a session.save_path = "tcp://10.0.0.21:11211"' /application/php/lib/php.ini

  使用這個功能,須要使用php的session函數

做者:慘綠少年
出處:http://clsn.io

歡迎關注公衆號 【碼農開花】一塊兒學習成長 我會一直分享Java乾貨,也會分享免費的學習資料課程和麪試寶典 回覆:【計算機】【設計模式】【面試】有驚喜哦

相關文章
相關標籤/搜索