搭建Memcache緩存數據庫

緩存數據庫Memcache

爲什麼用緩存數據庫

MySQL:磁盤上的數據庫,數據寫入讀取相對較慢

Memcached:內存中的數據庫,數據讀寫都快,但是數據易丟失

 

數據存儲,數據倉庫選擇MySQL這種磁盤的數據庫

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

 

工作中,MySQL+Memcached搭配使用

Memcached介紹

image.png

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

思,cache是緩存的意思,ddaemon的意思。

http://memcached.org/

 Memcached在企業中使用場景一

image.png

優點:

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


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


  提升了網站的併發訪問,減少服務器數量。


作爲數據庫的前段緩存應用,減少數據庫被大量訪問的壓力。


Memcached在企業中使用場景二

作爲集羣后端的session會話保持

image.png

CookiesSession

網站程序判斷用戶登陸信息,最開始的技術方法:服務器在你的瀏覽器中寫一個cookies,這個cookies

就包含了你的用戶名及登錄信息。因爲cookies是存儲在本地瀏覽器中,所以第三方工具很容易盜取 cookies中的隱私信息。

image.png

最開始:

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

 

改進:

本地瀏覽器:

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

                         

服務器:                   

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

主流使用場景:cookies + session     

Memcached分佈式緩存集羣

Memcached天生不支持分佈式集羣,只能通過程序支持分佈式存儲

Memcached分佈式緩存集羣的特點:

所有MC服務器內存的內容都是不一樣的。這些服務器內容加起來接近數據

庫的容量。比如1T的數據庫,一臺緩存數據庫的內存沒有那麼大,因此分

10臺緩存服務器。

普通哈希算法

image.png


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

 

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

一致性哈希算法

image.png

1.首先求出memcached服務器(節點)的哈希值,並將其配置到0232的圓(continuum)上。

 

2.然後採用同樣的方法求出存儲數據的鍵的哈希值,並映射 到相同的圓上。

 

3.然後從數據映射到的位置開始順時針查找,將數據保存到找到的第一個服務器上。如果超過232仍然找不到服務器,就會保存到第一臺memcached服務器上。

 服務端部署

環境裝備

CentOS7模板機全新克隆一臺新主機

IP規劃爲10.0.0.21/172.16.1.21,主機名爲cache01

其次,準備一臺能夠打開wordpressweb01機器(CentOS6),仿真企業真

實環境,多系統混合使用

安裝memcached

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

查看配置文件

[root@cache01 ~]# cat /etc/sysconfig/memcached

PORT="11211"

USER="memcached"

MAXCONN="1024"

CACHESIZE="64"

OPTIONS=""

啓動memcached

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

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

[root@cache01 ~]# netstat -tunlp|grep memcached

tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      1491/memcached     

tcp6       0      0 :::11211                :::*                    LISTEN      1491/memcached     

udp        0      0 0.0.0.0:11211           0.0.0.0:*                           1491/memcached      

udp6       0      0 :::11211                :::*                                1491/memcached

練習memcached命令語法

增刪改查

[root@cache01 ~]# printf "set key008 0 0 10\r\noldboy0987\r\n"  

set key008 0 0 10

oldboy0987

[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 "delete key008\r\n"|nc 10.0.0.21 11211  刪除

DELETED

終止時間設置

[root@cache01 ~]#  printf "set key008 0 6 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211  增加6秒終止時間

STORED

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

VALUE key008 0 10

oldboy0987

END

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

END

 語法說明

set          key    0       0      10   \r\n oldboy0987 \r\n

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

<flags>

是在取回內容時,與數據和發送塊一同保存服務器上的任意16位無符號整形(用十進制來書寫)。客戶端可以用它作爲“位域”來存儲一些特定的信息;它對服務器是不透明的。

<exptime>

是終止時間。如果爲0,該項永不過期(雖然它可能被刪除,以便爲其他緩存項目騰出位置)。如果非0 (Unix時間戳或當前時刻的秒偏移),到達終止時間後,客戶端無法再獲得這項內容。

<bytes>

是隨後的數據區塊的字節長度,不包括用於分頁的“\r\n”。它可以是0(這時後面跟隨一個空的數據區塊)。

<data   block>

是大段的8位數據,其長度由前面的命令行中的<bytes>指定。

\n 換行且光標移至行首

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

客戶端部署

安裝包:https://pan.baidu.com/s/1qZPLmkk


[root@web tools]# tar zxf memcache-2.2.5.tgz

[root@web tools]# cd memcache-2.2.5

 

重新編譯php添加memcache模塊

[root@web memcache-2.2.5]# /application/php/bin/phpize

[root@web memcache-2.2.5]# ./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir

[root@web memcache-2.2.5]# make && make install

[root@web memcache-2.2.5]# ls  /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/

memcache.so

 

[root@web memcache-2.2.5]# sed -i '$a extension=memcache.so' /application/php/lib/php.ini

[root@web memcache-2.2.5]# pkill php

[root@web memcache-2.2.5]# /application/php/sbin/php-fpm -t

[11-Jan-2018 07:44:56] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful

 

[root@web memcache-2.2.5]# /application/php/sbin/php-fpm

[root@web memcache-2.2.5]# /application/php/bin/php -m|grep memcache

memcache

php代碼測試

[root@web memcache-2.2.5]# cat >> /application/nginx/html/blog/mc.php<<'EOF'

> <?php

> $memcache = new Memcache;

> $memcache->connect('10.0.0.21', 11211) or die ("Could not connect");

> $memcache->set('key20180111', 'hello,world');

> $get_value = $memcache->get('key20180111');

> echo $get_value;

> ?>

> EOF

[root@web memcache-2.2.5]# 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('key20180111', 'hello,world');

$get_value = $memcache->get('key20180111');

echo $get_value;

?>

image.png

服務端查看

[root@cache01 ~]# printf "get key20180111\r\n"|nc 10.0.0.21 11211

VALUE key20180111 0 11

hello,world

END

 Web界面管理memcached

image.png有敏感信息發不了,哈哈哈

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

image.png

image.png

image.png

image.png

image.png

 Memcache數據緩存

使用memcached緩存wordpress博文數據

 

[root@web tools]# cd /application/nginx/html/blog/wp-content/

腳本:https://pan.baidu.com/s/1o9bKt2U

[root@web wp-content]# rz -E

rz waiting to receive.

[root@web wp-content]# sed -i 's#127.0.0.1#10.0.0.21#' object-cache.php

寫一篇博文

image.png

image.png

Memcached Session共享

方法1:通過程序實現,web01只需要往memcahcesessionweb02memcahcesession

當作普通數據讀寫(更具有通用性)

 

方法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

使用這個功能,需要使用phpsession函數


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章