緩存: 將數據存儲到內存中,只有當磁盤勝任不了的時候,才會啟用緩存
缺點:斷電數據丟失(雙電),用緩存存儲數據的目的只是為了應付大并發的業務。
數據庫: 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的意思。
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取數據返回給用戶。
優點:
?、?nbsp; 對于用戶來講,用戶訪問網站更快了,體驗更好了。#
?、?nbsp; 對網站來說,數據庫壓力降低了。只有當內存沒有數據時才會去請求數據庫。第一次寫入的數據 也會請求數據庫。一般公司沒有預熱,只有,用戶讀取過數據庫才會放到Memcached中。
?、?nbsp; 提升了網站的并發訪問,減少服務器數最。
原理圖
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位數據,其長度由前面的命令行中的<b |
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 11211STORED[root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211VALUE key011 0 10oldboy0987END[root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211END
刪除數據
[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的模塊

執行過程
編譯安裝
[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
默認用戶名密碼為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函數
鏈接:https://www.cnblogs.com/clsn/p/7999510.html
(版權歸原作者所有,侵刪)
本文鏈接:http://www.royaladd.com/45323.html
網友評論comments