您好,登錄后才能下訂單哦!
這篇文章主要講解了“PHP中的緩存技術有什么用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“PHP中的緩存技術有什么用”吧!
緩存是提高性能最好的方式,例如減少網絡I/O、減少磁盤I/O 等,使項目加載速度變的更快。
緩存可以是CPU緩存、內存緩存、硬盤緩存,不同的緩存查詢速度也不一樣(CPU緩存 > 內存緩存 > 硬盤緩存)。
接下來,給大家逐一進行介紹。
瀏覽器將請求過的頁面存儲在客戶端緩存中,當訪問者再次訪問這個頁面時,瀏覽器就可以直接從客戶端緩存中讀取數據,減少了對服務器的訪問,加快了網頁的加載速度。
用戶發送的請求,直接從客戶端緩存中獲取,不請求服務器。
根據 Expires 和 Cache-Control 判斷是否命中強緩存。
代碼如下:
header('Expires: '. gmdate('D, d M Y H:i:s', time() + 3600). ' GMT'); header("Cache-Control: max-age=3600"); //有效期3600秒
Cache-Control 還可以設置以下參數:
public:可以被所有的用戶緩存(終端用戶的瀏覽器/CDN服務器)
private:只能被終端用戶的瀏覽器緩存
no-cache:不使用本地緩存
no-store:禁止緩存數據
用戶發送的請求,發送給服務器,由服務器判定是否使用客戶端緩存。
代碼如下:
$last_modify = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']); if (time() - $last_modify < 3600) { header('Last-Modified: '. gmdate('D, d M Y H:i:s', $last_modify).' GMT'); header('HTTP/1.1 304'); //Not Modified exit; } header('Last-Modified: '. gmdate('D, d M Y H:i:s').' GMT');
將更新頻率低,讀取頻率高的數據,緩存成文件。
比如,項目中多個地方用到城市數據做三級聯動,我們就可以將城市數據緩存成一個文件(city_data.json),JS 可以直接讀取這個文件,無需請求后端服務器。
CMS(內容管理系統),也許大家都比較熟悉,比如早期的 DEDE、PHPCMS,后臺都可以設置靜態化HTML,用戶在訪問網站的時候讀取的都是靜態HTML,不用請求后端的數據庫,也不用Ajax請求數據接口,加快了網站的加載速度。
靜態化HTML有以下優點:
有利于搜索引擎的收錄(SEO)
頁面打開速度快
減少服務器負擔
CDN(Content Delivery Network)內容分發網絡。
用戶訪問網站時,自動選擇就近的CDN節點內容,不需要請求源服務器,加快了網站的打開速度。
緩存主要包括 HTML、圖片、CSS、JS、XML 等靜態資源。
Memcached 是高性能的分布式內存緩存服務器。
一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。
它也能夠用來存儲各種格式的數據,包括圖像、視頻、文件等。
Memcached 僅支持K/V類型的數據,不支持持久化存儲。
Memcache 與 Memcached 的區別
Memcached 從0.2.0開始,要求PHP版本>=5.2.0,Memcache 要求PHP版本>=4.3。
Memcached 最后發布時間為2018-12-24,Memcache 最后發布時間2013-04-07。
Memcached 基于libmemcached,Memcache 基于PECL擴展。
可以將 Memcached 看作是 Memcache 的升級版。
PHP Memcached 使用手冊:
http://www.php.net/manual/zh/book.memcached.php
Memcached 經常拿來與 Redis 做對比,接下來介紹下 Redis 緩存。
Redis 是一個高性能的 K/V 數據庫。
Redis 很大程度補償了 Memcached K/V存儲的不足,比如 List(鏈表)、Set(集合)、Zset(有序集合)、Hash(散列),既可以將數據存儲在內存中,也可以將數據持久化到磁盤上,支持主從同步。
總的來說,可以將 Redis 看作是 Memcached 的擴展版,更加重量級,功能更強大。
Redis 在日常工作中使用的居多。
MongoDB 是一個基于分布式文件存儲的數據庫。由 C++ 語言編寫。
旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。
MongoDB 是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。
利用 mod_expires
,指定緩存的過期時間,可以緩存HTML、圖片、JS、CSS 等。
打開 http.conf
,開啟模塊:
LoadModule expires_module modules/mod_expires.so
指定緩存的過期時間:
<IfModule expires_module> #打開緩存 ExpiresActive on #css緩存(8640000秒=10天) ExpiresByType text/css A8640000 #js緩存 ExpiresByType application/x-javascript A8640000 ExpiresByType application/javascript A8640000 #html緩存 ExpiresByType text/html A8640000 #圖片緩存 ExpiresByType image/jpeg A8640000 ExpiresByType image/gif A8640000 ExpiresByType image/png A8640000 ExpiresByType image/x-icon A8640000 </IfModule>
利用 expire
參數,指定緩存的過期時間,可以緩存HTML、圖片、JS、CSS 等。
打開 nginx.conf
:
//以圖片為例: location ~\.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的location root html; expires 1d; #指定緩存時間 }
大家也可以了解下:proxy_cache_path 和 proxy_cache,進行緩存的設置。
Opcode(Operate Code)操作碼。
PHP程序運行完后,馬上釋放所有內存,所有程序中的變量都銷毀,每次請求都要重新翻譯、執行,導致速度可能會偏慢。
當解釋器完成對腳本代碼的分析后,便將它們生成可以直接運行的中間代碼,也稱為操作碼。
操作碼 的目地是避免重復編譯,減少CPU和內存開銷。
APC(Alternative PHP Cache)可選 PHP 緩存。
APC 的目標是提供一個自由、 開放,和健全的框架,用于緩存、優化 PHP 中間代碼。
APC 可以去掉 php 動態解析以及編譯的時間,使php腳本可以執行的更快。
APC 擴展最后的發布時間為 2012-09-03。
感興趣可以了解下,官方介紹:http://php.net/manual/zh/book.apc.php
eAccelerator:A PHP opcode cache。
感興趣可以了解下,官方介紹:http://eaccelerator.net/
XCache 是一個又快又穩定的 PHP opcode 緩存器。
感興趣可以了解下,官方介紹:http://xcache.lighttpd.net/
文章主要簡單的介紹了 瀏覽器緩存、文件緩存、NoSQL緩存、WEB服務器緩存、Opcode緩存。
每一種緩存都可以深入研究,從介紹 -> 安裝 -> 使用 -> 總結應用場景。
大家可以思考下,通過上面的介紹,工作中我們使用了哪些緩存?
還可以再使用哪些緩存,可以對我們的項目有幫助?
用過緩存,大家肯定遇到過比較頭痛的問題,比如數據一致性,雪崩,熱點數據緩存,緩存監控等等。
給大家列出幾個問題,純屬拋轉引玉。
舉一些場景:
一、比如實現一個簡單的日志收集功能或發送大量短信、郵件的功能,實現方式是先將數據收集到隊列中,然后有一個定時任務去消耗隊列,處理該做的事情。
直接使用 Redis 的 lpush,rpop 或 rpush,lpop。
//進隊列 $redis->lpush(key, value); //出隊列 $redis->rpop(key);
Memcached 沒有這種數據結構。
二、比如我們要存儲用戶信息,ID、姓名、電話、年齡、身高 ,怎么存儲?
方案一:key => value
key = user_data_用戶ID
value = json_encode(用戶數據)
查詢時,先取出key,然后進行json_decode解析。
方案二:hash
key = user_data_用戶ID
hashKey = 姓名,value = xx
hashKey = 電話,value = xx
hashKey = 年齡,value = xx
hashKey = 身高,value = xx
查詢時,取出key即可。
//新增 $redis->hSet(key, hashKey, value); $redis->hSet(key, hashKey, value); $redis->hSet(key, hashKey, value); //編輯 $redis->hSet(key, hashKey, value); //查詢 $redis->hGetAll(key); //查詢所有屬性 $redis->hGet(key, hashKey); //查詢某個屬性
方案二 優于 方案一。
三、比如社交項目類似于新浪微博,個人中心的關注列表和粉絲列表,雙向關注列表,還有熱門微博,還有消息訂閱 等等。
以上都用 Redis 提供的相關數據結構即可。
四、Memcached 只存儲在內存中,而 Redis 既可以存儲在內存中,也可以持久化到磁盤上。
如果需求中的數據需要持久化,請選擇 Redis 。
個人在工作中沒有用到 Memcached ,通過查詢資料得到 Memcached 內存分配時優于 Redis。
Memcached 默認使用 Slab Allocation 機制管理內存,按照預先規定的大小,將分配的內存分割成特定長度的塊以存儲相應長度的key-value數據記錄,以完全解決內存碎片問題。
新增數據:先新增到數據庫,再新增到緩存。
編輯數據:先刪除緩存數據,再修改數據庫中數據,再新增到緩存。
刪除數據:先刪除緩存數據,再刪除數據庫中數據。
查詢數據:先查詢緩存數據,沒有,再查詢數據庫,再新增到緩存。
強一致性是很難保證的,比如事務一致性,時間點一致性,最終一致性等。
具體問題具體分析吧。
用戶請求緩存中不存在的數據,導致請求直接落在數據庫上。
一、設置有規則的Key值,先驗證Key是否符合規范。
二、接口限流、降級、熔斷,請研究 istio:https://istio.io/
三、布隆過濾器。
四、為不存在的key值,設置空緩存和過期時間,如果存儲層創建了數據,及時更新緩存。
一、互斥鎖,只允許一個請求去重建索引,其他請求等待緩存重建執行完,重新從緩存獲取數據。
二、雙緩存策略,原始緩存和拷貝緩存,當原始緩存失效請求拷貝緩存,原始緩存失效時間設置為短期,拷貝緩存設置為長期。
感謝各位的閱讀,以上就是“PHP中的緩存技術有什么用”的內容了,經過本文的學習后,相信大家對PHP中的緩存技術有什么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。