#本地緩存與分布式緩存
#Opcode 優化
##Opcode 原理 —— 回顧
以下哪個不是PHP語言開發Web應用的三個可以重大優化之處?
A、作為解釋型語言
B、SAPI 的每次環境重新加載(對比Clamd) C、作為動態語言
D、低效的數據結構
d
##OpCode 帶來的好處
1. 記得 SAPI 的優化是只加載一次環境,比如說模塊
2. 而 OpCode 帶來的好處是腳本只解析一次(模板
編譯也是如此)
3. 極大地減少了 IO
4. OpCode 還有一說是 Optimized Opcode
##OpCode 介紹
1 不是 PHP 所獨有
2 將人寫的代碼轉換為中間代碼
3 Java 也有字節碼
4 可以通過反匯編的方式看到
vld 擴展
php -dvld.active=1 -dvld.verbosity=3 -dvld.save_dir='./' - dvld.save_paths=1 -dvld.dump_paths=1 quotes.php
##不加任何 Cache 的測試
在正式開始介紹和演示之前,我們先關掉所有的插件來評測三次
ab ‐c 20 ‐n 1000
http://hjvote.app.ucai.cn/index.php?s=/Admin/index
Requests per second: Time per request: Requests per second: Time per request: Requests per second: Time per request:
178.63 [#/sec] (mean) 111.965 [ms] (mean)
177.80 [#/sec] (mean) 112.488 [ms] (mean)
174.70 [#/sec] (mean) 114.482 [ms] (mean)
**以下哪個是 PHP 模塊安裝必須要用到的命令?**
A、phpize
B、php-fpm b
C、./configure --with-php-config=xxx D、make
E、make install
F、make test
##OpCode 產品
A、Zend OpCache
B、APC
C、XCache
D、eAccelerator
**A、Zend OpCache**
Zend 出品? Lead :鳥哥
Requests per second: Time per request: Requests per second: Time per request: Requests per second: Time per request:
424.31 [#/sec] (mean) 47.135 [ms] (mean)
457.50 [#/sec] (mean) 43.716 [ms] (mean)
446.40 [#/sec] (mean) 44.802 [ms] (mean)
**B、APC**
說兩個亮點:
一、項目 Lead Rasmus Lerdorf
二、Facebook 在早期大量地應用 APC
apc.enabled = 1 apc.shm_segments = 1 apc.shm_size = 64m apc.optimization = 1 apc.num_files_hint = 0 apc.ttl = 0
apc.gc_ttl = 3600 apc.cache_by_default = on
表現不錯,但不是非常穩定
**C、XCache**
不能同時開啟, XCache 和 APC 否則會報錯。
Cannot load module 'XCache' because conflicting module 'apc' is already loaded in Unknown on line 0
另外 xcache.size 老啟用不成功
**D、eAccelerator**
Requests per second: Time per request: Requests per second: Time per request: Requests per second: Time per request:
423.97 [#/sec] (mean) 47.173 [ms] (mean)
性能較穩定,差別不大
428.52 [#/sec] (mean) 46.672 [ms] (mean)
465.26 [#/sec] (mean) 42.986 [ms] (mean)
###評測
**A、有無 OpCache 的比較 B、同 HHVM 的比較**
**ab ‐c 20 ‐n 1000**
"http://hjvote.app.ucai.cn/index.php"
Requests per second: Time per request: Requests per second: Time per request: Requests per second: Time per request:
1186.09 [#/sec] (mean) 16.862 [ms] (mean)
1166.30 [#/sec] (mean) 17.148 [ms] (mean)
1032.14 [#/sec] (mean) 19.377 [ms] (mean)
**有關 FastCGI+Nginx 環境以下哪個說法是不正確的?**
A、php-fpm 命令用于啟動 FastCGI 進程管理器
B、nginx 的 -t 參數可用于測試配置是否正確
C、nginx 的 -r 參數可用于重新加載 nginx 配置
nginx -s reload
D、nginx 命令、php-fpm 都可以不指定配置文件路徑啟動
E、nginx 指定 php-fpm 做后端,不可以指定多個端口的后端
可以指定多個端口做分發
F、可以配置多份 php-fpm.conf,啟動多份 php-fpm,占多個端口
G、php-fpm.conf 與 php.ini是并列關系,所以php-fpm并不需要 php.ini
答案 CEG
##OpCode 附帶的好處
**A、共享內存**
什么是共享內存?
一般情況下,PHP程序退出,所有資源釋放干凈,無法在進程間 傳遞數組,于是有了共享內存
**B、本地緩存**
local memcached
基于用戶的的會話保持 基于不同的用戶大量地取同樣的內容
減少對后端的壓力
本地緩存適用于web服務器很多 或memecache很多的場景下才能發揮他的作用
#本地緩存介紹與應用
##專門的 ShareMemory
**專門產品:Yac**
只是做 ShareMemory
出品人,Ya系列,鳥哥 一般特點,命令行下不能使用,頁面上可以使用,XCache也是如此
##本地緩存實踐
A、不用 OpCache
B、啟用 OpCache
C、不啟用本地緩存
D、加上本地緩存
**有關共享內存下面說法正確的是?**
A、PHP 自帶的共享內存,在命令行下也可以使用 B、APC、Yac 等的共享內存,可以當本地緩存使用 C、本地緩存可以跨機器共享
D、重啟了 php-fpm , Yac等的共享內存會丟失
答案 abd
## 本地緩存之介紹與實現
1、還記得 OpCache 么?
2、重用 OpCode 緩存擴展,可以提供本地緩存 以 APC 為例
3、使用擴展的本地緩存之注意事項,在命令行下 是不能使用的,為什么?
命令行下沒有進程來保存東西
4、也可以是獨立的本地緩存
## 怎么在擴展中使用本地緩存
~~~
static void store_value(char *key, zval *argv)
{
zval * function_name;
zval * retval_ptr; MAKE_STD_ZVAL(function_name); MAKE_STD_ZVAL(retval_ptr);
zval *ret;
ret = packstr(argv);
zval *arg; ALLOC_INIT_ZVAL(arg); array_init(arg); add_assoc_zval(arg, key, ret);
ZVAL_STRINGL(function_name,"apc_store",sizeof("apc_store")-1,1); if(call_user_function(CG(function_table),NULL,function_name,retval_ptr,1,&arg TSRMLS_CC) == SUCCESS)
}
{} zval_ptr_dtor(&function_name); zval_ptr_dtor(&retval_ptr);
~~~
## 本地緩存與集中式緩存
**1、本地緩存應用**
A、本地緩存運用的場景
微博粉絲 多少服務器 降到多少的量級
B、本地緩存的優勢
減少網絡傳輸
C、本地緩存的局限
5000臺的話數據重復 不能跨機器
**2、那什么是集中式緩存**
A、一臺機器與多臺機器
B、優勢在哪里
只要一份數據
C、問題在哪里?
**單點故障** 有一臺出問題 其他的都不能用
**有關非集中和集中式緩存下列說法正確的是:**
A、本地緩存屬于非集中式緩存
B、本地緩存屬于分布式緩存
C、集中式緩存是指存儲在一臺機器上的緩存
D、集中式緩存是指通過一個統一的接口能存取的 緩存,如果多臺機器則是分布式緩存
答案 A D
#多服務器分布式的緩存
什么叫分布式?
通過一個接口對外提供服務
無狀態分布式?
有狀態分布式?
后臺宕機不影響其他的
后臺有一臺down機 會影響到對外提供服務的接口比如memecache

** 有關分布式和分布式緩存下列說法正確的是:**
A、所謂分布式系統是一堆機器干一件事情,并且 節點之間通過網絡相連,并通過消息通信并協調 行動
B、本地緩存的各服務器之間,并無協同,各臺機 器獨立地干一件事情,所以不是分布式緩存
C、分布式緩存上面,每臺機器存儲的是不同的數 據
D、分布式緩存服務器之間需要建立互相聯系
答案:ABC
## 分布式緩存的數據存儲
產生的背景
有必要討論嗎?不就是 get、set么? 數據如何存取?
我們如何分配數據? 對機器數取模可以不可以? 如果是字符串 key 值呢?
## 取模的情況
1、假設兩臺機器,現在有兩組 key,比如是 5 和 4, 對 2 取模分別為 1、0 均分布于第2臺 和第1臺機器上(1,0分別對應第2、1臺服務 器)。
2、當增加一臺機器,到 3 臺機器,為了平衡, 對 3 取模,5,4,結果為 2,1,分別對應到了 第3臺和第2臺機器上(2,1,0分別對應第3、2、 1臺服務器)。
這意味著什么?
## 非一致性緩存帶來的問題包括以下:
A、新增或者減少設備整個緩存體系混亂 B、在設備發生調整時,造成了對后端的巨大壓力 C、重則使整個網站奔潰,輕則導致訪問緩慢 D、在每一時刻,緩存鍵值所處的機器都不確定
## 實驗校驗一下
1、六個 memcached 節點
兩臺機器、六個節點
/usr/local/bin/memcached -p 11212 -d -uroot
-m 32
/usr/local/bin/memcached -p 11213 -d -
uroot -m 32
/usr/local/bin/memcached -p 11214 -d -
uroot -m 32
## 實驗
1、檢測所有服務器的連通性
2、建立 memcached 緩存池,檢驗是否成功?
3、怎么判定 memcached 緩存池是否是一致性緩存?實測。
4、一致性的特點
單調性是指如果已經有一些內容通過哈希分派到了相應
的緩沖中,又有新的緩沖加入到系統中。哈希的結果應能夠
保證原有已分配的內容可以被映射到新的緩沖中去,而不會
被映射到舊的緩沖集合中的其他緩沖區。
#緩存數據存儲與一致性Hash
## 什么是一致性Hash
1、一致性緩存什么意思?
起碼不會隨著緩存服務器 IP 地址順序而發生大的變 化吧!
2、一致性 Hash 算法首先要考慮單調性
不會隨著個別服務器的更新或者減少而發生巨大的緩
存遷徙。
3、一致性 Hash 算法其次要考慮平衡性
平衡性是指哈希的結果能夠盡可能分布到所有的緩沖中
去,這樣可以使得所有的緩沖空間都得到利用。


## 圖解一致性 Hash —— PHP 實現
1、flexihash 庫
2、測試庫的使用
3、了解實現
#緩存總結與緩存使用
##什么是一致性Hash
## 多級緩存體系介紹
1、一再強調,緩存是重中之重,是我們心中的優 化之劍
2、我們現在來總結,緩存都有哪些?
3、設備、訪問路徑、前端、Web上、數據庫、其 他層、分發路徑?
4、好處,壞處
## 緩存之再細化
1、進程內緩存
2、頁面片斷緩存(ESI) 3、模板編譯、本地緩存、Opcode Cache
4、集中式緩存
5、中間層緩存
6、數據庫緩存
## 以下哪些不是Web 工程師要考慮的部分?
A、前端瀏覽器緩存
B、Web端文件緩存
C、CDN 文件緩存
D、用戶桌面系統的系統緩存
E、DNS 緩存
F、服務器端 tmpfs 緩存
答案 abcef
##緩存匯總與緩存使用
**1、緩存的本質**
A、空間換時間,減少遠程存取,減少運算
B、更快速度的設備、更近的距離
C、永遠都不是原始數據 所以要做好丟失的風險
D、在用戶體驗與效率之間的平衡 所有的架構都是平衡的藝術
**以下哪些數據要以保存在緩存里?**
A、頻繁更新的玩游戲的經驗值等數據 B、搶購商品的商品數目上限 C、社交網絡上的用戶好友關系 D、用戶個人資料信息
E、用戶賬戶的金錢信息,先更新到緩存,再更新 到庫中
答案abcd
#Redis和Memcache的區別分析
1、 Redis和Memcache都是將數據存放在內存中,都是內存數據庫。不過memcache還可用于緩存其他東西,例如圖片、視頻等等。
2、Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。
3、虛擬內存--Redis當物理內存用完時,可以將一些很久沒用到的value 交換到磁盤
4、過期策略--memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設定,例如expire name 10
5、分布式--設定memcache集群,利用magent做一主多從;redis可以做一主多從。都可以一主一從
6、存儲數據安全--memcache掛掉后,數據沒了;redis可以定期保存到磁盤(持久化)
7、災難恢復--memcache掛掉后,數據不可恢復; redis數據丟失后可以通過aof恢復
8、Redis支持數據的備份,即master-slave模式的數據備份。
- SWOOLE及php網絡編程
- LNMP架構與Socket,http協議
- 如何高效學習
- 開發工具箱
- 編寫高效的js
- js閉包編寫全功能的購物車
- JSON和JSONP
- 多級分類的開發與應用
- 設計安全的登錄注冊流程
- 前端性能優化
- 前端架構優化
- 使用第三方云服務加速產品開發
- 移動互聯網之API開發
- php分層
- 全文檢索的實踐與部署
- webIM的原理及前后端實現
- 如何配置高效的數據庫以及MySQL的代碼及插件開發
- NoSql.隊列,任務隊列
- 構建本機緩存,構建分布式緩存池
- 數據庫分庫分表的設計
- Nginx原理及模塊開發初步
- 無限擴充的數據庫架構
- php構建分庫分表分布式數據庫連接池
- 靜態文件上傳、分布式存儲與分發
- MySQL Cluster,Proxy分析與實踐
- 架構解密