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