[建議收藏]緩存雪崩的處理辦法

1. Mysql優(yōu)化器的參考標(biāo)準(zhǔn)
mysql的索引是由mysql的server層的優(yōu)化器決定的

2.Memcache和Redis單個(gè)key大小限制
Memcache單個(gè)key(變量)存放的數(shù)據(jù)有1M的限制

Redis單個(gè)key(變量)存放的數(shù)據(jù)有1G的限制

3.緩存雪崩的處理辦法
事前:進(jìn)行系統(tǒng)壓力測(cè)試,在負(fù)載均衡層做限流處理,過(guò)載丟棄請(qǐng)求或者進(jìn)入隊(duì)列

事前:redis 高可用,主從+哨兵,redis cluster,避免全盤崩潰。

事中:本地緩存 + 限流降級(jí),避免 MySQL 被打死。

事后:redis 持久化,一旦重啟,自動(dòng)從磁盤上加載數(shù)據(jù),快速恢復(fù)緩存數(shù)據(jù)。

緩存雪崩、擊穿、穿透,該如何避免?

Redis中緩存雪崩、緩存穿透等問(wèn)題的解決方案

緩存穿透、緩存并發(fā)、緩存雪崩、緩存抖動(dòng)、熱點(diǎn)緩存、緩存雙寫(xiě)一致性等問(wèn)題

4.分布式id算法?

雪花算法是 twitter 開(kāi)源的分布式 id 生成算法,采用 Scala 語(yǔ)言實(shí)現(xiàn),是把一個(gè) 64 位的 long 型的 id,1 個(gè) bit 是不用的,用其中的 41 bit 作為毫秒數(shù),用 10 bit 作為工作機(jī)器 id,12 bit 作為序列號(hào)。雪花算法SnowFlake生成唯一ID



1 bit:不用,為啥呢?因?yàn)槎M(jìn)制里第一個(gè) bit 為如果是 1,那么都是負(fù)數(shù),但是我們生成的 id 都是正數(shù),所以第一個(gè) bit 統(tǒng)一都是 0。

41 bit:表示的是時(shí)間戳,單位是毫秒。41 bit 可以表示的數(shù)字多達(dá) 2^41 - 1,也就是可以標(biāo)識(shí) 2^41 - 1 個(gè)毫秒值,換算成年就是表示69年的時(shí)間。

10 bit:記錄工作機(jī)器 id,代表的是這個(gè)服務(wù)最多可以部署在 2^10臺(tái)機(jī)器上哪,也就是1024臺(tái)機(jī)器。但是 10 bit 里 5 個(gè) bit 代表機(jī)房 id,5 個(gè) bit 代表機(jī)器 id。意思就是最多代表 2^5個(gè)機(jī)房(32個(gè)機(jī)房),每個(gè)機(jī)房里可以代表 2^5 個(gè)機(jī)器(32臺(tái)機(jī)器)。

12 bit:這個(gè)是用來(lái)記錄同一個(gè)毫秒內(nèi)產(chǎn)生的不同 id,12 bit 可以代表的最大正整數(shù)是 2^12 - 1 = 4096,也就是說(shuō)可以用這個(gè) 12 bit 代表的數(shù)字來(lái)區(qū)分同一個(gè)毫秒內(nèi)的 4096 個(gè)不同的 id。

5.Redis內(nèi)存淘汰機(jī)制
noeviction: 當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),新寫(xiě)入操作會(huì)報(bào)錯(cuò),這個(gè)一般沒(méi)人用吧,實(shí)在是太惡心了。

allkeys-lru:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在鍵空間中,移除最近最少使用的 key(這個(gè)是最常用的)。

allkeys-random:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在鍵空間中,隨機(jī)移除某個(gè) key,這個(gè)一般沒(méi)人用吧,為啥要隨機(jī),肯定是把最近最少使用的 key 給干掉啊。

volatile-lru:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在設(shè)置了過(guò)期時(shí)間的鍵空間中,移除最近最少使用的 key(這個(gè)一般不太合適)。

volatile-random:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在設(shè)置了過(guò)期時(shí)間的鍵空間中,隨機(jī)移除某個(gè) key。

volatile-ttl:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在設(shè)置了過(guò)期時(shí)間的鍵空間中,有更早過(guò)期時(shí)間的 key 優(yōu)先移除。

Redis過(guò)期--淘汰機(jī)制的解析和內(nèi)存占用過(guò)高的解決方案

7. 常見(jiàn)MQ選型
ActiveMQ 基于 Java 開(kāi)發(fā)的, RabbitMQ 是基于 erlang 開(kāi)發(fā)的。

特性ActiveMQRabbitMQRocketMQKafka
單機(jī)吞吐量萬(wàn)級(jí),比 RocketMQ、Kafka 低一個(gè)數(shù)量級(jí)同 ActiveMQ10 萬(wàn)級(jí),支撐高吞吐10 萬(wàn)級(jí),高吞吐,一般配合大數(shù)據(jù)類的系統(tǒng)來(lái)進(jìn)行實(shí)時(shí)數(shù)據(jù)計(jì)算、日志采集等場(chǎng)景
topic 數(shù)量對(duì)吞吐量的影響

topic 可以達(dá)到幾百/幾千的級(jí)別,吞吐量會(huì)有較小幅度的下降,這是 RocketMQ 的一大優(yōu)勢(shì),在同等機(jī)器下,可以支撐大量的 topictopic 從幾十到幾百個(gè)時(shí)候,吞吐量會(huì)大幅度下降,在同等機(jī)器下,Kafka 盡量保證 topic 數(shù)量不要過(guò)多,如果要支撐大規(guī)模的 topic,需要增加更多的機(jī)器資源
時(shí)效性ms 級(jí)微秒級(jí),這是 RabbitMQ 的一大特點(diǎn),延遲最低ms 級(jí)延遲在 ms 級(jí)以內(nèi)
可用性高,基于主從架構(gòu)實(shí)現(xiàn)高可用同 ActiveMQ非常高,分布式架構(gòu)非常高,分布式,一個(gè)數(shù)據(jù)多個(gè)副本,少數(shù)機(jī)器宕機(jī),不會(huì)丟失數(shù)據(jù),不會(huì)導(dǎo)致不可用
消息可靠性有較低的概率丟失數(shù)據(jù)基本不丟經(jīng)過(guò)參數(shù)優(yōu)化配置,可以做到 0 丟失同 RocketMQ
功能支持MQ 領(lǐng)域的功能極其完備基于 erlang 開(kāi)發(fā),并發(fā)能力很強(qiáng),性能極好,延時(shí)很低MQ 功能較為完善,還是分布式的,擴(kuò)展性好功能較為簡(jiǎn)單,主要支持簡(jiǎn)單的 MQ 功能,在大數(shù)據(jù)領(lǐng)域的實(shí)時(shí)計(jì)算以及日志采集被大規(guī)模使用

8. 樹(shù)數(shù)據(jù)結(jié)構(gòu)分類
有序樹(shù)的定義:若將樹(shù)中每個(gè)結(jié)點(diǎn)的各子樹(shù)看成是從左到右有次序的(即不能互換),則稱該樹(shù)為有序樹(shù)(Ordered Tree)

無(wú)序樹(shù)的定義:若將樹(shù)中每個(gè)結(jié)點(diǎn)的各子樹(shù)從左到右是沒(méi)有次序的(即可以互換),則稱該樹(shù)為無(wú)序樹(shù)

9. 數(shù)據(jù),數(shù)據(jù)元素,數(shù)據(jù)項(xiàng),數(shù)據(jù)對(duì)象的詳細(xì)理解
1.數(shù)據(jù)(Data):數(shù)據(jù)就是用戶輸入到計(jì)算機(jī)被計(jì)算機(jī)程序處理的一些符號(hào),比如圖片還有聲音等....

2.數(shù)據(jù)元素(Data Element):是數(shù)據(jù)的基本單位,數(shù)據(jù)元素用于完整的描述一個(gè)對(duì)象,比如一個(gè)學(xué)生表,學(xué)生表也是由 數(shù)據(jù)元素和數(shù)據(jù)項(xiàng)組成的.

3.數(shù)據(jù)項(xiàng)(Data ltem):是組成數(shù)據(jù)元素的!例如 學(xué)生表 的中的 "學(xué)號(hào) 姓名 性別"等數(shù)據(jù)項(xiàng).

4.數(shù)據(jù)對(duì)象:是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個(gè)子集,例如:整數(shù)數(shù)據(jù)對(duì)象的集合 N={1,2,3,4,5,6,7,...};

10. 301和302跳轉(zhuǎn)的區(qū)別?PHP如何顯示301,302,403,404跳轉(zhuǎn)?
301 Moved Permanently 永久重定向
302 Moved Temporarily 臨時(shí)重定向(POST改為GET)
307 Temporary Redirect 臨時(shí)重定向(保持POST)

301一般用作永久跳轉(zhuǎn),除非用戶清瀏覽器緩存,否則不會(huì)修改跳轉(zhuǎn)地址;
302和307可以在后端修改跳轉(zhuǎn)地址,不同在于302會(huì)把POST轉(zhuǎn)為GET請(qǐng)求,307可以保持POST






//301跳轉(zhuǎn)
header("HTTP/1.1 301 Moved Permanently");
Header("Location: http://www.baidu.com");
//302
Header("Location: http://www.baidu.com");
//403
header('HTTP/1.0 403 Forbidden');
//404
header('HTTP/1.1 404 Not Found');
header("status: 404 Not Found");
11. 復(fù)合索引的使用條件?
復(fù)合索引只有在前面的字段為精確查詢時(shí),才會(huì)用上后面的復(fù)合索引,一旦出現(xiàn)不精確查詢,則不會(huì)使用復(fù)合索引。

select * from test where a=10 and b>10 order by c
使用了a_b索引,order by c不使用索引

12. sql語(yǔ)句從執(zhí)行到返回結(jié)果中間花費(fèi)時(shí)間最長(zhǎng)的環(huán)節(jié)是哪步?
查詢結(jié)果的數(shù)據(jù)量越大返回時(shí)間越長(zhǎng),遠(yuǎn)遠(yuǎn)超過(guò)其他環(huán)節(jié)的占用時(shí)間。

13.PHP模式修飾符
模式修飾符 含義
i:正則表達(dá)式匹配時(shí)不區(qū)分大小寫(xiě)
m:不加m時(shí),被匹配的字符串被當(dāng)成整體一行處理,^匹配開(kāi)始位置,$匹配結(jié)束位置或匹配最后一個(gè)換行符;
加m時(shí),被匹配的字符串通過(guò)換行符當(dāng)成多行處理,每行都與^和$包圍的正則進(jìn)行匹配
s:正則表達(dá)式中的點(diǎn)號(hào)(.)將表示任何字符,包括換行符
x:正則表達(dá)式中除轉(zhuǎn)義外的空字符,其它空字符將被忽略
e:只用在正則替換的函數(shù)比如preg_replace()中,表示用一個(gè)函數(shù)替換內(nèi)容。該修飾符在高版本php中已不再使用,已被preg_replace_callback()所替代
A:匹配時(shí)會(huì)從字符串開(kāi)始位置進(jìn)行匹配
D:不加D時(shí),$匹配結(jié)束位置或匹配最后一個(gè)換行符;
     加D時(shí),僅匹配結(jié)束位置;   如果設(shè)定了修飾符m則會(huì)忽略修飾符D
U:不加U時(shí),是貪婪匹配,會(huì)最大量的找匹配部分;
    加U時(shí),是非貪婪匹配,只找最小的匹配部分
14. HTTP常用方法及作用
一臺(tái)服務(wù)器要與HTTP1.1兼容,只要為資源實(shí)現(xiàn)GET和HEAD方法即可

GET是最常用的方法,通常用于請(qǐng)求服務(wù)器發(fā)送某個(gè)資源。

HEAD與GET類似,但服務(wù)器在響應(yīng)中值返回首部,不返回實(shí)體的主體部分

PUT讓服務(wù)器用請(qǐng)求的主體部分來(lái)創(chuàng)建一個(gè)由所請(qǐng)求的URL命名的新文檔,或者,如果那個(gè)URL已經(jīng)存在的話,就用干這個(gè)主體替代它

POST起初是用來(lái)向服務(wù)器輸入數(shù)據(jù)的。實(shí)際上,通常會(huì)用它來(lái)支持HTML的表單。表單中填好的數(shù)據(jù)通常會(huì)被送給服務(wù)器,然后由服務(wù)器將其發(fā)送到要去的地方。

TRACE會(huì)在目的服務(wù)器端發(fā)起一個(gè)環(huán)回診斷,最后一站的服務(wù)器會(huì)彈回一個(gè)TRACE響應(yīng)并在響應(yīng)主體中攜帶它收到的原始請(qǐng)求報(bào)文。TRACE方法主要用于診斷,用于驗(yàn)證請(qǐng)求是否如愿穿過(guò)了請(qǐng)求/響應(yīng)鏈。

OPTIONS方法請(qǐng)求web服務(wù)器告知其支持的各種功能??梢圆樵兎?wù)器支持哪些方法或者對(duì)某些特殊資源支持哪些方法。

DELETE請(qǐng)求服務(wù)器刪除請(qǐng)求URL指定的資源

15. 常見(jiàn)header請(qǐng)求頭

--示例
vary告訴代理服務(wù)器/緩存/CDN,如何判斷請(qǐng)求是否一樣Vary: Accept-Encoding,User-Agent
Rang請(qǐng)求一段內(nèi)存,如0到2000字節(jié),可用于斷點(diǎn)下載Rang bytes=0-2000
Referer來(lái)源地址
Upgrade切換協(xié)議版本Upgrade: HTTP/2.0, SHTTP/1.3
User-Agent用戶信息User-Agent: Mozilla/5.0 (Linux; X11)
X-Requested-Withnull 傳統(tǒng)請(qǐng)求;XMLHttpRequest Ajax請(qǐng)求

16.外部排序使用的數(shù)據(jù)結(jié)構(gòu)
外部排序指的是大文件的排序,即待排序的記錄存儲(chǔ)在外存儲(chǔ)器上,待排序的文件無(wú)法一次裝入內(nèi)存,需要在內(nèi)存和外部存儲(chǔ)器之間進(jìn)行多次數(shù)據(jù)交換,以達(dá)到排序整個(gè)文件的目的。

外部排序最常用的算法是多路歸并排序,即將原文件分解成多個(gè)能夠一次性裝人內(nèi)存的部分,分別把每一部分調(diào)入內(nèi)存完成排序。然后,對(duì)已經(jīng)排序的子文件進(jìn)行歸并排序。大規(guī)模數(shù)據(jù)存儲(chǔ)中,實(shí)現(xiàn)索引查詢這樣一個(gè)實(shí)際背景下,樹(shù)節(jié)點(diǎn)存儲(chǔ)的元素?cái)?shù)量是有限的(如果元素?cái)?shù)量非常多的話,查找就退化成節(jié)點(diǎn)內(nèi)部的線性查找了),這樣導(dǎo)致二叉查找樹(shù)結(jié)構(gòu)由于樹(shù)的深度過(guò)大而造成磁盤I/O讀寫(xiě)過(guò)于頻繁,進(jìn)而導(dǎo)致查詢效率低下,那么如何減少樹(shù)的深度(當(dāng)然是不能減少查詢的數(shù)據(jù)量),一個(gè)基本的想法就是:采用多叉樹(shù)結(jié)構(gòu)(由于樹(shù)節(jié)點(diǎn)元素?cái)?shù)量是有限的,自然該節(jié)點(diǎn)的子樹(shù)數(shù)量也就是有限的)。這樣我們就提出了一個(gè)新的查找樹(shù)結(jié)構(gòu)——多路查找樹(shù)。根據(jù)平衡二叉樹(shù)的啟發(fā),自然就想到平衡多路查找樹(shù)結(jié)構(gòu),也就是B-tree(B樹(shù)結(jié)構(gòu))

17. PHP三大模塊
內(nèi)核、zend引擎、以及擴(kuò)展層

參考:[PHP內(nèi)核]

18.opcode是什么?
opcode 是Php腳本編譯后的中間碼,Zend引擎將源文件轉(zhuǎn)換成opcode代碼,然后在虛擬機(jī)上運(yùn)行
緩存opcode 后 可以加快網(wǎng)站的運(yùn)行速度
用apc 或者xcache 緩存可以緩存php的opcode
19.字母如何轉(zhuǎn)二進(jìn)制?
A的ASCII碼是65,16進(jìn)制對(duì)應(yīng)41,二進(jìn)制對(duì)應(yīng)01000001

a的ASCII碼是97,16進(jìn)制對(duì)應(yīng)61,二進(jìn)制對(duì)應(yīng)01100001

20. Apache和Nginx的區(qū)別?
Nginx是輕量級(jí),比apache占用更少的內(nèi)存以及資源,全面了解Nginx主要應(yīng)用場(chǎng)景?

apache是同步多進(jìn)程模型,一個(gè)連接對(duì)應(yīng)一個(gè)進(jìn)程;nginx是異步的,多個(gè)連接(萬(wàn)級(jí)別)可以對(duì)應(yīng)一個(gè)進(jìn)程    

21.PHP的魔術(shù)方法,魔術(shù)常量,超全局變量
魔術(shù)方法

__construct
__destruct
__call
__callStatic
__get
__set
__isset
__clone
__unset
__sleep
__wakeup
__toString
__invoke //反射:當(dāng)嘗試以調(diào)用函數(shù)的方式調(diào)用一個(gè)對(duì)象時(shí),__invoke() 方法會(huì)被自動(dòng)調(diào)用。
__set_stat
魔術(shù)常量:所謂的魔術(shù)常量就是PHP預(yù)定義的一些常量,這些常量會(huì)隨著所在的位置而變化。

__LINE__ 獲取文件中的當(dāng)前行號(hào)。
__FILE__ 獲取文件的完整路徑和文件名。
__DIR__  獲取文件所在目錄。
__FUNCTION__ 獲取函數(shù)名稱(PHP 4.3.0 新加)。
__CLASS__  獲取類的名稱(PHP 4.3.0 新加)。
__METHOD__ 獲取類的方法名(PHP 5.0.0 新加)。
__NAMESPACE__ 當(dāng)前命名空間的名稱(區(qū)分大小寫(xiě))。
__TRAIT__ Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定義時(shí)的名字(區(qū)分大小寫(xiě))。Trait 名包括其被聲明的作用區(qū)域(例如 *Foo\Bar*)。
超全局變量(9個(gè))
$GLOBALS :儲(chǔ)存全局作用域中的變量
$_SERVER :獲取服務(wù)器相關(guān)信息
$_REQUEST :獲取POST和GET請(qǐng)求的參數(shù)
$_POST : 獲取表單的POST請(qǐng)求參數(shù)
$_GET : 獲取表單的GET請(qǐng)求參數(shù)
$_FILES :獲取上傳文件的的變
$_ENV : 獲取服務(wù)器端環(huán)境變量的數(shù)組
$_COOKIE:獲取瀏覽器的cookie
$_SESSION : 獲取session
22.Linux新用戶配置文件的目錄
/etc/skel/目錄是用來(lái)存放新用戶配置文件的目錄,當(dāng)我們添加新用戶的時(shí)候,這個(gè)目錄下的所有文件會(huì)自動(dòng)被復(fù)制到新添加的用戶的家目錄下。這個(gè)目錄下的所有文件都是隱藏文件(以.點(diǎn)開(kāi)頭的文件)。

23. 國(guó)標(biāo)碼,區(qū)位碼,機(jī)內(nèi)碼,機(jī)器碼的區(qū)別?
【國(guó)標(biāo)碼】指國(guó)家標(biāo)準(zhǔn)漢字編碼:GB-2312

【區(qū)位碼】區(qū)位碼在GB-2312中預(yù)留了一些空位,便于補(bǔ)充和擴(kuò)展

【機(jī)內(nèi)碼】漢字ASCII碼。指計(jì)算機(jī)內(nèi)部存儲(chǔ),處理加工和傳輸漢字時(shí)所用的由0和1符號(hào)組成的代碼。

【機(jī)器碼】計(jì)算機(jī)直接使用的程序語(yǔ)言,其語(yǔ)句就是機(jī)器指令碼。

作者:碼農(nóng)編程進(jìn)階筆記


歡迎關(guān)注微信公眾號(hào) :碼農(nóng)編程進(jìn)階筆記