


大型網(wǎng)站優(yōu)化-memcache技術(shù),優(yōu)化-memcache技術(shù)_PHP教程
Jul 12, 2016 am 08:55 AM大型網(wǎng)站優(yōu)化-memcache技術(shù),優(yōu)化-memcache技術(shù)
大型網(wǎng)站優(yōu)化-memcache技術(shù)
memory+cache 內(nèi)存緩存
memcache簡介
memcache是一套分布式的高速緩存系統(tǒng),由LiveJournal的Brad Fitzpatrick開發(fā),目前被許多網(wǎng)站使用以提升網(wǎng)站的訪問速度,尤其對于一些大型的、需要頻繁訪問數(shù)據(jù)庫的網(wǎng)站訪問速度提升效果十分顯著 。這是一套開放源代碼軟件,以BSD license授權(quán)發(fā)布。【摘取自百度百科】
官網(wǎng):http://memcached.org/
?
分布式:多臺Memcache服務器來管理數(shù)據(jù)的架構(gòu)。
緩存系統(tǒng):將用戶查詢的數(shù)據(jù)緩存到內(nèi)存之中,方便下次直接從內(nèi)存中獲取。減少了磁盤IO的開銷。
什么是nosql?(sql 關(guān)系型數(shù)據(jù)庫)
答:MySQL 叫做關(guān)系型數(shù)據(jù)庫(主要的特點是都是一個二維表結(jié)構(gòu)(表中的行和列),表與表之間是由關(guān)系的)(oracle(Java)、db2、sqlserver)
非關(guān)系型數(shù)據(jù):就是不使用sql語句作為查詢的數(shù)據(jù)庫(保存數(shù)據(jù)的系統(tǒng)),并且沒有嚴格意義上的二維表的概念。它的數(shù)據(jù)結(jié)構(gòu)全部是一張巨大的hash表(key-value)
hash表好處: 時間復雜度是 0(1):隨著數(shù)據(jù)的增加,查詢時間不會存在數(shù)量級(1s)的變化。
hash表壞處: hash碰撞 不同 key 對應同一個值
?
key1 ===MD5(sql) |
Asion |
key2 |
12 |
key3 |
shenzhen |
key4 |
iphone |
?
????
讓selinux立即生效
?
2.1 環(huán)境準備
在Linux環(huán)境下,需要gcc、g-c++、make(makefile)、cmake、autoconfig(configure)、libtool等工具
在Linux下聯(lián)網(wǎng)的情況下,使用如下命令
# yum install -y gcc make cmake autoconfig libtool
-y 不需要使用確認交互式
?
2.2 編譯安裝memcached
memcached依賴于 libevent庫,因此需要先安裝,分別到各自的官網(wǎng)下載穩(wěn)定版
libevetnt官網(wǎng):http://libevent.org/
memcache官網(wǎng):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
?
如果需要查看參數(shù)信息,使用 memcached -h 查看幫助:
操作memcache
memcached的客戶端與服務器端的通信很簡單,基于文本的協(xié)議,類似http協(xié)議,可以直接使用Telnet來做交互
?
使用Telnet操作(quit退出)
# telent 服務器的IP 11211
連接之后 使用 ctrl + ] 打開Telnet的回顯
?
2. 基本命令:
學習memcache的增刪改查命令:
add key flag expire length
key: 名稱
flag: 1 memcache按照字符串的方式保存
expire:過期時間,memcache時間
length:數(shù)據(jù)長度(B)
※add 增加
# add name 1 0 2 # 在memcache服務器上添加一個key為的name值 長度為2個字節(jié),有效期長期有效
?
如何理解expire
設(shè)置緩存的有效期,有三種格式
最近最少使用原則
?
※delete 刪除
# delete key
?
※replace 替換
# replace key flag expire length
?
※get 獲取
# get key
?
※set 如果數(shù)據(jù)有 replace ,沒有則 add
# set key flag expire length
name存在:
age不存在:
?
※incr 增加
# incr age NUMBER
?
※decr 減少
# decr age NUMBER
?
※stats 統(tǒng)計memcache服務器信息
# stats
?
※flush_all 清空所有數(shù)據(jù)
# flush_all
使用php操作memcache
?
beta :測試版:一般都有一些小bug,但是需要用戶去使用發(fā)現(xiàn),如果有問題,可以給官方反饋。然后在做修復
alpha:內(nèi)部測試版:內(nèi)部在開發(fā)的時候,使用的版本,一般這個版本bug眾多。但是這個版本往往有新的功能加入。(一般也是新公司才試試)alpha版本有一些補償。
stable:穩(wěn)定版:基本無bug,能夠穩(wěn)定的運行。
?
ftp使用的注意事項:
?
?
# cls
# cd
# vim .bashrc
?
Linux下載末行模式下
# :x 小寫 退出 wq
linux在編輯模式下
# Z 大寫
?
?
# /usr/local/php/bin/phpize 絕對路徑phpize
d. 利用上面生成的configure文件,收集系統(tǒng)信息 不需要指定安裝路徑
# ./configure --with-php-config=/usr/local/php/bin/php-config 告訴它如何去找php配置文件
e. 執(zhí)行編譯、安裝
# make && make install
注意:可以查看上述命令執(zhí)行完成之后的結(jié)構(gòu)
# 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下,關(guān)閉一個服務 可以使用
# 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,保存并獲取值
memcached的內(nèi)存管理與刪除機制
?
注意:Memcache最大的value也只能是1M的空間。
?
注意:內(nèi)存碎片化永遠都存在,只是哪一種方式可以使得內(nèi)存碎片最小。
?
1. 什么是內(nèi)存碎片化?
在使用這種內(nèi)存緩存系統(tǒng)的時候,由于不斷的申請,釋放,就會形成一些很小的內(nèi)存片段,無法被利用,這種現(xiàn)象就叫做,內(nèi)存的碎片化。這個小紅塊就是操作系統(tǒng)無法使用的空間。
?
memcache利用slab allocator的方式來管理(每個slab class大小為1M)
最小的單元叫做 chunk(小塊):存放數(shù)據(jù)的倉庫
多個小單元組成一個chunks:多個小塊組成(所有的小塊的大小全部一致)
每個 slab class的大小為1M
?
注意:如果 122Bytes的slab裝滿了,現(xiàn)在有一個100Bytes的數(shù)據(jù)來了,存到哪里去?
答:肯定不會存在144,還是存在122這個chunk里面,利用LRU算法來實現(xiàn)數(shù)據(jù)存儲。
?
?
memcached在啟動的時候,會按照一定的大小來組織slab class,可以通過-f 來指定
默認是1.25,相鄰chunk之間的比值就是增加因子??梢愿鶕?jù)自己網(wǎng)站的業(yè)務調(diào)整緩存因子的大小。
是因為每個業(yè)務不一樣,所需要的最小的chunk是不一樣的。這個參數(shù)使得我們的系統(tǒng)變得更加適應自己的業(yè)務,因為數(shù)據(jù)可以自己設(shè)定大小。
?
memcached內(nèi)部不會監(jiān)視記錄是否過期,而是在get時查看記錄的時間戳,檢查記錄是否過期。這種行為被稱為lazy(惰性)expiration。因此,好處是memcached不會在過期監(jiān)視上耗費CPU時間。
比如:有 set(name, asion, 0, 3600) 過了3600秒就失效,失效后,并不會自動刪除,只有當get查詢時,檢測是否過期,如果過期則刪除。
例如 # add name 1 8 2 當8s后,是失效,還是不存在?通過stats分析
分析:是失效你,而不是不存在,只有在下一次去獲取時候,memcache才會去檢測它是否過期,過期了就刪除
?
memcached會優(yōu)先使用已超時的記錄的空間,但即使如此,也會發(fā)生追加新記錄時空間不足的情況,此時就要使用名為 Least Recently Used(LRU)機制來分配空間。
顧名思義,這是刪除"最近最少使用"的記錄的機制。因此,當memcached的內(nèi)存空間不足時(無法從slab class 獲取到新的空間時),就從最近未被使用的記錄中搜索,并將其空
間分配給新的記錄。從緩存的實用角度來看,該模型十分理想。
?
當mecache里面的數(shù)據(jù)空間(默認是64M)已經(jīng)占滿了,再繼續(xù)存儲數(shù)據(jù)能否存儲呢?
答:能存儲,要刪除過期的數(shù)據(jù),如果都沒有過期,則刪除最不活躍的數(shù)據(jù),騰出空間給后面添加數(shù)據(jù)。
例如:以122Bytes的slab舉例,當數(shù)據(jù)裝滿后,如果來了一個100Bytes數(shù)據(jù),如何處理?(即使永久有效,也會被踢)
分析:內(nèi)存的管理 LRU算法 、FIFO算法
?
注意:在vim下如果輸入了 ctrl+s 可以使用 ctrl+q 退出
-p 監(jiān)聽的端口
-l 連接的IP地址, 默認是本機
-d start 啟動memcached服務
-d restart 重起memcached服務
-d stop|shutdown 關(guān)閉正在運行的memcached服務
-d install 安裝memcached服務
-d uninstall 卸載memcached服務
-u 以的身份運行 (僅在以root運行的時候有效)
-m 最大內(nèi)存使用,單位MB。默認64MB
注意:如果系統(tǒng)是32位的,則最大限制為2G,如果系統(tǒng)是64位,則無限制。
-M 內(nèi)存耗盡時返回錯誤,而不是刪除項
-c 最大同時連接數(shù),默認是1024
-f 塊大小增長因子,默認是1.25
-n 最小分配空間,key+value+flags默認是48
-h 顯示幫助
-v 輸出警告和錯誤信息
-vv 打印客戶端的請求和返回信息
-i 打印memcached和libevent的版權(quán)信息
?
實際使用場景
保存: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來提供緩存的功能,這種架構(gòu)就叫做memcache的分布式緩(集群)存系統(tǒng)
?
如何實現(xiàn)?
可以這樣理解,如何將數(shù)據(jù)分散答各臺Memcache服務器上。
?
在客戶端實現(xiàn)分布式,在數(shù)據(jù)保存之前,根據(jù)一定的算法,將數(shù)據(jù)保存到那臺memcache服務器上,在獲取數(shù)據(jù)的時候,按照前面相同的算法去對應的memcache服務器上獲取數(shù)據(jù)
?
分布式算法
將key的值對服務器的臺數(shù)取余,然后將對應的value值保存到對應的余數(shù)的那臺memcache服務器上,一般這個hash函數(shù) crc32( key ) % 3
crc32()這個函數(shù)可以使得一個字符串變成一個32位的整數(shù)
?
壞處:當某一臺服務器宕機或者需要增加一臺服務器的時候,這個時候緩存數(shù)據(jù)基本全部失效,因為除數(shù)變了。 不嚴格的公式, 命中率 = 取到數(shù)據(jù)/總數(shù) 1/N N代表服務器的臺數(shù)
?
引發(fā)出來的問題:當memcache宕機之后,緩存數(shù)據(jù)失效,這個時候MySQL的壓力會驟增,
這個時候,MySQL會宕機,然后在重啟MySQL,MySQL會在短時期內(nèi)再次宕機,然后,稍微延遲一點(緩存已經(jīng)重新建立了一部分),又宕機。隨著時間的慢慢推移,MySQL基本上趨于穩(wěn)定,緩存系統(tǒng)成功建立。因為緩存數(shù)據(jù)不存在,所有的請求全部要轉(zhuǎn)向MySQL來提供,這種現(xiàn)象就叫做memcache的雪崩現(xiàn)象。
?
概圖:
?
?
?
?
?
?
注意:只要是memcache宕機,就一定會有數(shù)據(jù)的丟失。但是要想辦法讓數(shù)據(jù)丟失的最少,使用一致性hash,即使有一臺服務器宕機,也只是影響一臺服務器上的數(shù)據(jù)。
?
虛擬節(jié)點:分擔任務
緩存雪崩現(xiàn)象
雪崩造成的原因?
解決方案:一致性hash算法
?
解決方案:緩存時間設(shè)置成一個范圍內(nèi)的隨機時間(3-9小時)
?
由于某個memcache節(jié)點的緩存數(shù)據(jù)失效,導致其他memcache節(jié)點的緩存命中率下降,緩存中缺失的數(shù)據(jù)會去MySQL數(shù)據(jù)庫中查詢,短時期內(nèi),造成了MySQL服務器壓力巨大,造成宕機,就叫做緩存雪崩現(xiàn)象。
?
當重啟MySQL之后,短期內(nèi)再次宕機,但緩存數(shù)據(jù)已經(jīng)建立了一部分,在MySQL反復多次啟動之后,緩存全部重建完畢,MySQL不再宕機趨于穩(wěn)定。
?
解決方案:把緩存的時間設(shè)置成一個范圍內(nèi)的隨機值(3-9小時),這樣就在不同的時間段失效,把重建的工作分擔到不同的時間上。
memcache如何做高可用
?
答:
?
答:
由于memcache的本身設(shè)計就是極為簡潔的,根本沒有設(shè)置權(quán)限方面的限制。為什么不設(shè)置權(quán)限? 只提供緩存功能,為了精簡
192.168.1.221 ---224
3. 當使用文件保存session文件時候,如果文件過多,如何處理?
一般來說,超過65535個session文件的時候,這個時候session的獲取就會變得異常緩慢,意味php代碼執(zhí)行很慢,如何解決?
答:
分層處理: 一個文件夾下建立A-Z開頭的文件夾 然后A_Z在建立
使用memcache處理: 單臺memcache處理能力有限,就使用分布式memcache來處理
答:負載均衡集群提供了高可用的能力,如果某一臺宕機之后,還是可以提供正常的服務,只是服務提供的有些吃力而已。
因為負載均衡集群不提供keepalive的機制。監(jiān)控機制
?
案例:
在項目中如何使用Memcache?
Memcache存在的意義就是緩存數(shù)據(jù),減輕MySQL的壓力。
?
?
擴展
答:
extension_dir='上面生成的目錄'
extension='NAME.so'
?

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Masalah dan penyelesaian biasa untuk skop pembolehubah PHP termasuk: 1. Pembolehubah global tidak dapat diakses dalam fungsi, dan ia perlu diluluskan menggunakan kata kunci atau parameter global; 2. Pembolehubah statik diisytiharkan dengan statik, dan ia hanya dimulakan sekali dan nilai dikekalkan antara pelbagai panggilan; 3. Pembolehubah hyperglobal seperti $ _get dan $ _post boleh digunakan secara langsung dalam mana -mana skop, tetapi anda perlu memberi perhatian kepada penapisan yang selamat; 4. Fungsi Anonymous perlu memperkenalkan pembolehubah skop induk melalui kata kunci penggunaan, dan apabila mengubah suai pembolehubah luaran, anda perlu lulus rujukan. Menguasai peraturan ini boleh membantu mengelakkan kesilapan dan meningkatkan kestabilan kod.

Untuk mengendalikan muat naik fail PHP dengan selamat, anda perlu mengesahkan sumber dan jenis, mengawal nama fail dan laluan, menetapkan sekatan pelayan, dan memproses fail media dua kali. 1. Sahkan sumber muat naik untuk mengelakkan CSRF melalui token dan mengesan jenis mime sebenar melalui finfo_file menggunakan kawalan putih; 2. Namakan semula fail ke rentetan rawak dan tentukan pelanjutan untuk menyimpannya dalam direktori bukan web mengikut jenis pengesanan; 3. Konfigurasi PHP mengehadkan saiz muat naik dan direktori sementara Nginx/Apache melarang akses ke direktori muat naik; 4. Perpustakaan GD menyambung semula gambar -gambar untuk membersihkan data yang berpotensi.

Terdapat tiga kaedah umum untuk kod komen PHP: 1. Use // atau # untuk menyekat satu baris kod, dan disyorkan untuk menggunakan //; 2. Gunakan /.../ untuk membungkus blok kod dengan pelbagai baris, yang tidak boleh bersarang tetapi boleh diseberang; 3. Komen -komen kemahiran gabungan seperti menggunakan / jika () {} / untuk mengawal blok logik, atau untuk meningkatkan kecekapan dengan kunci pintasan editor, anda harus memberi perhatian kepada simbol penutupan dan mengelakkan bersarang apabila menggunakannya.

Ageneratorinphpisamemory-efficientwaytoiterateOverlargedatasetsbyieldingvaluesonateatimeNsteadofreturningthemallatonce.1.GeneratorSuseTheyEldeyWorderWorderToProducevaluuesondemand,

Kunci untuk menulis komen PHP adalah untuk menjelaskan tujuan dan spesifikasi. Komen harus menjelaskan "mengapa" dan bukannya "apa yang dilakukan", mengelakkan redundansi atau terlalu kesederhanaan. 1. Gunakan format bersatu, seperti docblock (/*/) untuk deskripsi kelas dan kaedah untuk meningkatkan keserasian dan keserasian alat; 2. Menekankan sebab -sebab di sebalik logik, seperti mengapa JS melompat perlu dikeluarkan secara manual; 3. Tambahkan gambaran keseluruhan gambaran sebelum kod kompleks, terangkan proses dalam langkah -langkah, dan membantu memahami idea keseluruhan; 4. Gunakan Todo dan Fixme secara rasional untuk menandakan item dan masalah untuk memudahkan penjejakan dan kerjasama berikutnya. Anotasi yang baik dapat mengurangkan kos komunikasi dan meningkatkan kecekapan penyelenggaraan kod.

Tolearnphpeffectively, startbysettingupalocalverenvironmentusingToolsLikexamppandaCodeDitorLikevscode.1) InstallXamppforapa Che, MySql, danPhp.2) UseAcodeeditorForsyntaxSupport.3) testyoursetupwithasimplephpfile.next, learnphpbasicsincludingvariables, ech

Dalam PHP, anda boleh menggunakan kurungan persegi atau pendakap keriting untuk mendapatkan aksara indeks spesifik rentetan, tetapi kurungan persegi disyorkan; Indeks bermula dari 0, dan akses di luar julat mengembalikan nilai null dan tidak dapat diberikan nilai; MB_SUBSTR dikehendaki mengendalikan watak multi-bait. Sebagai contoh: $ str = "hello"; echo $ str [0]; output h; dan watak -watak Cina seperti MB_SUBSTR ($ str, 1,1) perlu mendapatkan hasil yang betul; Dalam aplikasi sebenar, panjang rentetan perlu diperiksa sebelum gelung, rentetan dinamik perlu disahkan untuk kesahihan, dan projek berbilang bahasa mengesyorkan menggunakan fungsi keselamatan multi-bait secara seragam.

Toinstallphpquickly, usexampponwindowsorhomeBrewonmacos.1.onwindows, downloadandInstallxampp, selectcomponents, startapache, andplaceFilesinhtdocs.2.alternative, secara manualstallphpfromphp.netandsheBerver.3
