memory+cache 內存緩存php
memcache是一套分佈式的高速緩存系統,由LiveJournal的Brad Fitzpatrick開發,目前被許多網站使用以提高網站的訪問速度,尤爲對於一些大型的、須要頻繁訪問數據庫的網站訪問速度提高效果十分顯著 。這是一套開放源代碼軟件,以BSD license受權發佈。【摘取自百度百科】mysql
官網:http://memcached.org/linux
分佈式:多臺Memcache服務器來管理數據的架構。c++
緩存系統:將用戶查詢的數據緩存到內存之中,方便下次直接從內存中獲取。減小了磁盤IO的開銷。算法
什麼是nosql?(sql 關係型數據庫)sql
答:MySQL 叫作關係型數據庫(主要的特色是都是一個二維表結構(表中的行和列),表與表之間是由關係的)(oracle(Java)、db二、sqlserver)數據庫
非關係型數據:就是不使用sql語句做爲查詢的數據庫(保存數據的系統),而且沒有嚴格意義上的二維表的概念。它的數據結構所有是一張巨大的hash表(key-value)vim
hash表好處: 時間複雜度是 0(1):隨着數據的增長,查詢時間不會存在數量級(1s)的變化。瀏覽器
hash表壞處: hash碰撞 不一樣 key 對應同一個值緩存
key1 ===MD5(sql) |
Asion |
key2 |
12 |
key3 |
shenzhen |
key4 |
iphone |
在使用的時候,先從nosql數據庫裏面獲取,有的話直接返回,沒有的話就先從MySQL獲取,而後緩存到memcache裏面,下次直接從memcache裏面返回。
1. MemcacheDB能夠持久化保存數據。2. repcached也能夠實現數據的持久化
注意:NoSQL是否可以取到MySQL(關係型數據庫)?
答: nosql的存在永遠不是爲了取代MySQL(關係型數據),是關係型數據的一個補充。由於關係型數據庫有它獨特的地方(事務,存儲過程)。
Nosql主要使用的場景:社交型網站(人人、校內、豆瓣)
課下了解:什麼是C10K問題?C100K
答:c10k 表明的含義就是當網站的併發數達到 1w 時候網站的總體架構會所有的更新,就叫作c10k,目前已經被NoSQL數據庫完美的解決。可是又有 c100k 的問題?
架構網站:
1.1 直接將memcached文件放置到某一文件夾下(千萬不要使用中文命名的文件夾 | 空格)
1.2 在cmd下執行以下命令(不能關閉)可使用Ctrl+c 終止
memcache的端口 11211
1.3 查看是否啓動(新開一個窗口),執行以下命令
# netstat -an
讓selinux當即生效
2.1 環境準備
在Linux環境下,須要gcc、g-c++、make(makefile)、cmake、autoconfig(configure)、libtool等工具
在Linux下聯網的狀況下,使用以下命令
# yum install -y gcc make cmake autoconfig libtool
-y 不須要使用確認交互式
2.2 編譯安裝memcached
memcached依賴於 libevent庫,所以須要先安裝,分別到各自的官網下載穩定版
libevetnt官網:http://libevent.org/
memcache官網:http://memcached.org/
先編譯安裝libevent,在編譯安裝memcached,同時在安裝memcached須要指定libevent的安裝路徑
具體步驟:
上傳
# ./configure --prefix=/usr/local/libevent && make && make install
b. 安裝memcache,解壓、編譯、安裝
# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent && make && make install
2.3 memcached的啓動
# /usr/local/memcached/bin/memcached -m 64 -p 11211 -u nobody -vv
注意:此時memcached成功啓動,但把信息輸出到控制檯。
若是想讓memcached做爲服務在後臺啓動,只須要加上-d選項(daemon 後臺)
# /usr/local/memcached/bin/memcached -m 64 -p 11211 -u nobody -d
如何查看服務器是否正常啓動?
# ps axu | grep memcached
若是須要查看參數信息,使用 memcached -h 查看幫助:
memcached的客戶端與服務器端的通訊很簡單,基於文本的協議,相似http協議,能夠直接使用Telnet來作交互
使用Telnet操做(quit退出)
# telent 服務器的IP 11211
鏈接以後 使用 ctrl + ] 打開Telnet的回顯
2. 基本命令:
學習memcache的增刪改查命令:
add key flag expire length
key: 名稱
flag: 1 memcache按照字符串的方式保存
expire:過時時間,memcache時間
length:數據長度(B)
※add 增長
# add name 1 0 2 # 在memcache服務器上添加一個key爲的name值 長度爲2個字節,有效期長期有效
如何理解expire
設置緩存的有效期,有三種格式
最近最少使用原則
※delete 刪除
# delete key
※replace 替換
# replace key flag expire length
※get 獲取
# get key
※set 若是數據有 replace ,沒有則 add
# set key flag expire length
name存在:
age不存在:
※incr 增長
# incr age NUMBER
※decr 減小
# decr age NUMBER
※stats 統計memcache服務器信息
# stats
※flush_all 清空全部數據
# flush_all
beta :測試版:通常都有一些小bug,可是須要用戶去使用發現,若是有問題,能夠給官方反饋。而後在作修復
alpha:內部測試版:內部在開發的時候,使用的版本,通常這個版本bug衆多。可是這個版本每每有新的功能加入。(通常也是新公司才試試)alpha版本有一些補償。
stable:穩定版:基本無bug,可以穩定的運行。
ftp使用的注意事項:
# cls
# cd
# vim .bashrc
Linux下載末行模式下
# :x 小寫 退出 wq
linux在編輯模式下
# Z 大寫
# /usr/local/php/bin/phpize 絕對路徑phpize
d. 利用上面生成的configure文件,收集系統信息 不須要指定安裝路徑
# ./configure --with-php-config=/usr/local/php/bin/php-config 告訴它如何去找php配置文件
e. 執行編譯、安裝
# make && make install
注意:能夠查看上述命令執行完成以後的結構
# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
注意:在Linux下,如何查看php.ini配置文件的位置?
解決:phpinfo();
注意:在Linux下,修改配置文件以前,必定要備份
php.ini-backup-2016-1-12
注意:.so是什麼文件?
.so是Linux下的共享對象,類型Windows下的.dll文件
注意:Linux下,關閉一個服務 可使用
# pkill -9 httpd
# ps aux | grep httpd
#ps uax | grep httpd
將上面生成的地址增長到php.ini配置文件,以下
extension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
extension=memcacahe.so
創建一個test.php文件,測試php是否有memcache的一個模塊
php操做memcache,保存並獲取值
注意:Memcache最大的value也只能是1M的空間。
注意:內存碎片化永遠都存在,只是哪種方式可使得內存碎片最小。
1. 什麼是內存碎片化?
在使用這種內存緩存系統的時候,因爲不斷的申請,釋放,就會造成一些很小的內存片斷,沒法被利用,這種現象就叫作,內存的碎片化。這個小紅塊就是操做系統沒法使用的空間。
memcache利用slab allocator的方式來管理(每一個slab class大小爲1M)
最小的單元叫作 chunk(小塊):存放數據的倉庫
多個小單元組成一個chunks:多個小塊組成(全部的小塊的大小所有一致)
每一個 slab class的大小爲1M
注意:若是 122Bytes的slab裝滿了,如今有一個100Bytes的數據來了,存到哪裏去?
答:確定不會存在144,仍是存在122這個chunk裏面,利用LRU算法來實現數據存儲。
memcached在啓動的時候,會按照必定的大小來組織slab class,能夠經過-f 來指定
默認是1.25,相鄰chunk之間的比值就是增長因子。能夠根據本身網站的業務調整緩存因子的大小。
是由於每一個業務不同,所須要的最小的chunk是不同的。這個參數使得咱們的系統變得更加適應本身的業務,由於數據能夠本身設定大小。
memcached內部不會監視記錄是否過時,而是在get時查看記錄的時間戳,檢查記錄是否過時。這種行爲被稱爲lazy(惰性)expiration。所以,好處是memcached不會在過時監視上耗費CPU時間。
好比:有 set(name, asion, 0, 3600) 過了3600秒就失效,失效後,並不會自動刪除,只有當get查詢時,檢測是否過時,若是過時則刪除。
例如 # add name 1 8 2 當8s後,是失效,仍是不存在?經過stats分析
分析:是失效你,而不是不存在,只有在下一次去獲取時候,memcache纔會去檢測它是否過時,過時了就刪除
memcached會優先使用已超時的記錄的空間,但即便如此,也會發生追加新記錄時空間不足的狀況,此時就要使用名爲 Least Recently Used(LRU)機制來分配空間。
顧名思義,這是刪除"最近最少使用"的記錄的機制。所以,當memcached的內存空間不足時(沒法從slab class 獲取到新的空間時),就從最近未被使用的記錄中搜索,並將其空
間分配給新的記錄。從緩存的實用角度來看,該模型十分理想。
當mecache裏面的數據空間(默認是64M)已經佔滿了,再繼續存儲數據可否存儲呢?
答:能存儲,要刪除過時的數據,若是都沒有過時,則刪除最不活躍的數據,騰出空間給後面添加數據。
例如:以122Bytes的slab舉例,當數據裝滿後,若是來了一個100Bytes數據,如何處理?(即便永久有效,也會被踢)
分析:內存的管理 LRU算法 、FIFO算法
注意:在vim下若是輸入了 ctrl+s 可使用 ctrl+q 退出
-p 監聽的端口
-l 鏈接的IP地址, 默認是本機
-d start 啓動memcached服務
-d restart 重起memcached服務
-d stop|shutdown 關閉正在運行的memcached服務
-d install 安裝memcached服務
-d uninstall 卸載memcached服務
-u 以的身份運行 (僅在以root運行的時候有效)
-m 最大內存使用,單位MB。默認64MB
注意:若是系統是32位的,則最大限制爲2G,若是系統是64位,則無限制。
-M 內存耗盡時返回錯誤,而不是刪除項
-c 最大同時鏈接數,默認是1024
-f 塊大小增加因子,默認是1.25
-n 最小分配空間,key+value+flags默認是48
-h 顯示幫助
-v 輸出警告和錯誤信息
-vv 打印客戶端的請求和返回信息
-i 打印memcached和libevent的版權信息
保存:1. 文件 2. mysql
問題:若是一個文件夾下session文件過多,檢索變慢,如何處理?
答:分層處理
使用Memcache來保存,Memcache使用分佈式來保存(拿多臺Memcache作存儲)
使用memcache保存session
1. 修改php.ini文件,配置信息以下
session.save_handler = memcache #表明使用memcache保存session
session.save_path ="tcp://127.0.0.1:11211" # 指定memcache服務器的地址和端口
1. 開啓session,保存session
什麼是分佈式?
因爲單臺memcache的服務能力有限,可使用多臺memcache來提供緩存的功能,這種架構就叫作memcache的分佈式緩(集羣)存系統
如何實現?
能夠這樣理解,如何將數據分散答各臺Memcache服務器上。
在客戶端實現分佈式,在數據保存以前,根據必定的算法,將數據保存到那臺memcache服務器上,在獲取數據的時候,按照前面相同的算法去對應的memcache服務器上獲取數據
分佈式算法
將key的值對服務器的臺數取餘,而後將對應的value值保存到對應的餘數的那臺memcache服務器上,通常這個hash函數 crc32( key ) % 3
crc32()這個函數可使得一個字符串變成一個32位的整數
壞處:當某一臺服務器宕機或者須要增長一臺服務器的時候,這個時候緩存數據基本所有失效,由於除數變了。 不嚴格的公式, 命中率 = 取到數據/總數 1/N N表明服務器的臺數
引起出來的問題:當memcache宕機以後,緩存數據失效,這個時候MySQL的壓力會驟增,
這個時候,MySQL會宕機,而後在重啓MySQL,MySQL會在短時期內再次宕機,而後,稍微延遲一點(緩存已經從新創建了一部分),又宕機。隨着時間的慢慢推移,MySQL基本上趨於穩定,緩存系統成功創建。由於緩存數據不存在,全部的請求所有要轉向MySQL來提供,這種現象就叫作memcache的雪崩現象。
概圖:
注意:只要是memcache宕機,就必定會有數據的丟失。可是要想辦法讓數據丟失的最少,使用一致性hash,即便有一臺服務器宕機,也只是影響一臺服務器上的數據。
虛擬節點:分擔任務
雪崩形成的緣由?
解決方案:一致性hash算法
解決方案:緩存時間設置成一個範圍內的隨機時間(3-9小時)
因爲某個memcache節點的緩存數據失效,致使其餘memcache節點的緩存命中率降低,緩存中缺失的數據會去MySQL數據庫中查詢,短時期內,形成了MySQL服務器壓力巨大,形成宕機,就叫作緩存雪崩現象。
當重啓MySQL以後,短時間內再次宕機,但緩存數據已經創建了一部分,在MySQL反覆屢次啓動以後,緩存所有重建完畢,MySQL再也不宕機趨於穩定。
解決方案:把緩存的時間設置成一個範圍內的隨機值(3-9小時),這樣就在不一樣的時間段失效,把重建的工做分擔到不一樣的時間上。
答:
答:
因爲memcache的自己設計就是極爲簡潔的,根本沒有設置權限方面的限制。爲何不設置權限? 只提供緩存功能,爲了精簡
192.168.1.221 ---224
3. 當使用文件保存session文件時候,若是文件過多,如何處理?
通常來講,超過65535個session文件的時候,這個時候session的獲取就會變得異常緩慢,意味php代碼執行很慢,如何解決?
答:
分層處理: 一個文件夾下創建A-Z開頭的文件夾 而後A_Z在創建
使用memcache處理: 單臺memcache處理能力有限,就使用分佈式memcache來處理
答:負載均衡集羣提供了高可用的能力,若是某一臺宕機以後,仍是能夠提供正常的服務,只是服務提供的有些吃力而已。
由於負載均衡集羣不提供keepalive的機制。監控機制
在項目中如何使用Memcache?
Memcache存在的意義就是緩存數據,減輕MySQL的壓力。
答:
extension_dir='上面生成的目錄'
extension='NAME.so'