摘要:根據(jù)和判斷是否命中強(qiáng)緩存。如何保證,緩存與數(shù)據(jù)庫的數(shù)據(jù)一致性新增數(shù)據(jù)先新增到數(shù)據(jù)庫,再新增到緩存。推薦閱讀系統(tǒng)的講解單點(diǎn)登錄系統(tǒng)的講解安全防御系統(tǒng)的講解接口簽名驗(yàn)證系統(tǒng)的講解浮點(diǎn)數(shù)高精度運(yùn)算本文歡迎轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)請注明作者和出處,謝謝
概述
緩存已經(jīng)成了項(xiàng)目中是必不可少的一部分,它是提高性能最好的方式,例如減少網(wǎng)絡(luò)I/O、減少磁盤I/O 等,使項(xiàng)目加載速度變的更快。
緩存可以是CPU緩存、內(nèi)存緩存、硬盤緩存,不同的緩存查詢速度也不一樣(CPU緩存 > 內(nèi)存緩存 > 硬盤緩存)。
接下來,給大家逐一進(jìn)行介紹。
瀏覽器緩存瀏覽器將請求過的頁面存儲在客戶端緩存中,當(dāng)訪問者再次訪問這個(gè)頁面時(shí),瀏覽器就可以直接從客戶端緩存中讀取數(shù)據(jù),減少了對服務(wù)器的訪問,加快了網(wǎng)頁的加載速度。
強(qiáng)緩存用戶發(fā)送的請求,直接從客戶端緩存中獲取,不請求服務(wù)器。
根據(jù) Expires 和 Cache-Control 判斷是否命中強(qiáng)緩存。
代碼如下:
header("Expires: ". gmdate("D, d M Y H:i:s", time() + 3600). " GMT"); header("Cache-Control: max-age=3600"); //有效期3600秒
Cache-Control 還可以設(shè)置以下參數(shù):
public:可以被所有的用戶緩存(終端用戶的瀏覽器/CDN服務(wù)器)
private:只能被終端用戶的瀏覽器緩存
no-cache:不使用本地緩存
no-store:禁止緩存數(shù)據(jù)
協(xié)商緩存用戶發(fā)送的請求,發(fā)送給服務(wù)器,由服務(wù)器判定是否使用客戶端緩存。
代碼如下:
$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");用戶操作行為對緩存的影響
操作行為 | Expires | Last-Modified |
---|---|---|
地址欄回車 | 有效 | 有效 |
頁面跳轉(zhuǎn) | 有效 | 有效 |
新開窗口 | 有效 | 有效 |
前進(jìn)/后退 | 有效 | 有效 |
F5刷新 | 無效 | 有效 |
Ctrl+F5刷新 | 無效 | 無效 |
將更新頻率低,讀取頻率高的數(shù)據(jù),緩存成文件。
比如,項(xiàng)目中多個(gè)地方用到城市數(shù)據(jù)做三級聯(lián)動,我們就可以將城市數(shù)據(jù)緩存成一個(gè)文件(city_data.json),JS 可以直接讀取這個(gè)文件,無需請求后端服務(wù)器。
全站靜態(tài)化CMS(內(nèi)容管理系統(tǒng)),也許大家都比較熟悉,比如早期的 DEDE、PHPCMS,后臺都可以設(shè)置靜態(tài)化HTML,用戶在訪問網(wǎng)站的時(shí)候讀取的都是靜態(tài)HTML,不用請求后端的數(shù)據(jù)庫,也不用Ajax請求數(shù)據(jù)接口,加快了網(wǎng)站的加載速度。
靜態(tài)化HTML有以下優(yōu)點(diǎn):
有利于搜索引擎的收錄(SEO)
頁面打開速度快
減少服務(wù)器負(fù)擔(dān)
CDN緩存CDN(Content Delivery Network)內(nèi)容分發(fā)網(wǎng)絡(luò)。
用戶訪問網(wǎng)站時(shí),自動選擇就近的CDN節(jié)點(diǎn)內(nèi)容,不需要請求源服務(wù)器,加快了網(wǎng)站的打開速度。
緩存主要包括 HTML、圖片、CSS、JS、XML 等靜態(tài)資源。
NoSQL緩存 Memcached 緩存Memcached 是高性能的分布式內(nèi)存緩存服務(wù)器。
一般的使用目的是,通過緩存數(shù)據(jù)庫查詢結(jié)果,減少數(shù)據(jù)庫訪問次數(shù),以提高動態(tài)Web應(yīng)用的速度、提高可擴(kuò)展性。
它也能夠用來存儲各種格式的數(shù)據(jù),包括圖像、視頻、文件等。
Memcached 僅支持K/V類型的數(shù)據(jù),不支持持久化存儲。
Memcache 與 Memcached 的區(qū)別
Memcached 從0.2.0開始,要求PHP版本>=5.2.0,Memcache 要求PHP版本>=4.3。
Memcached 最后發(fā)布時(shí)間為2018-12-24,Memcache 最后發(fā)布時(shí)間2013-04-07。
Memcached 基于libmemcached,Memcache 基于PECL擴(kuò)展。
可以將 Memcached 看作是 Memcache 的升級版。
PHP Memcached 使用手冊:
http://www.php.net/manual/zh/...
Memcached 經(jīng)常拿來與 Redis 做對比,接下來介紹下 Redis 緩存。
Redis緩存Redis 是一個(gè)高性能的 K/V 數(shù)據(jù)庫。
Redis 很大程度補(bǔ)償了 Memcached K/V存儲的不足,比如 List(鏈表)、Set(集合)、Zset(有序集合)、Hash(散列),既可以將數(shù)據(jù)存儲在內(nèi)存中,也可以將數(shù)據(jù)持久化到磁盤上,支持主從同步。
總的來說,可以將 Redis 看作是 Memcached 的擴(kuò)展版,更加重量級,功能更強(qiáng)大。
Redis 在日常工作中使用的居多。
Redis 學(xué)習(xí)網(wǎng)址:http://www.redis.cn/
MongoDB緩存MongoDB 是一個(gè)基于分布式文件存儲的數(shù)據(jù)庫。由 C++ 語言編寫。
旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案。
MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。
MongoDB 學(xué)習(xí)網(wǎng)址:http://www.mongodb.org.cn
WEB服務(wù)器緩存 Apache緩存利用 mod_expires ,指定緩存的過期時(shí)間,可以緩存HTML、圖片、JS、CSS 等。
打開 http.conf,開啟模塊:
LoadModule expires_module modules/mod_expires.so
指定緩存的過期時(shí)間:
Nginx緩存#打開緩存 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
利用 expire 參數(shù),指定緩存的過期時(shí)間,可以緩存HTML、圖片、JS、CSS 等。
打開 nginx.conf :
//以圖片為例: location ~.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的location root html; expires 1d; #指定緩存時(shí)間 }
大家也可以了解下:proxy_cache_path 和 proxy_cache,進(jìn)行緩存的設(shè)置。
Opcode緩存Opcode(Operate Code)操作碼。
PHP程序運(yùn)行完后,馬上釋放所有內(nèi)存,所有程序中的變量都銷毀,每次請求都要重新翻譯、執(zhí)行,導(dǎo)致速度可能會偏慢。
當(dāng)解釋器完成對腳本代碼的分析后,便將它們生成可以直接運(yùn)行的中間代碼,也稱為操作碼。
操作碼 的目地是避免重復(fù)編譯,減少CPU和內(nèi)存開銷。
APC緩存APC(Alternative PHP Cache)可選 PHP 緩存。
APC 的目標(biāo)是提供一個(gè)自由、 開放,和健全的框架,用于緩存、優(yōu)化 PHP 中間代碼。
APC 可以去掉 php 動態(tài)解析以及編譯的時(shí)間,使php腳本可以執(zhí)行的更快。
APC 擴(kuò)展最后的發(fā)布時(shí)間為 2012-09-03。
感興趣可以了解下,官方介紹:http://php.net/manual/zh/book...
eAcceleratoreAccelerator:A PHP opcode cache。
感興趣可以了解下,官方介紹:http://eaccelerator.net/
XCacheXCache 是一個(gè)又快又穩(wěn)定的 PHP opcode 緩存器。
感興趣可以了解下,官方介紹:http://xcache.lighttpd.net/
小結(jié)文章主要簡單的介紹了 瀏覽器緩存、文件緩存、NoSQL緩存、WEB服務(wù)器緩存、Opcode緩存。
每一種緩存都可以深入研究,從介紹 -> 安裝 -> 使用 -> 總結(jié)應(yīng)用場景。
大家可以思考下,通過上面的介紹,工作中我們使用了哪些緩存?
還可以再使用哪些緩存,可以對我們的項(xiàng)目有幫助?
關(guān)于緩存的常見問題用過緩存,大家肯定遇到過比較頭痛的問題,比如數(shù)據(jù)一致性,雪崩,熱點(diǎn)數(shù)據(jù)緩存,緩存監(jiān)控等等。
給大家列出幾個(gè)問題,純屬拋轉(zhuǎn)引玉。
當(dāng)項(xiàng)目中使用到緩存,我們是選擇 Redis 還是 Memcached ,為什么?舉一些場景:
一、比如實(shí)現(xiàn)一個(gè)簡單的日志收集功能或發(fā)送大量短信、郵件的功能,實(shí)現(xiàn)方式是先將數(shù)據(jù)收集到隊(duì)列中,然后有一個(gè)定時(shí)任務(wù)去消耗隊(duì)列,處理該做的事情。
直接使用 Redis 的 lpush,rpop 或 rpush,lpop。
//進(jìn)隊(duì)列 $redis->lpush(key, value); //出隊(duì)列 $redis->rpop(key);
Memcached 沒有這種數(shù)據(jù)結(jié)構(gòu)。
二、比如我們要存儲用戶信息,ID、姓名、電話、年齡、身高 ,怎么存儲?
方案一:key => value
key = user_data_用戶ID
value = json_encode(用戶數(shù)據(jù))
查詢時(shí),先取出key,然后進(jìn)行json_decode解析。
方案二:hash
key = user_data_用戶ID
hashKey = 姓名,value = xx
hashKey = 電話,value = xx
hashKey = 年齡,value = xx
hashKey = 身高,value = xx
查詢時(shí),取出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); //查詢某個(gè)屬性
方案二 優(yōu)于 方案一。
三、比如社交項(xiàng)目類似于新浪微博,個(gè)人中心的關(guān)注列表和粉絲列表,雙向關(guān)注列表,還有熱門微博,還有消息訂閱 等等。
以上都用 Redis 提供的相關(guān)數(shù)據(jù)結(jié)構(gòu)即可。
四、Memcached 只存儲在內(nèi)存中,而 Redis 既可以存儲在內(nèi)存中,也可以持久化到磁盤上。
如果需求中的數(shù)據(jù)需要持久化,請選擇 Redis 。
個(gè)人在工作中沒有用到 Memcached ,通過查詢資料得到 Memcached 內(nèi)存分配時(shí)優(yōu)于 Redis。
Memcached 默認(rèn)使用 Slab Allocation 機(jī)制管理內(nèi)存,按照預(yù)先規(guī)定的大小,將分配的內(nèi)存分割成特定長度的塊以存儲相應(yīng)長度的key-value數(shù)據(jù)記錄,以完全解決內(nèi)存碎片問題。
如何保證,緩存與數(shù)據(jù)庫的數(shù)據(jù)一致性?新增數(shù)據(jù):先新增到數(shù)據(jù)庫,再新增到緩存。
編輯數(shù)據(jù):先刪除緩存數(shù)據(jù),再修改數(shù)據(jù)庫中數(shù)據(jù),再新增到緩存。
刪除數(shù)據(jù):先刪除緩存數(shù)據(jù),再刪除數(shù)據(jù)庫中數(shù)據(jù)。
查詢數(shù)據(jù):先查詢緩存數(shù)據(jù),沒有,再查詢數(shù)據(jù)庫,再新增到緩存。
強(qiáng)一致性是很難保證的,比如事務(wù)一致性,時(shí)間點(diǎn)一致性,最終一致性等。
具體問題具體分析吧。
緩存穿透怎么辦?用戶請求緩存中不存在的數(shù)據(jù),導(dǎo)致請求直接落在數(shù)據(jù)庫上。
一、設(shè)置有規(guī)則的Key值,先驗(yàn)證Key是否符合規(guī)范。
二、接口限流、降級、熔斷,請研究 istio:https://istio.io/
三、布隆過濾器。
四、為不存在的key值,設(shè)置空緩存和過期時(shí)間,如果存儲層創(chuàng)建了數(shù)據(jù),及時(shí)更新緩存。
雪崩怎么辦?一、互斥鎖,只允許一個(gè)請求去重建索引,其他請求等待緩存重建執(zhí)行完,重新從緩存獲取數(shù)據(jù)。
二、雙緩存策略,原始緩存和拷貝緩存,當(dāng)原始緩存失效請求拷貝緩存,原始緩存失效時(shí)間設(shè)置為短期,拷貝緩存設(shè)置為長期。
已上,純屬拋轉(zhuǎn)引玉,結(jié)合自己的情況,具體問題,具體分析吧。
推薦閱讀系統(tǒng)的講解 - SSO 單點(diǎn)登錄
系統(tǒng)的講解 - PHP WEB 安全防御
系統(tǒng)的講解 - PHP 接口簽名驗(yàn)證
系統(tǒng)的講解 - PHP 浮點(diǎn)數(shù)高精度運(yùn)算
本文歡迎轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)請注明作者和出處,謝謝!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31429.html
摘要:根據(jù)和判斷是否命中強(qiáng)緩存。如何保證,緩存與數(shù)據(jù)庫的數(shù)據(jù)一致性新增數(shù)據(jù)先新增到數(shù)據(jù)庫,再新增到緩存。推薦閱讀系統(tǒng)的講解單點(diǎn)登錄系統(tǒng)的講解安全防御系統(tǒng)的講解接口簽名驗(yàn)證系統(tǒng)的講解浮點(diǎn)數(shù)高精度運(yùn)算本文歡迎轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)請注明作者和出處,謝謝 概述 緩存已經(jīng)成了項(xiàng)目中是必不可少的一部分,它是提高性能最好的方式,例如減少網(wǎng)絡(luò)I/O、減少磁盤I/O 等,使項(xiàng)目加載速度變的更快。 緩存可以是CPU緩存、...
摘要:,開發(fā)一個(gè)微服務(wù),實(shí)現(xiàn)數(shù)據(jù)調(diào)取層。微服務(wù)并不是越微越好設(shè)計(jì)原則是給自己提供便利,而不是自己給自己挖坑。需要考慮對微服務(wù)進(jìn)行實(shí)時(shí)監(jiān)控,考慮是否需要擴(kuò)容,性能調(diào)優(yōu)等等。微服務(wù)的調(diào)用方式接口或。 什么是微服務(wù)? 微服務(wù)是一種架構(gòu)風(fēng)格。 它可以通過強(qiáng)壯的模塊邊界和獨(dú)立部署,來幫助你快速的擴(kuò)展開發(fā)團(tuán)隊(duì)。 其實(shí)微服務(wù)本身不是什么新技術(shù),只是隨著業(yè)務(wù)的不斷發(fā)展,對業(yè)務(wù)不斷分層,不斷拆分。 它被業(yè)界公...
摘要:動態(tài)生成隨機(jī)下單頁面的為了避免用戶直接訪問下單需要將動態(tài)化,用隨機(jī)數(shù)作為參數(shù),只能秒殺開始的時(shí)候才生成。該文件不被緩存的做法隨機(jī)數(shù)。淺談秒殺系統(tǒng)架構(gòu)設(shè)計(jì)如何只允許,第一個(gè)提交的單進(jìn)入訂單系統(tǒng)。未超過秒殺商品總數(shù),提交到子訂單系統(tǒng)。 秒殺是電子商務(wù)網(wǎng)站常見的一種營銷手段。 原則 不要整個(gè)系統(tǒng)宕機(jī)。 即使系統(tǒng)故障,也不要將錯(cuò)誤數(shù)據(jù)展示出來。 盡量保持公平公正。 實(shí)現(xiàn)效果 秒殺開始前,...
摘要:服務(wù)器市場份額。子進(jìn)程負(fù)責(zé)創(chuàng)建由指令設(shè)置的服務(wù)器線程,同時(shí)還負(fù)責(zé)監(jiān)聽接收到的請求,并將請求分發(fā)給處理線程。在版本引入了模塊,這個(gè)模塊基于模塊創(chuàng)建的,并加入了獨(dú)立的監(jiān)聽線程來管理請求處理完成后的休眠的連接?;谑录姆?wù)器完勝。 譯文首發(fā)于 Apache 與 Nginx 性能對比:Web 服務(wù)器優(yōu)化技術(shù),轉(zhuǎn)載請注明出處。 多年前 Apache 基金會 Web 服務(wù)器 簡稱「Apache」...
閱讀 1599·2021-11-16 11:44
閱讀 7491·2021-09-22 15:00
閱讀 4524·2021-09-02 10:20
閱讀 1955·2021-08-27 16:20
閱讀 2402·2019-08-26 14:00
閱讀 2916·2019-08-26 11:44
閱讀 1647·2019-08-23 18:33
閱讀 1877·2019-08-22 17:28