1. 程式人生 > >搭建Memcache緩存數據庫

搭建Memcache緩存數據庫

otto nlp 只需要 服務器 改進 value tin 練習 測試

緩存數據庫Memcache

為什麽用緩存數據庫

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

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

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

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

工作中,MySQL+Memcached搭配使用

Memcached介紹

技術分享圖片

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

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

http://memcached.org/

Memcached在企業中使用場景一

技術分享圖片

優點:

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


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


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


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


Memcached在企業中使用場景二

作為集群後端的session會話保持

技術分享圖片

CookiesSession

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

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

技術分享圖片

最開始:

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

改進:

本地瀏覽器:

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

服務器:

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

主流使用場景:cookies + session

Memcached分布式緩存集群

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

Memcached分布式緩存集群的特點:

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

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

10臺緩存服務器。

普通哈希算法

技術分享圖片


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

MC服務器。

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

一致性哈希算法

技術分享圖片

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;

?>

技術分享圖片

服務端查看

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

VALUE key20180111 0 11

hello,world

END

Web界面管理memcached

技術分享圖片有敏感信息發不了,哈哈哈

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

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

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

寫一篇博文

技術分享圖片

技術分享圖片

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函數


搭建Memcache緩存數據庫