大家后總結(jié)了一些面試題,后續(xù)遇到還會(huì)繼續(xù)更新,如果有需要交流的可以私聊我。
1.數(shù)據(jù)庫(kù)如何優(yōu)化?
區(qū)分場(chǎng)景使用不同的引擎。
(1)選取適當(dāng)?shù)淖侄?,打字段設(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īng)該考慮哪些安全性?
1,防止sql注入,對(duì)特殊字符進(jìn)行轉(zhuǎn)義,過濾或者使用預(yù)編譯sql語句綁定
2,使用最小權(quán)限原則,特別是不要使用root賬戶,微不同的動(dòng)作或者操作建立不同的賬戶
3,當(dāng)sql出錯(cuò)時(shí),不要把數(shù)據(jù)庫(kù)出錯(cuò)的信息暴露到客戶端
3,對(duì)于大流量的網(wǎng)站,你會(huì)采用什么方法來解決訪問量?
1,首先確認(rèn)服務(wù)器硬件是否滿足支持當(dāng)前的流量;
2,優(yōu)化數(shù)據(jù)庫(kù)的訪問;
3,禁止外部盜鏈;
4,控制大文件下載;
5,使用不同的主機(jī)分流;
6,使用流量分析統(tǒng)計(jì);
4,mysql 引擎中的MyISAM與InnoDB的區(qū)別理解?
InnoDB和MyISAM是許多人在使用MySQL時(shí)最常用的兩個(gè)表類型,這兩個(gè)表類型各有優(yōu)劣,視具體應(yīng)用而定?;镜牟顒e為:MyISAM類型不支持事務(wù)處理等高級(jí)處理,而InnoDB類型支持。MyISAM類型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類型更快,但是不提供事務(wù)支持,而InnoDB提供事務(wù)支持已經(jīng)外部鍵等高級(jí)數(shù)據(jù)庫(kù)功能。
5,MySQL8.0的倒序索引是沒什么
1,使用desc 的時(shí)候,你可以使用MySQL語句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語句都會(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:允許沒有任何索引和主鍵的表存在,索引都是保存行的地址。
InnoDB:如果沒有設(shè)定主鍵或者非空唯一索引,就會(huì)自動(dòng)生成一個(gè)6字節(jié)的主鍵(用戶不可見),數(shù)據(jù)是主索引的一部分,附加索引保存的是主索引的值。
9、 表的具體行數(shù)
MyISAM:保存有表的總行數(shù),如果select count() from table;會(huì)直接取出出該值。
InnoDB:沒有保存表的總行數(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:支持
通過上述的分析,基本上可以考慮使用InnoDB來替代MyISAM引擎了,原因是InnoDB自身很多良好的特點(diǎn),比如事務(wù)支持、存儲(chǔ) 過程、視圖、行級(jí)鎖定等等,在并發(fā)很多的情況下,相信InnoDB的表現(xiàn)肯定要比MyISAM強(qiáng)很多。另外,任何一種表都不是萬能的,只用恰當(dāng)?shù)尼槍?duì)業(yè)務(wù)類型來選擇合適的表類型,才能最大的發(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ī)制,屬于“樂觀鎖”范疇;原理很簡(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ù)的特征,或者說就是一個(gè)數(shù)據(jù)庫(kù)系統(tǒng),而Memcached只是簡(jiǎn)單的K/V緩存
redis和memecache的不同在于:
1、存儲(chǔ)方式:
memecache 把數(shù)據(jù)全部存在內(nèi)存之中,斷電后會(huì)掛掉,數(shù)據(jù)不能超過內(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)化,雖然后來微軟有一個(gè)小組為其寫了補(bǔ)丁。但是沒有放到主干上
memcache只能當(dāng)做緩存,cache
redis的內(nèi)容是可以落地的,就是說跟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來爭(zhēng)搶鎖,搶到之后,再用expire給鎖加上一個(gè)過期時(shí)間,防止鎖忘記釋放,如果setnx之后執(zhí)行,expire之前的進(jìn)程意外crash,或者需要重啟維護(hù),那么就會(huì)產(chǎn)生死鎖。
2.那么上面的方式就不太實(shí)用了,我們換成:set指令有非常復(fù)雜的參數(shù),這個(gè)應(yīng)該是可以同時(shí)把setnx和expire合成一條指令來用。
Redis做異步隊(duì)列
1,一般實(shí)用list結(jié)構(gòu)作為隊(duì)列,rpush生成消息,lpop消費(fèi)消息,當(dāng)lpop沒有消息的時(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í)行的過程中,不會(huì)被其他客戶端發(fā)送來的命令請(qǐng)求所打斷。事務(wù)是一個(gè)原子操作: 事務(wù)中的命令要么全部被執(zhí)行,要么全部都不執(zhí)行。
如果有大量的key需要設(shè)置同- -時(shí)間過期,一般 需要注意什么?
1,如果大量的key過期時(shí)間設(shè)置的過于集中,到過期的那個(gè)時(shí)間點(diǎn),redis 可能會(huì)出現(xiàn)短暫的卡頓現(xiàn)象。-般需要在時(shí)間,上加一個(gè)隨機(jī)值,使得過期時(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)閉連接的過程稱為“一次連接”。
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:無鏈接的,即發(fā)送數(shù)據(jù),不需要進(jìn)行鏈接。
安全方面:
1,tpc:穩(wěn)定性,無差別, 不丟失,不重復(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控制類中方法的訪問權(quán)限
1.訪問方式:
PHP5提供了3種訪問方式:
(1)public:可以被毫無限制地訪問,類外部的任何代碼都可以讀寫public屬性,在PHP5之前的版本中,所有的方法和屬性都是public。
(2)private:只在類的內(nèi)部可見,類中的任何成員和類實(shí)例都可以訪問private成員,在所在類之外,不能改變或者讀取private屬性的值,也不能調(diào)用private的方法。子類也不能訪問父類的private成員。
(3)protected:能被同類和繼承出的類的方法訪問到。