大家后總結(jié)了一些面試題,后續(xù)遇到還會(huì)繼續(xù)更新却音,如果有需要交流的可以私聊我改抡。
1.數(shù)據(jù)庫(kù)如何優(yōu)化?
區(qū)分場(chǎng)景使用不同的引擎系瓢。
(1)選取適當(dāng)?shù)淖侄伟⑾耍蜃侄卧O(shè)置為NOT NULL,在查詢的時(shí)候數(shù)據(jù)庫(kù)不用比較NULL夷陋;
(2)使用鏈接(join)代替子查詢欠拾;
(3)使用聯(lián)合(UNION)查詢代替手動(dòng)創(chuàng)建臨時(shí)表;
(4)盡量減少使用(LIKE)關(guān)鍵字和通配符
(5)使用事務(wù)和外健
2.sql語(yǔ)句應(yīng)該考慮哪些安全性骗绕?
1,防止sql注入藐窄,對(duì)特殊字符進(jìn)行轉(zhuǎn)義,過(guò)濾或者使用預(yù)編譯sql語(yǔ)句綁定
2,使用最小權(quán)限原則酬土,特別是不要使用root賬戶荆忍,微不同的動(dòng)作或者操作建立不同的賬戶
3,當(dāng)sql出錯(cuò)時(shí),不要把數(shù)據(jù)庫(kù)出錯(cuò)的信息暴露到客戶端
3,對(duì)于大流量的網(wǎng)站刹枉,你會(huì)采用什么方法來(lái)解決訪問(wèn)量叽唱?
1,首先確認(rèn)服務(wù)器硬件是否滿足支持當(dāng)前的流量;
2,優(yōu)化數(shù)據(jù)庫(kù)的訪問(wèn)微宝;
3,禁止外部盜鏈棺亭;
4,控制大文件下載;
5,使用不同的主機(jī)分流蟋软;
6,使用流量分析統(tǒng)計(jì)镶摘;
4,mysql 引擎中的MyISAM與InnoDB的區(qū)別理解岳守?
InnoDB和MyISAM是許多人在使用MySQL時(shí)最常用的兩個(gè)表類型凄敢,這兩個(gè)表類型各有優(yōu)劣,視具體應(yīng)用而定棺耍」蔽矗基本的差別為:MyISAM類型不支持事務(wù)處理等高級(jí)處理种樱,而InnoDB類型支持蒙袍。MyISAM類型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類型更快嫩挤,但是不提供事務(wù)支持害幅,而InnoDB提供事務(wù)支持已經(jīng)外部鍵等高級(jí)數(shù)據(jù)庫(kù)功能。
5岂昭,MySQL8.0的倒序索引是沒(méi)什么
1以现,使用desc 的時(shí)候九孩,你可以使用MySQL語(yǔ)句explanin進(jìn)行分析 icp是使用了倒序索引侦厚。
MyISAM與InnoDB的區(qū)別是什么?
1,存儲(chǔ)結(jié)構(gòu)
MyISAM:每個(gè)MyISAM在磁盤上存儲(chǔ)成三個(gè)文件困曙。第一個(gè)文件的名字以表的名字開始恰矩,擴(kuò)展名指出文件類型记盒。.frm文件存儲(chǔ)表定義。數(shù)據(jù)文件的擴(kuò)展名為.MYD (MYData)外傅。索引文件的擴(kuò)展名是.MYI (MYIndex)纪吮。
InnoDB:所有的表都保存在同一個(gè)數(shù)據(jù)文件中(也可能是多個(gè)文件,或者是獨(dú)立的表空間文件)萎胰,InnoDB表的大小只受限于操作系統(tǒng)文件的大小碾盟,一般為2GB。
2技竟、 存儲(chǔ)空間
MyISAM:可被壓縮冰肴,存儲(chǔ)空間較小。支持三種不同的存儲(chǔ)格式:靜態(tài)表(默認(rèn),但是注意數(shù)據(jù)末尾不能有空格熙尉,會(huì)被去掉)估盘、動(dòng)態(tài)表、壓縮表骡尽。
InnoDB:需要更多的內(nèi)存和存儲(chǔ)遣妥,它會(huì)在主內(nèi)存中建立其專用的緩沖池用于高速緩沖數(shù)據(jù)和索引。
3攀细、 可移植性箫踩、備份及恢復(fù)
MyISAM:數(shù)據(jù)是以文件的形式存儲(chǔ),所以在跨平臺(tái)的數(shù)據(jù)轉(zhuǎn)移中會(huì)很方便谭贪。在備份和恢復(fù)時(shí)可單獨(dú)針對(duì)某個(gè)表進(jìn)行操作境钟。
InnoDB:免費(fèi)的方案可以是拷貝數(shù)據(jù)文件、備份 binlog俭识,或者用 mysqldump慨削,在數(shù)據(jù)量達(dá)到幾十G的時(shí)候就相對(duì)痛苦了。
4套媚、 事務(wù)支持
MyISAM:強(qiáng)調(diào)的是性能缚态,每次查詢具有原子性,其執(zhí)行數(shù)度比InnoDB類型更快,但是不提供事務(wù)支持堤瘤。
InnoDB:提供事務(wù)支持事務(wù)玫芦,外部鍵等高級(jí)數(shù)據(jù)庫(kù)功能。 具有事務(wù)(commit)本辐、回滾(rollback)和崩潰修復(fù)能力(crash recovery capabilities)的事務(wù)安全(transaction-safe (ACID compliant))型表桥帆。
5、 AUTO_INCREMENT
MyISAM:可以和其他字段一起建立聯(lián)合索引慎皱。引擎的自動(dòng)增長(zhǎng)列必須是索引老虫,如果是組合索引,自動(dòng)增長(zhǎng)可以不是第一列茫多,他可以根據(jù)前面幾列進(jìn)行排序后遞增祈匙。
InnoDB:InnoDB中必須包含只有該字段的索引。引擎的自動(dòng)增長(zhǎng)列必須是索引地梨,如果是組合索引也必須是組合索引的第一列菊卷。
6、 表鎖差異
MyISAM:只支持表級(jí)鎖宝剖,用戶在操作myisam表時(shí)洁闰,select,update万细,delete扑眉,insert語(yǔ)句都會(huì)給表自動(dòng)加鎖纸泄,如果加鎖以后的表滿足insert并發(fā)的情況下,可以在表的尾部插入新的數(shù)據(jù)腰素。
InnoDB:支持事務(wù)和行級(jí)鎖聘裁,是innodb的最大特色。行鎖大幅度提高了多用戶并發(fā)操作的新能弓千。但是InnoDB的行鎖衡便,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會(huì)鎖全表的洋访。
7镣陕、 全文索引
MyISAM:支持 FULLTEXT類型的全文索引
InnoDB:不支持FULLTEXT類型的全文索引,但是innodb可以使用sphinx插件支持全文索引姻政,并且效果更好呆抑。
8、 表主鍵
MyISAM:允許沒(méi)有任何索引和主鍵的表存在汁展,索引都是保存行的地址鹊碍。
InnoDB:如果沒(méi)有設(shè)定主鍵或者非空唯一索引,就會(huì)自動(dòng)生成一個(gè)6字節(jié)的主鍵(用戶不可見)食绿,數(shù)據(jù)是主索引的一部分侈咕,附加索引保存的是主索引的值。
9炫欺、 表的具體行數(shù)
MyISAM:保存有表的總行數(shù)乎完,如果select count() from table;會(huì)直接取出出該值熏兄。
InnoDB:沒(méi)有保存表的總行數(shù)品洛,如果使用select count() from table;就會(huì)遍歷整個(gè)表摩桶,消耗相當(dāng)大桥状,但是在加了wehre條件后,myisam和innodb處理的方式都一樣硝清。
10辅斟、 CURD操作
MyISAM:如果執(zhí)行大量的SELECT,MyISAM是更好的選擇芦拿。
InnoDB:如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE士飒,出于性能方面的考慮,應(yīng)該使用InnoDB表蔗崎。DELETE 從性能上InnoDB更優(yōu)酵幕,但DELETE FROM table時(shí),InnoDB不會(huì)重新建立表缓苛,而是一行一行的刪除芳撒,在innodb上如果要清空保存有大量數(shù)據(jù)的表,最好使用truncate table這個(gè)命令。
11笔刹、 外鍵
MyISAM:不支持
InnoDB:支持
通過(guò)上述的分析芥备,基本上可以考慮使用InnoDB來(lái)替代MyISAM引擎了,原因是InnoDB自身很多良好的特點(diǎn)舌菜,比如事務(wù)支持萌壳、存儲(chǔ) 過(guò)程、視圖日月、行級(jí)鎖定等等讶凉,在并發(fā)很多的情況下,相信InnoDB的表現(xiàn)肯定要比MyISAM強(qiáng)很多山孔。另外懂讯,任何一種表都不是萬(wàn)能的,只用恰當(dāng)?shù)尼槍?duì)業(yè)務(wù)類型來(lái)選擇合適的表類型台颠,才能最大的發(fā)揮MySQL的性能優(yōu)勢(shì)褐望。如果不是很復(fù)雜的Web應(yīng)用,非關(guān)鍵應(yīng)用串前,還是可以繼續(xù)考慮MyISAM的瘫里,這個(gè)具體情況可以自己斟酌。
Redis 和 memache 緩存的區(qū)別
1.數(shù)據(jù)類型
Redis數(shù)據(jù)類型豐富荡碾,支持set list等類型
memcache支持簡(jiǎn)單數(shù)據(jù)類型谨读,需要客戶端自己處理復(fù)雜對(duì)象
2.持久性
redis支持?jǐn)?shù)據(jù)落地持久化存儲(chǔ)
memcache不支持?jǐn)?shù)據(jù)持久存儲(chǔ)
3.分布式存儲(chǔ)
redis支持master-slave復(fù)制模式
memcache可以使用一致性hash做分布式
value大小不同
memcache是一個(gè)內(nèi)存緩存,key的長(zhǎng)度小于250字符坛吁,單個(gè)item存儲(chǔ)要小于1M劳殖,不適合虛擬機(jī)使用
4.數(shù)據(jù)一致性不同
redis使用的是單線程模型,保證了數(shù)據(jù)按順序提交拨脉。
memcache需要使用cas保證數(shù)據(jù)一致性哆姻。CAS(Check and Set)是一個(gè)確保并發(fā)一致性的機(jī)制,屬于“樂(lè)觀鎖”范疇玫膀;原理很簡(jiǎn)單:拿版本號(hào)矛缨,操作,對(duì)比版本號(hào)帖旨,如果一致就操作箕昭,不一致就放棄任何操作
5.cpu利用
redis單線程模型只能使用一個(gè)cpu,可以開啟多個(gè)redis進(jìn)程
總結(jié):Redis跟memcached區(qū)別
1.Redis中解阅,并不是所有的數(shù)據(jù)都一直存儲(chǔ)在內(nèi)存中的落竹,這是和Memcached相比一個(gè)最大的區(qū)別。
2.Redis不僅僅支持簡(jiǎn)單的k/v類型的數(shù)據(jù)瓮钥,同時(shí)還提供list筋量,set烹吵,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
3.Redis支持?jǐn)?shù)據(jù)的備份桨武,即master-slave模式的數(shù)據(jù)備份肋拔。
4.Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中呀酸,重啟的時(shí)候可以再次加載進(jìn)行使用凉蜂。
我個(gè)人認(rèn)為最本質(zhì)的不同是Redis在很多方面具備數(shù)據(jù)庫(kù)的特征,或者說(shuō)就是一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)性誉,而Memcached只是簡(jiǎn)單的K/V緩存
redis和memecache的不同在于:
1窿吩、存儲(chǔ)方式:
memecache 把數(shù)據(jù)全部存在內(nèi)存之中,斷電后會(huì)掛掉错览,數(shù)據(jù)不能超過(guò)內(nèi)存大小
redis有部份存在硬盤上纫雁,這樣能保證數(shù)據(jù)的持久性。
2倾哺、數(shù)據(jù)支持類型:
redis在數(shù)據(jù)支持上要比memecache多的多轧邪。
3、使用底層模型不同:
新版本的redis直接自己構(gòu)建了VM 機(jī)制 羞海,因?yàn)橐话愕南到y(tǒng)調(diào)用系統(tǒng)函數(shù)的話忌愚,會(huì)浪費(fèi)一定的時(shí)間去移動(dòng)和請(qǐng)求。
4却邓、運(yùn)行環(huán)境不同:
redis目前官方只支持Linux 上去行硕糊,從而省去了對(duì)于其它系統(tǒng)的支持,這樣的話可以更好的把精力用于本系統(tǒng) 環(huán)境上的優(yōu)化腊徙,雖然后來(lái)微軟有一個(gè)小組為其寫了補(bǔ)丁简十。但是沒(méi)有放到主干上
memcache只能當(dāng)做緩存,cache
redis的內(nèi)容是可以落地的昧穿,就是說(shuō)跟MongoDB有些類似勺远,然后redis也可以作為緩存,并且可以設(shè)置master-slave
Redis類型場(chǎng)景作用
1时鸵,List 并發(fā)量很低用隊(duì)列做秒殺(守護(hù)進(jìn)程----業(yè)務(wù)復(fù)雜度高)(代碼)---網(wǎng)盤中
2,Set(集合) 社交厅瞎,用戶標(biāo)簽饰潜,統(tǒng)計(jì)
3,Zset(有序)(score 權(quán)重) 商品和簸、等排行數(shù)據(jù)彭雾、智能推薦、共同興趣愛好
4锁保,geo(3.2+)地圖空間
5薯酝,storm(5.0)
6半沽,bitmap (O2O(位置功能)- 地圖)
Redis6的淘汰策略有那些:
noeviction:不刪除策略,達(dá)到最大內(nèi)存限制時(shí)吴菠,如果需要更多內(nèi)存,
直接返回錯(cuò)誤信息者填。大多數(shù)寫命令都會(huì)導(dǎo)致占用更多的內(nèi)存(有極少數(shù)
會(huì)例外。
LRU算法我: allkeys-lru:所有 key通用;優(yōu)先刪除最近最少使用(less recently used ,LRU)的key做葵。
volatile-lru:只限于設(shè)置了expire的部分;優(yōu)先刪除最近最少使
用(less recently used ,LRU) 的key占哟。
隨機(jī)淘汰: allkeys-random:所有key通用;隨機(jī)刪除一部分key。volatile-random: 只限于設(shè)置了expire 的部分;隨機(jī)刪除一部分key酿矢。volatile-ttl: 只限于設(shè)置了expire的部分;優(yōu)先刪除剩余時(shí)間(time to live, TTL) 短的key榨乎。
Redis分布式鎖?
1,先拿setnx來(lái)爭(zhēng)搶鎖,搶到之后瘫筐,再用expire給鎖加上一個(gè)過(guò)期時(shí)間蜜暑,防止鎖忘記釋放,如果setnx之后執(zhí)行策肝,expire之前的進(jìn)程意外crash史煎,或者需要重啟維護(hù),那么就會(huì)產(chǎn)生死鎖驳糯。
2.那么上面的方式就不太實(shí)用了篇梭,我們換成:set指令有非常復(fù)雜的參數(shù),這個(gè)應(yīng)該是可以同時(shí)把setnx和expire合成一條指令來(lái)用酝枢。
Redis做異步隊(duì)列
1恬偷,一般實(shí)用list結(jié)構(gòu)作為隊(duì)列,rpush生成消息帘睦,lpop消費(fèi)消息袍患,當(dāng)lpop沒(méi)有消息的時(shí)候,要適當(dāng)sleep竣付,一會(huì)在重新試诡延,缺點(diǎn):在消費(fèi)者下線的情況下,生產(chǎn)的消息會(huì)會(huì)丟失古胆,得使用專用的消息隊(duì)列如果rabbitmq肆良,kafka等,能不能生產(chǎn)一次消費(fèi)多次呢逸绎?使用pub/sub主題的訂閱者模式惹恃,可以實(shí)現(xiàn)1:N的消息隊(duì)列。
Redis中海量數(shù)據(jù)的正確操作方式
1.利用SCAN系列命令(SCAN棺牧,SSCAN巫糙,HSCAN,ZSCAN)完成數(shù)據(jù)迭代。
Redis集群原理颊乘。
1参淹,Redis sentinal 著眼于高可用醉锄,在master宕機(jī)的時(shí)候會(huì)自動(dòng)蔣slave提示為master,繼續(xù)提供服務(wù)浙值,Redis cluster著眼于擴(kuò)展性恳不,在單個(gè)redis內(nèi)存不足時(shí),使用cluster進(jìn)行分片儲(chǔ)存亥鸠。
怎么理解Redis事務(wù)?
1妆够,事務(wù)是一個(gè)單獨(dú)的隔離操作:事務(wù)中的所有命令都會(huì)序列化、按順序地執(zhí)行负蚊。事務(wù)在執(zhí)行的過(guò)程中神妹,不會(huì)被其他客戶端發(fā)送來(lái)的命令請(qǐng)求所打斷。事務(wù)是一個(gè)原子操作: 事務(wù)中的命令要么全部被執(zhí)行家妆,要么全部都不執(zhí)行鸵荠。
如果有大量的key需要設(shè)置同- -時(shí)間過(guò)期,一般 需要注意什么?
1伤极,如果大量的key過(guò)期時(shí)間設(shè)置的過(guò)于集中蛹找,到過(guò)期的那個(gè)時(shí)間點(diǎn),redis 可能會(huì)出現(xiàn)短暫的卡頓現(xiàn)象哨坪。-般需要在時(shí)間庸疾,上加一個(gè)隨機(jī)值,使得過(guò)期時(shí)間分散-一些当编。
PHP的垃圾回收機(jī)制是什么届慈?
php5和php7的垃圾回收機(jī)制都是利用引用計(jì)數(shù)。
在zval結(jié)構(gòu)體中定義了ref_count和is_ref , ref_count是引用計(jì)數(shù) ,標(biāo)識(shí)此zval被多少個(gè)變量引用 , 為0時(shí)會(huì)被銷毀忿偷。
TCP跟HTTP 有什么區(qū)別嗎金顿?
答:TCP的三次握手,IP協(xié)議
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器鲤桥,并進(jìn)入SYN_SEND狀態(tài)揍拆,等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到syn包茶凳,必須確認(rèn)客戶的SYN(ack=j+1)嫂拴,同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包慧妄,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)顷牌;
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1)塞淹,此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài)罪裹,完成三次握手饱普。
HTTP:HTTP協(xié)議即超文本傳送協(xié)議(Hypertext Transfer Protocol )运挫,是Web聯(lián)網(wǎng)的基礎(chǔ),也是手機(jī)聯(lián)網(wǎng)常用的協(xié)議之一套耕,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用谁帕。
HTTP連接最顯著的特點(diǎn)是客戶端發(fā)送的每次請(qǐng)求都需要服務(wù)器回送響應(yīng),在請(qǐng)求結(jié)束后冯袍,會(huì)主動(dòng)釋放連接匈挖。從建立連接到關(guān)閉連接的過(guò)程稱為“一次連接”。
TCP/IP有幾層:
答:總共分為4層康愤。鏈路層儡循,網(wǎng)絡(luò)層,傳輸層征冷,應(yīng)用層择膝。
PHP的面向?qū)ο筇卣魇鞘裁矗?/h3>
答:封裝,繼承检激,多態(tài)肴捉。
1.1:什么是多態(tài)?多態(tài)的含義是什么叔收?
當(dāng)父類引用了子列的實(shí)例的時(shí)候齿穗, 由于子類從新編寫了父類,父類的方法不同饺律,這樣是多態(tài)窃页。
TCP跟UDP的區(qū)別是什么?
1蓝晒,TCP:面向鏈接的腮出。
2,UDP:無(wú)鏈接的芝薇,即發(fā)送數(shù)據(jù)胚嘲,不需要進(jìn)行鏈接。
安全方面:
1洛二,tpc:穩(wěn)定性馋劈,無(wú)差別, 不丟失晾嘶,不重復(fù)妓雾,按序到達(dá)。
2垒迂,最大努力交付械姻,容易丟包,不保證完全交付机断。
傳輸區(qū)別
TCP相對(duì)較低楷拳,
UDP相對(duì)較高
鏈接數(shù)量區(qū)別
TCP:一對(duì)一绣夺,點(diǎn)對(duì)點(diǎn)。
UDP:一對(duì)一欢揖,點(diǎn)對(duì)點(diǎn)陶耍,一對(duì)多。
Redis的持久化有幾種她混。
答:2種烈钞,一種日志儲(chǔ)存在文件中,一種快照方式坤按,儲(chǔ)存在磁盤上毯欣。
PHP與Nginx如何交互?
fastcgi進(jìn)行通信晋涣。
PHP控制類中方法的訪問(wèn)權(quán)限
1.訪問(wèn)方式:
PHP5提供了3種訪問(wèn)方式:
(1)public:可以被毫無(wú)限制地訪問(wèn)仪媒,類外部的任何代碼都可以讀寫public屬性,在PHP5之前的版本中谢鹊,所有的方法和屬性都是public算吩。
(2)private:只在類的內(nèi)部可見,類中的任何成員和類實(shí)例都可以訪問(wèn)private成員佃扼,在所在類之外偎巢,不能改變或者讀取private屬性的值,也不能調(diào)用private的方法兼耀。子類也不能訪問(wèn)父類的private成員压昼。
(3)protected:能被同類和繼承出的類的方法訪問(wèn)到。