[建議收藏]緩存雪崩的處理辦法
1. Mysql優(yōu)化器的參考標(biāo)準(zhǔn)
mysql的索引是由mysql的server層的優(yōu)化器決定的
2.Memcache和Redis單個key大小限制
Memcache單個key(變量)存放的數(shù)據(jù)有1M的限制
Redis單個key(變量)存放的數(shù)據(jù)有1G的限制
3.緩存雪崩的處理辦法
事前:進行系統(tǒng)壓力測試,在負(fù)載均衡層做限流處理,過載丟棄請求或者進入隊列
事前:redis 高可用,主從+哨兵,redis cluster,避免全盤崩潰。
事中:本地緩存 + 限流降級,避免 MySQL 被打死。
事后:redis 持久化,一旦重啟,自動從磁盤上加載數(shù)據(jù),快速恢復(fù)緩存數(shù)據(jù)。
緩存雪崩、擊穿、穿透,該如何避免?
Redis中緩存雪崩、緩存穿透等問題的解決方案
緩存穿透、緩存并發(fā)、緩存雪崩、緩存抖動、熱點緩存、緩存雙寫一致性等問題
4.分布式id算法?
雪花算法是 twitter 開源的分布式 id 生成算法,采用 Scala 語言實現(xiàn),是把一個 64 位的 long 型的 id,1 個 bit 是不用的,用其中的 41 bit 作為毫秒數(shù),用 10 bit 作為工作機器 id,12 bit 作為序列號。雪花算法SnowFlake生成唯一ID
1 bit:不用,為啥呢?因為二進制里第一個 bit 為如果是 1,那么都是負(fù)數(shù),但是我們生成的 id 都是正數(shù),所以第一個 bit 統(tǒng)一都是 0。
41 bit:表示的是時間戳,單位是毫秒。41 bit 可以表示的數(shù)字多達(dá) 2^41 - 1,也就是可以標(biāo)識 2^41 - 1 個毫秒值,換算成年就是表示69年的時間。
10 bit:記錄工作機器 id,代表的是這個服務(wù)最多可以部署在 2^10臺機器上哪,也就是1024臺機器。但是 10 bit 里 5 個 bit 代表機房 id,5 個 bit 代表機器 id。意思就是最多代表 2^5個機房(32個機房),每個機房里可以代表 2^5 個機器(32臺機器)。
12 bit:這個是用來記錄同一個毫秒內(nèi)產(chǎn)生的不同 id,12 bit 可以代表的最大正整數(shù)是 2^12 - 1 = 4096,也就是說可以用這個 12 bit 代表的數(shù)字來區(qū)分同一個毫秒內(nèi)的 4096 個不同的 id。
5.Redis內(nèi)存淘汰機制
noeviction: 當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,新寫入操作會報錯,這個一般沒人用吧,實在是太惡心了。
allkeys-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在鍵空間中,移除最近最少使用的 key(這個是最常用的)。
allkeys-random:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在鍵空間中,隨機移除某個 key,這個一般沒人用吧,為啥要隨機,肯定是把最近最少使用的 key 給干掉啊。
volatile-lru:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在設(shè)置了過期時間的鍵空間中,移除最近最少使用的 key(這個一般不太合適)。
volatile-random:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在設(shè)置了過期時間的鍵空間中,隨機移除某個 key。
volatile-ttl:當(dāng)內(nèi)存不足以容納新寫入數(shù)據(jù)時,在設(shè)置了過期時間的鍵空間中,有更早過期時間的 key 優(yōu)先移除。
Redis過期--淘汰機制的解析和內(nèi)存占用過高的解決方案
7. 常見MQ選型
ActiveMQ 基于 Java 開發(fā)的, RabbitMQ 是基于 erlang 開發(fā)的。
特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
單機吞吐量 | 萬級,比 RocketMQ、Kafka 低一個數(shù)量級 | 同 ActiveMQ | 10 萬級,支撐高吞吐 | 10 萬級,高吞吐,一般配合大數(shù)據(jù)類的系統(tǒng)來進行實時數(shù)據(jù)計算、日志采集等場景 |
topic 數(shù)量對吞吐量的影響 | topic 可以達(dá)到幾百/幾千的級別,吞吐量會有較小幅度的下降,這是 RocketMQ 的一大優(yōu)勢,在同等機器下,可以支撐大量的 topic | topic 從幾十到幾百個時候,吞吐量會大幅度下降,在同等機器下,Kafka 盡量保證 topic 數(shù)量不要過多,如果要支撐大規(guī)模的 topic,需要增加更多的機器資源 | ||
時效性 | ms 級 | 微秒級,這是 RabbitMQ 的一大特點,延遲最低 | ms 級 | 延遲在 ms 級以內(nèi) |
可用性 | 高,基于主從架構(gòu)實現(xiàn)高可用 | 同 ActiveMQ | 非常高,分布式架構(gòu) | 非常高,分布式,一個數(shù)據(jù)多個副本,少數(shù)機器宕機,不會丟失數(shù)據(jù),不會導(dǎo)致不可用 |
消息可靠性 | 有較低的概率丟失數(shù)據(jù) | 基本不丟 | 經(jīng)過參數(shù)優(yōu)化配置,可以做到 0 丟失 | 同 RocketMQ |
功能支持 | MQ 領(lǐng)域的功能極其完備 | 基于 erlang 開發(fā),并發(fā)能力很強,性能極好,延時很低 | MQ 功能較為完善,還是分布式的,擴展性好 | 功能較為簡單,主要支持簡單的 MQ 功能,在大數(shù)據(jù)領(lǐng)域的實時計算以及日志采集被大規(guī)模使用 |
8. 樹數(shù)據(jù)結(jié)構(gòu)分類
有序樹的定義:若將樹中每個結(jié)點的各子樹看成是從左到右有次序的(即不能互換),則稱該樹為有序樹(Ordered Tree)
無序樹的定義:若將樹中每個結(jié)點的各子樹從左到右是沒有次序的(即可以互換),則稱該樹為無序樹
9. 數(shù)據(jù),數(shù)據(jù)元素,數(shù)據(jù)項,數(shù)據(jù)對象的詳細(xì)理解
1.數(shù)據(jù)(Data):數(shù)據(jù)就是用戶輸入到計算機被計算機程序處理的一些符號,比如圖片還有聲音等....
2.數(shù)據(jù)元素(Data Element):是數(shù)據(jù)的基本單位,數(shù)據(jù)元素用于完整的描述一個對象,比如一個學(xué)生表,學(xué)生表也是由 數(shù)據(jù)元素和數(shù)據(jù)項組成的.
3.數(shù)據(jù)項(Data ltem):是組成數(shù)據(jù)元素的!例如 學(xué)生表 的中的 "學(xué)號 姓名 性別"等數(shù)據(jù)項.
4.數(shù)據(jù)對象:是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個子集,例如:整數(shù)數(shù)據(jù)對象的集合 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 臨時重定向(POST改為GET)
307 Temporary Redirect 臨時重定向(保持POST)
301一般用作永久跳轉(zhuǎn),除非用戶清瀏覽器緩存,否則不會修改跳轉(zhuǎn)地址;
302和307可以在后端修改跳轉(zhuǎn)地址,不同在于302會把POST轉(zhuǎn)為GET請求,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ù)合索引只有在前面的字段為精確查詢時,才會用上后面的復(fù)合索引,一旦出現(xiàn)不精確查詢,則不會使用復(fù)合索引。
select * from test where a=10 and b>10 order by c
使用了a_b索引,order by c不使用索引
12. sql語句從執(zhí)行到返回結(jié)果中間花費時間最長的環(huán)節(jié)是哪步?
查詢結(jié)果的數(shù)據(jù)量越大返回時間越長,遠(yuǎn)遠(yuǎn)超過其他環(huán)節(jié)的占用時間。
13.PHP模式修飾符
模式修飾符 含義
i:正則表達(dá)式匹配時不區(qū)分大小寫
m:不加m時,被匹配的字符串被當(dāng)成整體一行處理,^匹配開始位置,$匹配結(jié)束位置或匹配最后一個換行符;
加m時,被匹配的字符串通過換行符當(dāng)成多行處理,每行都與^和$包圍的正則進行匹配
s:正則表達(dá)式中的點號(.)將表示任何字符,包括換行符
x:正則表達(dá)式中除轉(zhuǎn)義外的空字符,其它空字符將被忽略
e:只用在正則替換的函數(shù)比如preg_replace()中,表示用一個函數(shù)替換內(nèi)容。該修飾符在高版本php中已不再使用,已被preg_replace_callback()所替代
A:匹配時會從字符串開始位置進行匹配
D:不加D時,$匹配結(jié)束位置或匹配最后一個換行符;
加D時,僅匹配結(jié)束位置; 如果設(shè)定了修飾符m則會忽略修飾符D
U:不加U時,是貪婪匹配,會最大量的找匹配部分;
加U時,是非貪婪匹配,只找最小的匹配部分
14. HTTP常用方法及作用
一臺服務(wù)器要與HTTP1.1兼容,只要為資源實現(xiàn)GET和HEAD方法即可
GET是最常用的方法,通常用于請求服務(wù)器發(fā)送某個資源。
HEAD與GET類似,但服務(wù)器在響應(yīng)中值返回首部,不返回實體的主體部分
PUT讓服務(wù)器用請求的主體部分來創(chuàng)建一個由所請求的URL命名的新文檔,或者,如果那個URL已經(jīng)存在的話,就用干這個主體替代它
POST起初是用來向服務(wù)器輸入數(shù)據(jù)的。實際上,通常會用它來支持HTML的表單。表單中填好的數(shù)據(jù)通常會被送給服務(wù)器,然后由服務(wù)器將其發(fā)送到要去的地方。
TRACE會在目的服務(wù)器端發(fā)起一個環(huán)回診斷,最后一站的服務(wù)器會彈回一個TRACE響應(yīng)并在響應(yīng)主體中攜帶它收到的原始請求報文。TRACE方法主要用于診斷,用于驗證請求是否如愿穿過了請求/響應(yīng)鏈。
OPTIONS方法請求web服務(wù)器告知其支持的各種功能。可以查詢服務(wù)器支持哪些方法或者對某些特殊資源支持哪些方法。
DELETE請求服務(wù)器刪除請求URL指定的資源
15. 常見header請求頭
- | - | 示例 |
---|---|---|
vary | 告訴代理服務(wù)器/緩存/CDN,如何判斷請求是否一樣 | Vary: Accept-Encoding,User-Agent |
Rang | 請求一段內(nèi)存,如0到2000字節(jié),可用于斷點下載 | Rang bytes=0-2000 |
Referer | 來源地址 | |
Upgrade | 切換協(xié)議版本 | Upgrade: HTTP/2.0, SHTTP/1.3 |
User-Agent | 用戶信息 | User-Agent: Mozilla/5.0 (Linux; X11) |
X-Requested-With | null 傳統(tǒng)請求;XMLHttpRequest Ajax請求 |
16.外部排序使用的數(shù)據(jù)結(jié)構(gòu)
外部排序指的是大文件的排序,即待排序的記錄存儲在外存儲器上,待排序的文件無法一次裝入內(nèi)存,需要在內(nèi)存和外部存儲器之間進行多次數(shù)據(jù)交換,以達(dá)到排序整個文件的目的。
外部排序最常用的算法是多路歸并排序,即將原文件分解成多個能夠一次性裝人內(nèi)存的部分,分別把每一部分調(diào)入內(nèi)存完成排序。然后,對已經(jīng)排序的子文件進行歸并排序。大規(guī)模數(shù)據(jù)存儲中,實現(xiàn)索引查詢這樣一個實際背景下,樹節(jié)點存儲的元素數(shù)量是有限的(如果元素數(shù)量非常多的話,查找就退化成節(jié)點內(nèi)部的線性查找了),這樣導(dǎo)致二叉查找樹結(jié)構(gòu)由于樹的深度過大而造成磁盤I/O讀寫過于頻繁,進而導(dǎo)致查詢效率低下,那么如何減少樹的深度(當(dāng)然是不能減少查詢的數(shù)據(jù)量),一個基本的想法就是:采用多叉樹結(jié)構(gòu)(由于樹節(jié)點元素數(shù)量是有限的,自然該節(jié)點的子樹數(shù)量也就是有限的)。這樣我們就提出了一個新的查找樹結(jié)構(gòu)——多路查找樹。根據(jù)平衡二叉樹的啟發(fā),自然就想到平衡多路查找樹結(jié)構(gòu),也就是B-tree(B樹結(jié)構(gòu))
17. PHP三大模塊
內(nèi)核、zend引擎、以及擴展層
參考:[PHP內(nèi)核]
18.opcode是什么?
opcode 是Php腳本編譯后的中間碼,Zend引擎將源文件轉(zhuǎn)換成opcode代碼,然后在虛擬機上運行
緩存opcode 后 可以加快網(wǎng)站的運行速度
用apc 或者xcache 緩存可以緩存php的opcode
19.字母如何轉(zhuǎn)二進制?
A的ASCII碼是65,16進制對應(yīng)41,二進制對應(yīng)01000001
a的ASCII碼是97,16進制對應(yīng)61,二進制對應(yīng)01100001
20. Apache和Nginx的區(qū)別?
Nginx是輕量級,比apache占用更少的內(nèi)存以及資源,全面了解Nginx主要應(yīng)用場景?
apache是同步多進程模型,一個連接對應(yīng)一個進程;nginx是異步的,多個連接(萬級別)可以對應(yīng)一個進程
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)用一個對象時,__invoke() 方法會被自動調(diào)用。
__set_stat
魔術(shù)常量:所謂的魔術(shù)常量就是PHP預(yù)定義的一些常量,這些常量會隨著所在的位置而變化。
__LINE__ 獲取文件中的當(dāng)前行號。
__FILE__ 獲取文件的完整路徑和文件名。
__DIR__ 獲取文件所在目錄。
__FUNCTION__ 獲取函數(shù)名稱(PHP 4.3.0 新加)。
__CLASS__ 獲取類的名稱(PHP 4.3.0 新加)。
__METHOD__ 獲取類的方法名(PHP 5.0.0 新加)。
__NAMESPACE__ 當(dāng)前命名空間的名稱(區(qū)分大小寫)。
__TRAIT__ Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定義時的名字(區(qū)分大小寫)。Trait 名包括其被聲明的作用區(qū)域(例如 *Foo\Bar*)。
超全局變量(9個)
$GLOBALS :儲存全局作用域中的變量
$_SERVER :獲取服務(wù)器相關(guān)信息
$_REQUEST :獲取POST和GET請求的參數(shù)
$_POST : 獲取表單的POST請求參數(shù)
$_GET : 獲取表單的GET請求參數(shù)
$_FILES :獲取上傳文件的的變
$_ENV : 獲取服務(wù)器端環(huán)境變量的數(shù)組
$_COOKIE:獲取瀏覽器的cookie
$_SESSION : 獲取session
22.Linux新用戶配置文件的目錄
/etc/skel/目錄是用來存放新用戶配置文件的目錄,當(dāng)我們添加新用戶的時候,這個目錄下的所有文件會自動被復(fù)制到新添加的用戶的家目錄下。這個目錄下的所有文件都是隱藏文件(以.點開頭的文件)。
23. 國標(biāo)碼,區(qū)位碼,機內(nèi)碼,機器碼的區(qū)別?
【國標(biāo)碼】指國家標(biāo)準(zhǔn)漢字編碼:GB-2312
【區(qū)位碼】區(qū)位碼在GB-2312中預(yù)留了一些空位,便于補充和擴展
【機內(nèi)碼】漢字ASCII碼。指計算機內(nèi)部存儲,處理加工和傳輸漢字時所用的由0和1符號組成的代碼。
【機器碼】計算機直接使用的程序語言,其語句就是機器指令碼。
作者:碼農(nóng)編程進階筆記
歡迎關(guān)注微信公眾號 :碼農(nóng)編程進階筆記