緩存: 將數據存儲到內存中,只有當磁盤勝任不了的時候,纔會啓用緩存php
缺點:斷電數據丟失(雙電),用緩存存儲數據的目的只是爲了應付大併發的業務。html
數據庫: mysql(關係型數據庫,可以保證數據一致性,保證數據不丟失,當由於功能太多,致使性能不高) ===數據參考前端
緩存數據庫: memcache redis(非關係型數據庫,性能極高,但不保證數據完整性) === 業務的數據提供者mysql
memcachedb 會將內存的數據寫入到磁盤中nginx
redis 主要工做場所是內存中,可是按期備分內存數據到硬盤web
數據存儲,數據倉庫選擇mysql這種磁盤的數據庫面試
高併發,業務大的應用選擇memcache這種內存數據庫redis
關係型數據庫 mysql算法
非關係型數據庫(NOSQL) memcached redis MongoDBsql
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 光標移至行首,但不換行
參數 | 說明 |
---|---|
|
是在取回內容時,與數據和發送塊一同保存服務器上的任意16位無符號整形(用十進制來書寫)。客戶端能夠用它做爲「位域」來存儲一些特定的信息;它對服務器是不透明的。 |
|
是終止時間。若是爲0,該項永不過時(雖然它可能被刪除,以便爲其餘緩存項目騰出位置)。若是非0(Unix時間戳或當前時刻的秒偏移),到達終止時間後,客戶端沒法再得到這項內容 |
|
是隨後的數據區塊的字節長度,不包括用於分頁的「\r\n」。它能夠是0(這時後面跟隨一個空的數據區塊)。 |
\r\n | 是大段的8位數據,其長度由前面的命令行中的
|
寫入讀取數據
[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的模塊
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
[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://clsn.io
歡迎關注公衆號 【碼農開花】一塊兒學習成長 我會一直分享Java乾貨,也會分享免費的學習資料課程和麪試寶典 回覆:【計算機】【設計模式】【面試】有驚喜哦