memcached 緩存數據庫應用實踐


1.1 數據庫對比

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

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

數據庫: mysql(關系型數據庫,能夠保證數據一致性,保證數據不丟失,當因為功能太多,導致性能不高) ===數據參考

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

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

        redis 主要工作場所是內存中,但是定期備份內存數據到硬盤

1.1.1 數據庫的選擇

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

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

1.1.2 數據庫分類

  關系型數據庫  mysql

  非關系型數據庫(NOSQL) memcached redis MongoDB

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區別

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

  2、cookie在本地的瀏覽器中,可以被提取分析,安全性差。為了安全,登錄賬戶等信息可以緩存在session中。

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

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

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

最開始:

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

改進后:

      本地瀏覽器存放:

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

      服務器存放:

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

主流使用場景:cookies + session

1.3.4 session共享的不同解決方案

     1、session文件提供NFS共享

     2、session文件提供rsync  scp共享

     3、將session的內容存放在數據庫(mysql)中,所有的機器都可以通過ip:port讀取

     4、將session的內容存放在緩存數據庫中,所有的機器都可以通過ip:port讀取

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

1.3.5 memcache原理優點

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

 優點:

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

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

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

 

原理圖

1.4 Memcached分布式緩存集群

  memcached天生不支持分布式集群,需要通過程序支持分布式存儲

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

     1. 所有MC服務器內存的內容都是不一樣的。這些服務器內容加起來接近數據庫的容量。比如1T的數據庫,一台緩存數據庫的內存沒有那么大,因此分成10台緩存服務器。

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

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

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

普通的hash算法

 

  首先將key處理為一個32位字符串,取前8位,在經過hash計算處理成整數並返回,然后映射到其中一台服務器這樣得到其中一台服務器的配置,利用這個配置完成分布式部署。在服務器數量不發生變化的情況下,普通hash分布可以很好的運作,當服務器的數量發生變化,問題就來了。試想,增加一台服務器,同一個key經過hash之后,與服務器取模的結果和沒增加之前的結果肯定不一樣,這就導致了,之前保存的數據丟失。

一致性hash算法

 

一致性哈希算法

  優點:在分布式的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 光標移至行首,但不換行

參數

說明

<flags>

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

<exptime>

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

<bytes>

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

<data block>\r\n

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

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的模塊

 1 查看php的模塊
 2 [root@web06 ~]# /application/php/bin/php -m
 3 [PHP Modules]
 4 bcmath
 5 Core
 6 ctype
 7 curl
 8 date
 9 dom
10 ereg
11 fileinfo
12 filter
13 ftp
14 gd
15 hash
16 iconv
17 json
18 libxml
19 mbstring
20 mcrypt
21 mhash
22 mysql
23 mysqlnd
24 openssl
25 pcntl
26 pcre
27 PDO
28 pdo_mysql
29 pdo_sqlite
30 Phar
31 posix
32 Reflection
33 session
34 shmop
35 SimpleXML
36 soap
37 sockets
38 SPL
39 sqlite3
40 standard
41 sysvsem
42 tokenizer
43 xml
44 xmlreader
45 xmlrpc
46 xmlwriter
47 xsl
48 zlib
49 
50 [Zend Modules]
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;
?>

瀏覽器訪問

 

數據庫讀取測試

[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

 

   添加一個新的memcached服務器

 

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

 

2.5 memcached數據緩存

通過程序實現

2.5.1 blog站點實現memcached存儲

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

 

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://blog.znix.top


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM