一面:
1.B+樹的時(shí)間復(fù)雜度:O(logn)啄刹,當(dāng)時(shí)說成nlogn是講話時(shí)沒思考涮坐,B樹也說成B減樹,汗顏誓军。
2.聚簇索引在存儲(chǔ)方式上的特點(diǎn)膊升,跟主鍵id是否自增有沒有關(guān)聯(lián):只要聚簇索引是相鄰的,那么對(duì)應(yīng)的數(shù)據(jù)一定也是相鄰地存放在磁盤上的谭企。如果主鍵不是自增id廓译,那么可以想象它會(huì)不斷地調(diào)整數(shù)據(jù)的物理地址、分頁(yè)债查。比如非区,使用UUID作為聚簇索引會(huì)很糟糕:它使得聚簇索引的插入變得完全隨機(jī)。
3.mysql的樂觀鎖盹廷、悲觀鎖區(qū)別:樂觀鎖用版本號(hào)方式來解決征绸,悲觀鎖用阻塞其他select操作的方式解決問題。
4.tcp/ip分層當(dāng)時(shí)講的模糊俄占,現(xiàn)在重講:
比特流一層
arp協(xié)議等管怠,以及物理地址尋址、數(shù)據(jù)的成幀缸榄、流量控制渤弛、數(shù)據(jù)的檢錯(cuò)、重發(fā)一層
ip協(xié)議一層
tcp udp等協(xié)議一層
http甚带,ftp等協(xié)議一層
5.線程她肯,進(jìn)程,協(xié)程的區(qū)分:
進(jìn)程擁有自己獨(dú)立的堆和棧鹰贵,既不共享堆晴氨,亦不共享?xiàng)#M(jìn)程由操作系統(tǒng)調(diào)度碉输。
線程擁有自己獨(dú)立的棧和共享的堆籽前,共享堆,不共享?xiàng)7蠹兀€程也由操作系統(tǒng)調(diào)度枝哄。
協(xié)程和線程一樣共享堆,不共享?xiàng)H蚍牵瑓f(xié)程由程序員在代碼里調(diào)度膘格。(援引網(wǎng)絡(luò)博文)
當(dāng)運(yùn)行一個(gè)程序時(shí),OS會(huì)為這個(gè)程序啟動(dòng)一個(gè)進(jìn)程财松,可以將進(jìn)程看做一個(gè)包含了程序在運(yùn)行中需要用到和維護(hù)的各種資源的容器瘪贱。
一個(gè)線程是一個(gè)執(zhí)行空間纱控,這個(gè)空間會(huì)被OS來運(yùn)行函數(shù)中所寫的代碼。每個(gè)進(jìn)程至少包含一個(gè)線程菜秦,每個(gè)進(jìn)程的初始線程被稱作主線程甜害。(援引自GO語言實(shí)戰(zhàn))
6.用grep從百萬行數(shù)據(jù)里面匹配出對(duì)應(yīng)模式的數(shù)據(jù)前10條:
grep -e "pattern" -m 10 filepath
7.redis pub/sub如何保證消息可靠性?
redis的pub/sub不能直接支持消息可靠球昨,建議用rabbitmq等功能更強(qiáng)的消息隊(duì)列尔店。
8.php浮點(diǎn)型應(yīng)注意什么?(當(dāng)時(shí)沒有講很細(xì)主慰,沒有講出浮點(diǎn)型保存的小數(shù)為什么精度會(huì)失準(zhǔn)嚣州。)
二進(jìn)制保存十進(jìn)制的小數(shù),比如5.2 在十進(jìn)制5.2是有限小數(shù)共螺,改成二進(jìn)制確實(shí)無限小數(shù)该肴,所以保存起來,精度肯定會(huì)有一些缺失藐不。
詳解可以參考盧鈞軼博客http://cenalulu.github.io/linux/about-denormalized-float-number/
可以知道需要用到bcmath這樣的數(shù)學(xué)函數(shù)庫(kù)來操作浮點(diǎn)數(shù)的運(yùn)算匀哄,來保證精度。
參考鳥哥博客雏蛮,http://www.laruence.com/2011/12/19/2399.html http://www.laruence.com/2013/03/26/2884.html
二面
1.積分排行榜解決方案:利用redis的zset數(shù)據(jù)結(jié)構(gòu)的 zrank key member實(shí)現(xiàn)涎嚼,原理類似二分搜索。
2.go高并發(fā)的原理:我的回答是利用了協(xié)程挑秉,占用cpu和內(nèi)存的資源比進(jìn)程和線程少法梯。理由顯然單薄。補(bǔ)充如下:
內(nèi)存方面:
執(zhí)行協(xié)程只需要極少的棧內(nèi)存(大概是4~5KB)衷模,默認(rèn)情況下鹊汛,線程棧的大小為1MB-8MB
goroutine 的創(chuàng)建初始內(nèi)存成本很低廉,并且會(huì)根據(jù)需要?jiǎng)討B(tài)增長(zhǎng)和縮減占用的資源阱冶。這使得 goroutine 會(huì)從 4096 字節(jié)的初始棧內(nèi)存占用開始按需增長(zhǎng)或縮減內(nèi)存占用,而無需擔(dān)心資源的耗盡滥嘴。(援引自網(wǎng)絡(luò)博文)
模型優(yōu)勢(shì)方面:GO語言自帶一個(gè)可以調(diào)度線程和協(xié)程運(yùn)行的調(diào)度處理器木蹬,這個(gè)調(diào)度處理器實(shí)現(xiàn)了一些高級(jí)的算法,并發(fā)模型具有優(yōu)勢(shì)若皱。
進(jìn)程I/O訪問镊叁,阻塞了后面所有的計(jì)算,OS就直接把CPU切換到其他進(jìn)程走触,讓人家先用著晦譬。當(dāng)然除了I\O阻塞,還有時(shí)鐘阻塞等等互广。然后就出現(xiàn)了一個(gè)問題敛腌,就是太慢了卧土,一切換進(jìn)程得反復(fù)進(jìn)入內(nèi)核,置換掉一大堆狀態(tài)像樊。進(jìn)程數(shù)一多尤莺,大部分系統(tǒng)資源就被進(jìn)程切換給吃掉了。后來也有用線程來改善的生棍,大致意思就是颤霎,這個(gè)地方阻塞了,但我還有其他地方的邏輯流可以計(jì)算涂滴,這些邏輯流是共享一個(gè)地址空間的友酱,不用特別麻煩的切換頁(yè)表、刷新TLB等柔纵,只要把寄存器刷新一遍就行缔杉,能比切換進(jìn)程開銷少點(diǎn)。而協(xié)程是在進(jìn)程里寫一個(gè)邏輯處理器調(diào)度首量,利用到了并發(fā)優(yōu)勢(shì)壮吩,又可以避免反復(fù)系統(tǒng)調(diào)用,也沒有進(jìn)程切換造成的開銷加缘。這種用戶態(tài)線程就叫協(xié)程鸭叙。
協(xié)程主要解決了兩個(gè)必須的問題:一是碰著阻塞式I\O會(huì)導(dǎo)致整個(gè)進(jìn)程被掛起;二是由于缺乏時(shí)鐘阻塞拣宏,進(jìn)程需要自己擁有調(diào)度線程的能力暂雹。如果一種實(shí)現(xiàn)使得每個(gè)線程需要自己通過調(diào)用某個(gè)方法格仲,主動(dòng)交出控制權(quán)。那么我們就成這種用戶態(tài)線程是協(xié)作式的,就是協(xié)程哩陕。(引用自知乎~阿貓)
3.分庫(kù)分表技術(shù)方面考慮,什么時(shí)候該分庫(kù)分表褐荷,怎么操作计济?
垂直分表,把不常用的字段拆分到另外一張表各吨。
垂直分庫(kù)枝笨,把不同業(yè)務(wù)的數(shù)據(jù)放在不同的庫(kù)。服務(wù)化的拆分利于解耦和提高性能揭蜒,也利于系統(tǒng)擴(kuò)展横浑。
水平分表,表中的數(shù)據(jù)(比如user表)按照一定規(guī)律(比如對(duì)id進(jìn)行hash和取模后拆分)屉更♂闳冢可以一定程度緩解查詢性能瓶頸。但還會(huì)有庫(kù)級(jí)別IO瓶頸瑰谜,因?yàn)閿?shù)據(jù)在同一個(gè)庫(kù)中欺冀。
水平分庫(kù)分表树绩,于水平分表類似,唯一不同是將這些拆分出來的表保存在不同的數(shù)據(jù)庫(kù)中脚猾。在冷熱數(shù)據(jù)分離的場(chǎng)景很適用葱峡。能有效緩解單機(jī)和單褲性能瓶頸壓力,突破IO龙助、連接數(shù)砰奕、硬件資源的瓶頸。(援引Infoq作者 丁浪)
4.mysql讀寫分離或負(fù)載均衡靠什么機(jī)制調(diào)度提鸟?
應(yīng)該是問mysql數(shù)據(jù)庫(kù)訪問層主流方案军援,這個(gè)我沒接觸過,以后再補(bǔ)充称勋。
5.mysql跨庫(kù)事務(wù)怎么做
第一胸哥,用mysql5.7的XA特性。第二赡鲜,或者用隊(duì)列(需要設(shè)計(jì)一下這個(gè)隊(duì)列空厌,我后面補(bǔ)充下)來確保兩個(gè)任務(wù)執(zhí)行成功(限不需要回滾的場(chǎng)景)
6.redis集群增加或減少一個(gè)節(jié)點(diǎn)應(yīng)注意什么?
參考codis的redis集群方案的增加和減少節(jié)點(diǎn)的方法银酬。http://www.reibang.com/p/ec6a04eb66c3
7.swoole worker 的運(yùn)行方式嘲更,我回答是以多線程方式運(yùn)行的,其實(shí)是以多進(jìn)程方式運(yùn)行揩瞪。
關(guān)于Reactor Worker Task的關(guān)系赋朦,我后期再補(bǔ)充下。
14.memcache 一致性哈希原理李破?
簡(jiǎn)單的講宠哄,就是利用hash環(huán)和虛擬節(jié)點(diǎn)的思路,把請(qǐng)求分發(fā)到分布得很細(xì)密的虛擬節(jié)點(diǎn)上嗤攻。增加或刪除節(jié)點(diǎn)的時(shí)候毛嫉,該節(jié)點(diǎn)的緩存會(huì)被分發(fā)到下一虛擬節(jié)點(diǎn),而不會(huì)影響其他節(jié)點(diǎn)的已有緩存的命中率妇菱。
參考狱庇,朱雙印博客
http://www.zsythink.net/archives/1182
php對(duì)memcache/memcached的一致性實(shí)操,可以通過三種方式實(shí)現(xiàn):
第一恶耽,修改php.ini memcache擴(kuò)展的配置:
[Memcache]
Memcache.allow_failover = 1
Memcache.hash_strategy =consistent
Memcache.hash_function =crc32
第二,使用memcachd擴(kuò)展時(shí)颜启,可以通過setOption方法配置偷俭。
$mem = new Memcached();
$mem->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);
$mem->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$servers = array(
array('192.168.20.193', 11211, 33),
array('192.168.20.194', 11211, 67)
);
$mem->addServers($servers);
print_r($mem->get('str_key'));
第三,可以通過php代碼實(shí)現(xiàn)缰盏,比如flexihash.php類庫(kù)
援引http://www.itnose.net/detail/6619318.html