緩存: 將數據存儲到內存中,只有當磁盤勝任不了的時候,纔會啓用緩存php
缺點:斷電數據丟失(雙電),用緩存存儲數據的目的只是爲了應付大併發的業務。html
數據庫: mysql(關係型數據庫,可以保證數據一致性,保證數據不丟失,當由於功能太多,致使性能不高) ===數據參考前端
緩存數據庫: memcache redis(非關係型數據庫,性能極高,但不保證數據完整性) === 業務的數據提供者mysql
memcachedb 會將內存的數據寫入到磁盤中nginx
redis 主要工做場所是內存中,可是按期備分內存數據到硬盤web
數據存儲,數據倉庫選擇mysql這種磁盤的數據庫redis
高併發,業務大的應用選擇memcache這種內存數據庫算法
關係型數據庫 mysqlsql
非關係型數據庫(NOSQL) memcached redis MongoDB數據庫
Memcached是一款開源的、高性能的純內存緩存服務軟件。Mem是內存的意思,cache是緩存的意思,d是daemon的意思。
memcache 是項目名稱,也是一款軟件,其架構是C/S架構。
memcached官網:http://memcached.org/
① 對於用戶來說,用戶訪問網站更快了,體驗更好了。
②對網站來講,數據庫壓力下降了。只有當內存沒有數據時纔會去請求數據庫。第一次寫入的數據也會請求數據庫。通常公司沒有預熱,只有當用戶讀取過數據庫纔會放到Memcached中。
② 提高了網站的併發訪問,減小服務器數量。
當數據庫(mysql)承受不了大併發的請求時,能夠將數據緩存到內存中(緩存數據庫),而後就能夠解決
做爲數據庫的前端緩存最大目的:減小數據庫被大量訪問的壓力
session存儲在文件,數據庫,memcache,或內存等的服務端上,
cookie 存放在客戶端瀏覽器上。
session是一個存在服務器上的相似於一個散列表格的文件。裏面存有咱們須要的信息,在咱們須要用的時候能夠從裏面取出來。
session依賴cookie存在,請求客戶端到達服務端後,服務端會隨機生成一個字符串,做爲該用戶的標識,該字符串經過cookie返回給客戶端,客戶端瀏覽器會以該字符串爲key放到session id裏面,隨機字符串的key裏面能夠先沒有值。若是用戶再次提交,請求信息中的用戶名密碼等用戶信息保存在隨機字符串的value中,請求到達服務端,用戶名密碼正確,隨機字符串會被受權,提一個標記給到sessionid中的隨機字符串的value中,證實該用戶已是登陸狀態,客戶端再次帶着該隨機字符串訪問服務端,服務端會知道該用戶已經登陸不需驗證,直接返回請求的信息。
session和cookie區別
一、cookie數據存放在用戶的瀏覽器上,session數據存儲在服務器上
二、cookie在本地的瀏覽器中,能夠被提取分析,安全性差。爲了安全,登陸帳戶等信息能夠緩存在session中。
三、session會在必定時間內保存在服務器上,訪問量增大會給服務器帶來壓力,可使用緩存工具,如memcache等
最開始的技術方法:服務器在你的瀏覽器中寫一個cookies,這個cookies就包含了你的用戶名及登陸信息。由於cookies是存儲在本地瀏覽器中,因此第三方工具很容易盜取cookies信息。
最開始:
cookies cookies名字:內容(用戶名,登陸信息)
改進後:
本地瀏覽器存放:
cookies cookies名字:內容(session id 編號)
服務器存放:
session session id:內容(用戶名,登陸信息)
主流使用場景:cookies + session
一、session文件提供NFS共享
二、session文件提供rsync scp共享
三、將session的內容存放在數據庫(mysql)中,全部的機器均可以經過ip:port讀取
四、將session的內容存放在緩存數據庫中,全部的機器均可以經過ip:port讀取
好處:利用斷電、重啓丟失數據的特性。定時清理數據;提升併發
啓動Memcached吋,根據指定的內存大小參數,會被分配一個內存個間。當咱們讀取數據庫的各種業務數據後,數據會同吋放入Memcached緩存中,,下一次用戶請求一樣的數據,程序直接去Memcached取數據返回給用戶。
優勢:
① 對於用戶來說,用戶訪問網站更快了,體驗更好了。#
② 對網站來講,數據庫壓力下降了。只有當內存沒有數據時纔會去請求數據庫。第一次寫入的數據 也會請求數據庫。通常公司沒有預熱,只有,用戶讀取過數據庫纔會放到Memcached中。
③ 提高了網站的併發訪問,減小服務器數最。
原理圖
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
[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
[root@cache01 ~]# yum -y install memcached
[root@cache01 ~]# cat /etc/sysconfig/memcached PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS=""
[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
[root@cache01 ~]# systemctl start memcached.service
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>指定。 |
寫入讀取數據
[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
命令集
#編譯進去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
[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
使用的軟件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界面管理全中文,較爲簡單
經過程序實現
[root@web06 ~]# cat /application/nginx/html/blog/wp-content/object-cache.php
方法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