亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(zhǎng)資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    系統(tǒng)講解PHP緩存技術(shù)

    本篇文章給大家?guī)?lái)了關(guān)于PHP的相關(guān)知識(shí),其中主要介紹了緩存技術(shù)的相關(guān)內(nèi)容,緩存已經(jīng)成了項(xiàng)目中必不可少的一部分,是提高性能最好的方式,下面一起來(lái)看一下,希望對(duì)大家有幫助。

    系統(tǒng)講解PHP緩存技術(shù)

    概述

    系統(tǒng)講解PHP緩存技術(shù)

    緩存已經(jīng)成了項(xiàng)目中是必不可少的一部分,它是提高性能最好的方式,例如減少網(wǎng)絡(luò)I/O、減少磁盤(pán)I/O 等,使項(xiàng)目加載速度變的更快。

    緩存可以是CPU緩存、內(nèi)存緩存、硬盤(pán)緩存,不同的緩存查詢速度也不一樣(CPU緩存 優(yōu)于 內(nèi)存緩存 優(yōu)于 硬盤(pán)緩存)。

    接下來(lái),給大家逐一進(jìn)行介紹。

    瀏覽器緩存

    瀏覽器將請(qǐng)求過(guò)的頁(yè)面存儲(chǔ)在客戶端緩存中,當(dāng)訪問(wèn)者再次訪問(wèn)這個(gè)頁(yè)面時(shí),瀏覽器就可以直接從客戶端緩存中讀取數(shù)據(jù),減少了對(duì)服務(wù)器的訪問(wèn),加快了網(wǎng)頁(yè)的加載速度。

    強(qiáng)緩存

    用戶發(fā)送的請(qǐng)求,直接從客戶端緩存中獲取,不請(qǐng)求服務(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秒
    登錄后復(fù)制

    Cache-Control 還可以設(shè)置以下參數(shù):

    • public:可以被所有的用戶緩存(終端用戶的瀏覽器/CDN服務(wù)器)

    • private:只能被終端用戶的瀏覽器緩存

    • no-cache:不使用本地緩存

    • no-store:禁止緩存數(shù)據(jù)

    協(xié)商緩存

    用戶發(fā)送的請(qǐng)求,發(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');
    登錄后復(fù)制

    用戶操作行為對(duì)緩存的影響

    系統(tǒng)講解PHP緩存技術(shù)

    文件緩存

    數(shù)據(jù)文件緩存

    將更新頻率低,讀取頻率高的數(shù)據(jù),緩存成文件。

    比如,項(xiàng)目中多個(gè)地方用到城市數(shù)據(jù)做三級(jí)聯(lián)動(dòng),我們就可以將城市數(shù)據(jù)緩存成一個(gè)文件(city_data.json),JS 可以直接讀取這個(gè)文件,無(wú)需請(qǐng)求后端服務(wù)器。

    全站靜態(tài)化

    CMS(內(nèi)容管理系統(tǒng)),也許大家都比較熟悉,比如早期的 DEDE、PHPCMS,后臺(tái)都可以設(shè)置靜態(tài)化HTML,用戶在訪問(wèn)網(wǎng)站的時(shí)候讀取的都是靜態(tài)HTML,不用請(qǐng)求后端的數(shù)據(jù)庫(kù),也不用Ajax請(qǐng)求數(shù)據(jù)接口,加快了網(wǎng)站的加載速度。

    靜態(tài)化HTML有以下優(yōu)點(diǎn):

    • 有利于搜索引擎的收錄(SEO)

    • 頁(yè)面打開(kāi)速度快

    • 減少服務(wù)器負(fù)擔(dān)

    CDN緩存

    CDN(Content Delivery Network)內(nèi)容分發(fā)網(wǎng)絡(luò)。

    用戶訪問(wèn)網(wǎng)站時(shí),自動(dòng)選擇就近的CDN節(jié)點(diǎn)內(nèi)容,不需要請(qǐng)求源服務(wù)器,加快了網(wǎng)站的打開(kāi)速度。

    緩存主要包括 HTML、圖片、CSS、JS、XML 等靜態(tài)資源。

    NoSQL緩存

    Memcached 緩存

    Memcached 是高性能的分布式內(nèi)存緩存服務(wù)器。

    一般的使用目的是,通過(guò)緩存數(shù)據(jù)庫(kù)查詢結(jié)果,減少數(shù)據(jù)庫(kù)訪問(wèn)次數(shù),以提高動(dòng)態(tài)Web應(yīng)用的速度、提高可擴(kuò)展性。

    它也能夠用來(lái)存儲(chǔ)各種格式的數(shù)據(jù),包括圖像、視頻、文件等。

    Memcached 僅支持K/V類(lèi)型的數(shù)據(jù),不支持持久化存儲(chǔ)。

    Memcache 與 Memcached 的區(qū)別

    Memcached 從0.2.0開(kāi)始,要求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 的升級(jí)版。

    PHP Memcached 使用手冊(cè):

    http://www.php.net/manual/zh/book.memcached.php

    Memcached 經(jīng)常拿來(lái)與 Redis 做對(duì)比,接下來(lái)介紹下 Redis 緩存。

    Redis緩存

    Redis 是一個(gè)高性能的 K/V 數(shù)據(jù)庫(kù)。

    Redis 很大程度補(bǔ)償了 Memcached K/V存儲(chǔ)的不足,比如 List(鏈表)、Set(集合)、Zset(有序集合)、Hash(散列),既可以將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,也可以將數(shù)據(jù)持久化到磁盤(pán)上,支持主從同步。

    總的來(lái)說(shuō),可以將 Redis 看作是 Memcached 的擴(kuò)展版,更加重量級(jí),功能更強(qiáng)大。

    Redis 在日常工作中使用的居多。

    Redis 學(xué)習(xí)網(wǎng)址:http://www.redis.cn/

    MongoDB緩存

    MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語(yǔ)言編寫(xiě)。

    旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。

    MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的。

    MongoDB 學(xué)習(xí)網(wǎng)址:http://www.mongodb.org.cn

    WEB服務(wù)器緩存

    Apache緩存

    利用 mod_expires ,指定緩存的過(guò)期時(shí)間,可以緩存HTML、圖片、JS、CSS 等。

    打開(kāi) http.conf,開(kāi)啟模塊:

    LoadModule expires_module modules/mod_expires.so
    登錄后復(fù)制

    指定緩存的過(guò)期時(shí)間:

    <IfModule expires_module>     #打開(kāi)緩存     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>
    登錄后復(fù)制

    Nginx緩存

    利用 expire 參數(shù),指定緩存的過(guò)期時(shí)間,可以緩存HTML、圖片、JS、CSS 等。

    打開(kāi) nginx.conf :

    //以圖片為例: location ~.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的location    root html;    expires 1d; #指定緩存時(shí)間 }
    登錄后復(fù)制

    大家也可以了解下:proxycachepath 和 proxy_cache,進(jìn)行緩存的設(shè)置。

    Opcode緩存

    Opcode(Operate Code)操作碼。

    PHP程序運(yùn)行完后,馬上釋放所有內(nèi)存,所有程序中的變量都銷(xiāo)毀,每次請(qǐng)求都要重新翻譯、執(zhí)行,導(dǎo)致速度可能會(huì)偏慢。

    當(dāng)解釋器完成對(duì)腳本代碼的分析后,便將它們生成可以直接運(yùn)行的中間代碼,也稱為操作碼。

    操作碼 的目地是避免重復(fù)編譯,減少CPU和內(nèi)存開(kāi)銷(xiāo)。

    APC緩存

    APC(Alternative PHP Cache)可選 PHP 緩存。

    APC 的目標(biāo)是提供一個(gè)自由、 開(kāi)放,和健全的框架,用于緩存、優(yōu)化 PHP 中間代碼。

    APC 可以去掉 php 動(dòng)態(tài)解析以及編譯的時(shí)間,使php腳本可以執(zhí)行的更快。

    APC 擴(kuò)展最后的發(fā)布時(shí)間為 2012-09-03。

    感興趣可以了解下,官方介紹:http://php.net/manual/zh/book.apc.php

    eAccelerator

    eAccelerator:A PHP opcode cache。

    感興趣可以了解下,官方介紹:http://eaccelerator.net/

    XCache

    XCache 是一個(gè)又快又穩(wěn)定的 PHP opcode 緩存器。

    感興趣可以了解下,官方介紹:http://xcache.lighttpd.net/

    小結(jié)

    文章主要簡(jiǎn)單的介紹了 瀏覽器緩存、文件緩存、NoSQL緩存、WEB服務(wù)器緩存、Opcode緩存。

    每一種緩存都可以深入研究,從介紹 -> 安裝 -> 使用 -> 總結(jié)應(yīng)用場(chǎng)景。

    大家可以思考下,通過(guò)上面的介紹,工作中我們使用了哪些緩存?

    還可以再使用哪些緩存,可以對(duì)我們的項(xiàng)目有幫助?

    關(guān)于緩存的常見(jiàn)問(wèn)題

    用過(guò)緩存,大家肯定遇到過(guò)比較頭痛的問(wèn)題,比如數(shù)據(jù)一致性,雪崩,熱點(diǎn)數(shù)據(jù)緩存,緩存監(jiān)控等等。

    給大家列出幾個(gè)問(wèn)題,純屬拋轉(zhuǎn)引玉。

    當(dāng)項(xiàng)目中使用到緩存,我們是選擇 Redis 還是 Memcached ,為什么?

    舉一些場(chǎng)景:

    一、比如實(shí)現(xiàn)一個(gè)簡(jiǎn)單的日志收集功能或發(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 沒(méi)有這種數(shù)據(jù)結(jié)構(gòu)。
    登錄后復(fù)制

    二、比如我們要存儲(chǔ)用戶信息,ID、姓名、電話、年齡、身高 ,怎么存儲(chǔ)?

    方案一:key => value

    key = userdata用戶ID

    value = json_encode(用戶數(shù)據(jù))

    查詢時(shí),先取出key,然后進(jìn)行json_decode解析。

    方案二:hash

    key = userdata用戶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è)屬性
    登錄后復(fù)制

    方案二 優(yōu)于 方案一。

    三、比如社交項(xiàng)目類(lèi)似于新浪微博,個(gè)人中心的關(guān)注列表和粉絲列表,雙向關(guān)注列表,還有熱門(mén)微博,還有消息訂閱 等等。

    以上都用 Redis 提供的相關(guān)數(shù)據(jù)結(jié)構(gòu)即可。

    四、Memcached 只存儲(chǔ)在內(nèi)存中,而 Redis 既可以存儲(chǔ)在內(nèi)存中,也可以持久化到磁盤(pán)上。

    如果需求中的數(shù)據(jù)需要持久化,請(qǐng)選擇 Redis 。

    個(gè)人在工作中沒(méi)有用到 Memcached ,通過(guò)查詢資料得到 Memcached 內(nèi)存分配時(shí)優(yōu)于 Redis。

    Memcached 默認(rèn)使用 Slab Allocation 機(jī)制管理內(nèi)存,按照預(yù)先規(guī)定的大小,將分配的內(nèi)存分割成特定長(zhǎng)度的塊以存儲(chǔ)相應(yīng)長(zhǎng)度的key-value數(shù)據(jù)記錄,以完全解決內(nèi)存碎片問(wèn)題。

    如何保證,緩存與數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性?

    新增數(shù)據(jù):先新增到數(shù)據(jù)庫(kù),再新增到緩存。

    編輯數(shù)據(jù):先刪除緩存數(shù)據(jù),再修改數(shù)據(jù)庫(kù)中數(shù)據(jù),再新增到緩存。

    刪除數(shù)據(jù):先刪除緩存數(shù)據(jù),再刪除數(shù)據(jù)庫(kù)中數(shù)據(jù)。

    查詢數(shù)據(jù):先查詢緩存數(shù)據(jù),沒(méi)有,再查詢數(shù)據(jù)庫(kù),再新增到緩存。

    強(qiáng)一致性是很難保證的,比如事務(wù)一致性,時(shí)間點(diǎn)一致性,最終一致性等。

    具體問(wèn)題具體分析吧。

    緩存穿透怎么辦?

    用戶請(qǐng)求緩存中不存在的數(shù)據(jù),導(dǎo)致請(qǐng)求直接落在數(shù)據(jù)庫(kù)上。

    一、設(shè)置有規(guī)則的Key值,先驗(yàn)證Key是否符合規(guī)范。

    二、接口限流、降級(jí)、熔斷,請(qǐng)研究 istio:https://istio.io/

    三、布隆過(guò)濾器。

    四、為不存在的key值,設(shè)置空緩存和過(guò)期時(shí)間,如果存儲(chǔ)層創(chuàng)建了數(shù)據(jù),及時(shí)更新緩存。

    雪崩怎么辦?

    一、互斥鎖,只允許一個(gè)請(qǐng)求去重建索引,其他請(qǐng)求等待緩存重建執(zhí)行完,重新從緩存獲取數(shù)據(jù)。

    系統(tǒng)講解PHP緩存技術(shù)

    二、雙緩存策略,原始緩存和拷貝緩存,當(dāng)原始緩存失效請(qǐng)求拷貝緩存,原始緩存失效時(shí)間設(shè)置為短期,拷貝緩存設(shè)置為長(zhǎng)期。

    推薦學(xué)習(xí):《PHP視頻教程》

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)