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,該項永不過期(雖然它可能被刪除,以便為其他緩存項目騰出位置)。如果非0(Unix時間戳或當前時刻的秒偏移),到達終止時間后,客戶端無法再獲得這項內容 |
<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]
執行過程
編譯安裝
[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