42、PHP緩存技術(shù)有哪些调塌?1)晋南、全頁(yè)面靜態(tài)化緩存2)、頁(yè)面部分緩存3)羔砾、數(shù)據(jù)緩存4)负间、查詢緩存5)、按內(nèi)容變更進(jìn)行緩存6)姜凄、內(nèi)存式緩存7)政溃、apache緩存模塊8)、php APC緩存擴(kuò)展9)态秧、Opcode緩存43董虱、PHP7的新特性有哪些?1),PHP 標(biāo)量類型與返回值類型聲明2),PHP NULL 合并運(yùn)算符3),PHP 太空船運(yùn)算符(組合比較符)4),PHP 常量數(shù)組5),PHP 匿名類6),PHP Closure::call()7),PHP 過(guò)濾 unserialize()8),PHP IntlChar()9),PHP CSPRNG10),PHP 7 異常11),PHP 7 use 語(yǔ)句12),PHP 7 錯(cuò)誤處理13),PHP intdiv() 函數(shù)14),PHP 7 Session 選項(xiàng)15),PHP 7 廢棄特性16),PHP 7 移除的擴(kuò)展17),PHP 7 移除的 SAPI18),0成本斷言44申鱼、如何實(shí)現(xiàn)商品的無(wú)限分類空扎?遞歸函數(shù)的編寫(xiě)。45润讥、什么是匿名函數(shù)转锈?匿名函數(shù)也叫什么函數(shù)?通常在什么情況下使用楚殿?php中的匿名函數(shù)(Anonymous functions)撮慨, 也叫閉包函數(shù)(closures), 允許指定一個(gè)沒(méi)有名稱的函數(shù)竿痰。最常用的就是回調(diào)函數(shù)的參數(shù)值。46砌溺、PHP 命名空間是為了解決什么問(wèn)題影涉? 在PHP中,命名空間用來(lái)解決在編寫(xiě)類庫(kù)或應(yīng)用程序時(shí)創(chuàng)建可重用的代碼如類或函數(shù)時(shí)碰到的兩類問(wèn)題: 用戶編寫(xiě)的代碼與PHP內(nèi)部的類/函數(shù)/常量或第三方類/函數(shù)/常量之間的名字沖突规伐。 為很長(zhǎng)的標(biāo)識(shí)符名稱(通常是為了緩解第一類問(wèn)題而定義的)創(chuàng)建一個(gè)別名(或簡(jiǎn)短)的名稱蟹倾,提高源代碼的可讀性。47猖闪、說(shuō)出幾個(gè)PHP常用加密碼方法鲜棠?md5,sha1,base64_encode,rsa48、請(qǐng)寫(xiě)一段PHP代碼培慌,確保多個(gè)進(jìn)程同時(shí)寫(xiě)入同一個(gè)文件成功function writeData($filepath, $data) { $fp = fopen($filepath,'a'); do{ usleep(100); }while (!flock($fp, LOCK_EX)); //LOCK_EX 取得獨(dú)占鎖定(寫(xiě)入的程序)進(jìn)行排它型鎖定 獲取鎖 有鎖就寫(xiě)入豁陆,沒(méi)鎖就得 $res = fwrite($fp, $data."\n"); flock($fp, LOCK_UN); //LOCK_UN 釋放鎖定(無(wú)論共享或獨(dú)占)。 fclose($fp); return $res; } 方案二可以借助Redis setnx49吵护、使用兩種方法獲取一個(gè)文件的擴(kuò)展名盒音。pathinfoparse_url50、寫(xiě)一個(gè)函數(shù)馅而,能夠遍歷一個(gè)文件夾下的所有文件和子文件夾祥诽。function my_scandir($dir) { $files = array(); if ( $handle = opendir($dir) ) { while ( ($file = readdir($handle)) !== false ) { if ( $file != ".." && $file != "." ) { if ( is_dir($dir . "/" . $file) ) { $files[$file] = scandir($dir . "/" . $file); }else { $files[] = $file; } } } closedir($handle); return $files; } }51、寫(xiě)出一個(gè)能創(chuàng)建多級(jí)目錄的PHP函數(shù) function createDir($path,$mode) { 瓮恭, if (is_dir($path)) echo "路徑已經(jīng)存在"! else { $re = mkdir($path,$mode,true); if ($re) echo "目錄創(chuàng)建成功"; else echo "目錄創(chuàng)建失敗"; }}$path = /a/b/c/d; $mode = 0777;createDir($path,$mode);52雄坪、寫(xiě)出一個(gè)正則表達(dá)式,過(guò)慮網(wǎng)頁(yè)上的所有JS/VBS腳本(即把script標(biāo)記及其內(nèi)容都去掉)
$script=” 以下內(nèi)容不顯示:alert(‘cc’);”;
echo preg_replace(“/].*?>.*?<\/script>/si”, “替換內(nèi)容”, $script);七偎血、mysql 部分1、優(yōu)化mysql數(shù)據(jù)庫(kù)的方法(至少5種)盯漂。1). 為查詢緩存優(yōu)化你的查詢2). EXPLAIN 你的 SELECT 查詢3). 當(dāng)只要一行數(shù)據(jù)時(shí)使用 LIMIT 14). 為搜索字段建索引5). 在Join表的時(shí)候使用相當(dāng)類型的例颇玷,并將其索引6). 千萬(wàn)不要 ORDER BY RAND()7). 避免 SELECT *8). 永遠(yuǎn)為每張表設(shè)置一個(gè)ID9). 使用 ENUM 而不是 VARCHAR10). 從 PROCEDURE ANALYSE() 取得建議11). 盡可能的使用 NOT NULL12). Prepared Statements13). 無(wú)緩沖的查詢14). 把IP地址存成 UNSIGNED INT15). 固定長(zhǎng)度的表會(huì)更快16). 垂直分割17). 拆分大的 DELETE 或 INSERT 語(yǔ)句18). 越小的列會(huì)越快19). 選擇正確的存儲(chǔ)引擎20). 使用一個(gè)對(duì)象關(guān)系映射器(Object Relational Mapper)21). 小心“永久鏈接”2、簡(jiǎn)單描述mysql中就缆,索引帖渠,主鍵,唯一索引竭宰,聯(lián)合索引的區(qū)別空郊,對(duì)數(shù)據(jù)庫(kù)的性能有什么影響(從讀寫(xiě)兩方面)。索引是一種特殊的文件(InnoDB數(shù)據(jù)表上的索引是表空間的一個(gè)組成部分)切揭,它們包含著對(duì)數(shù)據(jù)表里所有記錄的引用指針狞甚。普通索引(由關(guān)鍵字KEY或INDEX定義的索引)的唯一任務(wù)是加快對(duì)數(shù)據(jù)的訪問(wèn)速度。普通索引允許被索引的數(shù)據(jù)列包含重復(fù)的值廓旬。如果能確定某個(gè)數(shù)據(jù)列將只包含彼此各不相同的值哼审,在為這個(gè)數(shù)據(jù)列創(chuàng)建索引的時(shí)候就應(yīng)該用關(guān)鍵字UNIQUE把它定義為一個(gè)唯一索引。也就是說(shuō),唯一索引可以保證數(shù)據(jù)記錄的唯一性涩盾。主鍵十气,是一種特殊的唯一索引,在一張表中只能定義一個(gè)主鍵索引春霍,主鍵用于唯一標(biāo)識(shí)一條記錄砸西,使用關(guān)鍵字 PRIMARY KEY 來(lái)創(chuàng)建。索引可以覆蓋多個(gè)數(shù)據(jù)列址儒,如像INDEX(columnA, columnB)索引芹枷,這就是聯(lián)合索引。索引可以極大的提高數(shù)據(jù)的查詢速度离福,但是會(huì)降低插入杖狼、刪除、更新表的速度妖爷,因?yàn)樵趫?zhí)行這些寫(xiě)操作時(shí)蝶涩,還要操作索引文件。3絮识、數(shù)據(jù)庫(kù)中的事務(wù)是什么?事務(wù)(transaction)是作為一個(gè)單元的一組有序的數(shù)據(jù)庫(kù)操作绿聘。如果組中的所有操作都成功,則認(rèn)為事務(wù)成功次舌,即使只有一個(gè)操作失敗熄攘,事務(wù)也不成功。如果所有操作完成彼念,事務(wù)則提交挪圾,其修改將作用于所有其他數(shù)據(jù)庫(kù)進(jìn)程。如果一個(gè)操作失敗逐沙,則事務(wù)將回滾哲思,該事務(wù)所有操作的影響都將取消。ACID 四大特性,原子性吩案、隔離性棚赔、一致性、持久性徘郭。4靠益、對(duì)于關(guān)系型數(shù)據(jù)庫(kù)而言,索引是相當(dāng)重要的概念残揉,請(qǐng)回答有關(guān)索引的幾個(gè)問(wèn)題:a)胧后、索引的目的是什么?? 1. 快速訪問(wèn)數(shù)據(jù)表中的特定信息抱环,提高檢索速度? 2. 創(chuàng)建唯一性索引绩卤,保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性途样。? 3. 加速表和表之間的連接? 4. 使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí),可以顯著減少查詢中分組和排序的時(shí)間b)濒憋、索引對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的負(fù)面影響是什么何暇?創(chuàng)建索引和維護(hù)索引需要耗費(fèi)時(shí)間,這個(gè)時(shí)間隨著數(shù)據(jù)量的增加而增加凛驮;索引需要占用物理空間裆站,不光是表需要占用數(shù)據(jù)空間,每個(gè)索引也需要占用物理空間黔夭;當(dāng)對(duì)表進(jìn)行增宏胯、刪、改本姥、的時(shí)候索引也要?jiǎng)討B(tài)維護(hù)肩袍,這樣就降低了數(shù)據(jù)的維護(hù)速度。c)婚惫、為數(shù)據(jù)表建立索引的原則有哪些氛赐?? 1. 在最頻繁使用的、用以縮小查詢范圍的字段上建立索引先舷。? 2. 在頻繁使用的艰管、需要排序的字段上建立索引d)、什么情況下不宜建立索引蒋川?? 1. 對(duì)于查詢中很少涉及的列或者重復(fù)值比較多的列牲芋,不宜建立索引。? 2. 對(duì)于一些特殊的數(shù)據(jù)類型捺球,不宜建立索引缸浦,比如文本字段(text)等。5氮兵、簡(jiǎn)述在MySQL數(shù)據(jù)庫(kù)中MyISAM和InnoDB的區(qū)別裂逐。區(qū)別于其他數(shù)據(jù)庫(kù)的最重要的特點(diǎn)就是其插件式的表存儲(chǔ)引擎。切記:存儲(chǔ)引擎是基于表的胆剧,而不是數(shù)據(jù)庫(kù)絮姆。InnoDB與MyISAM的區(qū)別:InnoDB存儲(chǔ)引擎: 主要面向OLTP(Online Transaction Processing醉冤,在線事務(wù)處理)方面的應(yīng)用秩霍,是第一個(gè)完整支持ACID事務(wù)的存儲(chǔ)引擎(BDB第一個(gè)支持事務(wù)的存儲(chǔ)引擎,已經(jīng)停止開(kāi)發(fā))蚁阳。特點(diǎn):? ● 行鎖設(shè)計(jì)铃绒、支持外鍵;? ● 支持類似于Oracle風(fēng)格的一致性非鎖定讀(即:默認(rèn)情況下讀取操作不會(huì)產(chǎn)生鎖)螺捐;? ● InnoDB將數(shù)據(jù)放在一個(gè)邏輯的表空間中颠悬,由InnoDB自身進(jìn)行管理矮燎。從MySQL4.1版本開(kāi)始,可以將每個(gè)InnoDB存儲(chǔ)引擎的表單獨(dú)存放到一個(gè)獨(dú)立的ibd文件中赔癌;? ● InnoDB通過(guò)使用MVCC(多版本并發(fā)控制:讀不會(huì)阻塞寫(xiě)诞外,寫(xiě)也不會(huì)阻塞讀)來(lái)獲得高并發(fā)性,并且實(shí)現(xiàn)了SQL標(biāo)準(zhǔn)的4種隔離級(jí)別(默認(rèn)為REPEATABLE級(jí)別)灾票;? ● InnoDB還提供了插入緩沖(insert buffer)峡谊、二次寫(xiě)(double write)、自適應(yīng)哈希索引(adaptive hash index)刊苍、預(yù)讀(read ahead)等高性能和高可用的功能既们;? ● InnoDB采用了聚集(clustered)的方式來(lái)存儲(chǔ)表中的數(shù)據(jù),每張標(biāo)的存儲(chǔ)都按主鍵的順序存放(如果沒(méi)有顯式的在建表時(shí)指定主鍵正什,InnoDB會(huì)為每一行生成一個(gè)6字節(jié)的ROWID啥纸,并以此作為主鍵);? ● InnoDB表會(huì)有三個(gè)隱藏字段:除了上面提到了6字節(jié)的DB_ROW_ID外婴氮,還有6字節(jié)的DB_TX_ID(事務(wù)ID)和7字節(jié)的DB_ROLL_PTR(指向?qū)?yīng)回滾段的地址)斯棒。這個(gè)可以通過(guò)innodb monitor看到;MyISAM存儲(chǔ)引擎: 是MySQL官方提供的存儲(chǔ)引擎莹妒,主要面向OLAP(Online Analytical Processing,在線分析處理)方面的應(yīng)用名船。特點(diǎn):? ● 不支持事務(wù),支持表所和全文索引旨怠。操作速度快渠驼;? ● MyISAM存儲(chǔ)引擎表由MYD和MYI組成,MYD用來(lái)存放數(shù)據(jù)文件鉴腻,MYI用來(lái)存放索引文件迷扇。MySQL數(shù)據(jù)庫(kù)只緩存其索引文件,數(shù)據(jù)文件的緩存交給操作系統(tǒng)本身來(lái)完成爽哎;MySQL5.0版本開(kāi)始蜓席,MyISAM默認(rèn)支持256T的單表數(shù)據(jù);6课锌、解釋MySQL外連接厨内、內(nèi)連接與自連接的區(qū)別。先說(shuō)什么是交叉連接: 交叉連接又叫笛卡爾積渺贤,它是指不使用任何條件雏胃,直接將一個(gè)表的所有記錄和另一個(gè)表中的所有記錄一一匹配。內(nèi)連接 則是只有條件的交叉連接志鞍,根據(jù)某個(gè)條件篩選出符合條件的記錄瞭亮,不符合條件的記錄不會(huì)出現(xiàn)在結(jié)果集中,即內(nèi)連接只連接匹配的行固棚。外連接 其結(jié)果集中不僅包含符合連接條件的行统翩,而且還會(huì)包括左表仙蚜、右表或兩個(gè)表中的所有數(shù)據(jù)行,這三種情況依次稱之為左外連接厂汗,右外連接委粉,和全外連接。左外連接娶桦,也稱左連接艳丛,左表為主表,左表中的所有記錄都會(huì)出現(xiàn)在結(jié)果集中趟紊,對(duì)于那些在右表中并沒(méi)有匹配的記錄氮双,仍然要顯示,右邊對(duì)應(yīng)的那些字段值以NULL來(lái)填充霎匈。右外連接戴差,也稱右連接,右表為主表铛嘱,右表中的所有記錄都會(huì)出現(xiàn)在結(jié)果集中暖释。左連接和右連接可以互換,MySQL目前還不支持全外連接墨吓。7球匕、寫(xiě)出三種以上MySQL數(shù)據(jù)庫(kù)存儲(chǔ)引擎的名稱。MyISAM帖烘、InnoDB亮曹、BDB(BerkeleyDB)、Merge秘症、Memory(Heap)照卦、Example、Federated乡摹、Archive役耕、CSV、Blackhole聪廉、MaxDB 等等十幾個(gè)引擎8瞬痘、Myql中的事務(wù)回滾機(jī)制概述。事務(wù)是用戶定義的一個(gè)數(shù)據(jù)庫(kù)操作序列板熊,這些操作要么全做要么全不做框全,是一個(gè)不可分割的工作單位,事務(wù)回滾是指將該事務(wù)已經(jīng)完成的對(duì)數(shù)據(jù)庫(kù)的更新操作撤銷邻邮。要同時(shí)修改數(shù)據(jù)庫(kù)中兩個(gè)不同表時(shí)竣况,如果它們不是一個(gè)事務(wù)的話克婶,當(dāng)?shù)谝粋€(gè)表修改完筒严,可能第二個(gè)表修改過(guò)程中出現(xiàn)了異常而沒(méi)能修改丹泉,此時(shí)就只有第二個(gè)表依舊是未修改之前的狀態(tài),而第一個(gè)表已經(jīng)被修改完畢鸭蛙。而當(dāng)你把它們?cè)O(shè)定為一個(gè)事務(wù)的時(shí)候摹恨,當(dāng)?shù)谝粋€(gè)表修改完,第二表修改出現(xiàn)異常而沒(méi)能修改娶视,第一個(gè)表和第二個(gè)表都要回到未修改的狀態(tài)晒哄,這就是所謂的事務(wù)回滾。9肪获、MySQL的復(fù)制原理以及流程寝凌。1)在Slave 服務(wù)器上執(zhí)行sart slave命令開(kāi)啟主從復(fù)制開(kāi)關(guān),開(kāi)始進(jìn)行主從復(fù)制孝赫。2)此時(shí)较木,Slave服務(wù)器的IO線程會(huì)通過(guò)在master上已經(jīng)授權(quán)的復(fù)制用戶權(quán)限請(qǐng)求連接master服務(wù)器,并請(qǐng)求從執(zhí)行binlog日志文件的指定位置(日志文件名和位置就是在配置主從復(fù)制服務(wù)時(shí)執(zhí)行change master命令指定的)之后開(kāi)始發(fā)送binlog日志內(nèi)容3)Master服務(wù)器接收到來(lái)自Slave服務(wù)器的IO線程的請(qǐng)求后青柄,二進(jìn)制轉(zhuǎn)儲(chǔ)IO線程會(huì)根據(jù)Slave服務(wù)器的IO線程請(qǐng)求的信息分批讀取指定binlog日志文件指定位置之后的binlog日志信息伐债,然后返回給Slave端的IO線程。返回的信息中除了binlog日志內(nèi)容外致开,還有在master服務(wù)器端記錄的新的binlog文件名稱峰锁,以及在新的binlog中的下一個(gè)指定更新位置。4)當(dāng)Slave服務(wù)器的IO線程獲取到Master服務(wù)器上IO線程發(fā)送的日志內(nèi)容双戳、日志文件及位置點(diǎn)后虹蒋,會(huì)將binlog日志內(nèi)容依次寫(xiě)到Slave端自身的Relay Log(即中繼日志)文件(MySQL-relay-bin.xxx)的最末端,并將新的binlog文件名和位置記錄到master-info文件中飒货,以便下一次讀取master端新binlog日志時(shí)能告訴Master服務(wù)器從新binlog日志的指定文件及位置開(kāi)始讀取新的binlog日志內(nèi)容5)Slave服務(wù)器端的SQL線程會(huì)實(shí)時(shí)檢測(cè)本地Relay Log 中IO線程新增的日志內(nèi)容千诬,然后及時(shí)把Relay LOG 文件中的內(nèi)容解析成sql語(yǔ)句,并在自身Slave服務(wù)器上按解析SQL語(yǔ)句的位置順序執(zhí)行應(yīng)用這樣sql語(yǔ)句膏斤,并在relay-log.info中記錄當(dāng)前應(yīng)用中繼日志的文件名和位置點(diǎn)10徐绑、drop, delete truncate的區(qū)別莫辨。三者都是刪除的意思傲茄,但是三者個(gè)有些區(qū)別? ● delete和truncate只刪除表的數(shù)據(jù)不刪除表的結(jié)構(gòu)? ● 速度 drop > truncate > delete? ● 想刪除部分?jǐn)?shù)據(jù)時(shí), delete 刪除時(shí)要帶上where語(yǔ)句? ● 保留表而想刪除所有的數(shù)據(jù)時(shí)用truncate11沮榜、寫(xiě)出數(shù)據(jù)庫(kù)的三大范式盘榨。第一范式? 字段具有原子性,不可再分第二范式? 表中的每列都和主鍵相關(guān)第三范式? 每列都和主鍵列直接相關(guān)蟆融,而不是間接相關(guān)12草巡、數(shù)據(jù)庫(kù)中的樂(lè)觀鎖和悲觀鎖。根據(jù)不同類型可以對(duì)數(shù)據(jù)設(shè)置不同的鎖權(quán)限** 樂(lè)觀 悲觀 鎖 主要是作用在并發(fā)訪問(wèn)控制**? ● 悲觀鎖 假定會(huì)發(fā)生并發(fā)沖突型酥,屏蔽任何違反數(shù)據(jù)完整的操作? ● 樂(lè)觀鎖 假定不會(huì)發(fā)生沖突山憨,只有在提交操作時(shí)檢查是否違反數(shù)據(jù)的完整性13查乒、什么是存儲(chǔ)過(guò)程,及其優(yōu)缺點(diǎn)郁竟。存儲(chǔ)過(guò)程是一些編譯好的SQL語(yǔ)句因?yàn)橄到y(tǒng)在調(diào)用SQL的時(shí)候比較浪費(fèi)時(shí)間玛迄,所以之前先將一些基本的額SQL語(yǔ)句代碼進(jìn)行編譯(對(duì)單表或多表的增刪改查),然后再給代碼取一個(gè)名字棚亩,在需要這個(gè)功能時(shí)去調(diào)用它就可以了蓖议。優(yōu)點(diǎn):1. 運(yùn)行速度:對(duì)于很簡(jiǎn)單的sql,存儲(chǔ)過(guò)程沒(méi)有什么優(yōu)勢(shì)讥蟆。對(duì)于復(fù)雜的業(yè)務(wù)邏輯勒虾,因?yàn)樵诖鎯?chǔ)過(guò)程創(chuàng)建的時(shí)候,數(shù)據(jù)庫(kù)已經(jīng)對(duì)其進(jìn)行了一次解析和優(yōu)化瘸彤。存儲(chǔ)過(guò)程一旦執(zhí)行从撼,在內(nèi)存中就會(huì)保留一份這個(gè)存儲(chǔ)過(guò)程,這樣下次再執(zhí)行同樣的存儲(chǔ)過(guò)程時(shí)钧栖,可以從內(nèi)存中直接調(diào)用低零,所以執(zhí)行速度會(huì)比普通sql快。? ? 2.? 減少網(wǎng)絡(luò)傳輸:存儲(chǔ)過(guò)程直接就在數(shù)據(jù)庫(kù)服務(wù)器上跑拯杠,所有的數(shù)據(jù)訪問(wèn)都在數(shù)據(jù)庫(kù)服務(wù)器內(nèi)部進(jìn)行掏婶,不需要傳輸數(shù)據(jù)到其它服務(wù)器,所以會(huì)減少一定的網(wǎng)絡(luò)傳輸潭陪。但是在存儲(chǔ)過(guò)程中沒(méi)有多次數(shù)據(jù)交互雄妥,那么實(shí)際上網(wǎng)絡(luò)傳輸量和直接sql是一樣的。而且我們的應(yīng)用服務(wù)器通常與數(shù)據(jù)庫(kù)是在同一內(nèi)網(wǎng)依溯,大數(shù)據(jù)的訪問(wèn)的瓶頸會(huì)是硬盤(pán)的速度老厌,而不是網(wǎng)速±杪 3. 可維護(hù)性:的存儲(chǔ)過(guò)程有些時(shí)候比程序更容易維護(hù)枝秤,這是因?yàn)榭梢詫?shí)時(shí)更新DB端的存儲(chǔ)過(guò)程。? 有些bug慷嗜,直接改存儲(chǔ)過(guò)程里的業(yè)務(wù)邏輯淀弹,就搞定了。 4. 增強(qiáng)安全性:提高代碼安全庆械,防止 SQL注入薇溃。這一點(diǎn)sql語(yǔ)句也可以做到$猿耍 5. 可擴(kuò)展性:應(yīng)用程序和數(shù)據(jù)庫(kù)操作分開(kāi)沐序,獨(dú)立進(jìn)行,而不是相互在一起。方便以后的擴(kuò)展和DBA維護(hù)優(yōu)化策幼。缺點(diǎn):1. SQL本身是一種結(jié)構(gòu)化查詢語(yǔ)言邑时,但不是面向?qū)ο蟮牡模举|(zhì)上還是過(guò)程化的語(yǔ)言垄惧,面對(duì)復(fù)雜的業(yè)務(wù)邏輯,過(guò)程化的處理會(huì)很吃力绰寞。同時(shí)SQL擅長(zhǎng)的是數(shù)據(jù)查詢而非業(yè)務(wù)邏輯的處理到逊,如果如果把業(yè)務(wù)邏輯全放在存儲(chǔ)過(guò)程里面,違背了這一原則滤钱。2. 如果需要對(duì)輸入存儲(chǔ)過(guò)程的參數(shù)進(jìn)行更改觉壶,或者要更改由其返回的數(shù)據(jù),則您仍需要更新程序集中的代碼以添加參數(shù)件缸、更新調(diào)用铜靶,等等,這時(shí)候估計(jì)會(huì)比較繁瑣了他炊。3. 開(kāi)發(fā)調(diào)試復(fù)雜争剿,由于IDE的問(wèn)題,存儲(chǔ)過(guò)程的開(kāi)發(fā)調(diào)試要比一般程序困難痊末。? ? 4. 沒(méi)辦法應(yīng)用緩存蚕苇。雖然有全局臨時(shí)表之類的方法可以做緩存,但同樣加重了數(shù)據(jù)庫(kù)的負(fù)擔(dān)凿叠。如果緩存并發(fā)嚴(yán)重涩笤,經(jīng)常要加鎖,那效率實(shí)在堪憂盒件。5. 不支持群集蹬碧,數(shù)據(jù)庫(kù)服務(wù)器無(wú)法水平擴(kuò)展,或者數(shù)據(jù)庫(kù)的切割(水平或垂直切割)炒刁。數(shù)據(jù)庫(kù)切割之后恩沽,存儲(chǔ)過(guò)程并不清楚數(shù)據(jù)存儲(chǔ)在哪個(gè)數(shù)據(jù)庫(kù)中∠枋迹總結(jié):1. 適當(dāng)?shù)氖褂么鎯?chǔ)過(guò)程飒筑,能夠提高我們SQL查詢的性能,2. 存儲(chǔ)過(guò)程不應(yīng)該大規(guī)模使用绽昏,濫用协屡。3. 隨著眾多ORM 的出現(xiàn),存儲(chǔ)過(guò)程很多優(yōu)勢(shì)已經(jīng)不明顯全谤。4. SQL最大的缺點(diǎn)還是SQL語(yǔ)言本身的局限性——SQL本身是一種結(jié)構(gòu)化查詢語(yǔ)言肤晓,我們不應(yīng)該用存儲(chǔ)過(guò)程處理復(fù)雜的業(yè)務(wù)邏輯——讓SQL回歸它“結(jié)構(gòu)化查詢語(yǔ)言”的功用。復(fù)雜的業(yè)務(wù)邏輯,還是交給代碼去處理吧补憾。14漫萄、Innodb是行鎖,那什么時(shí)候會(huì)產(chǎn)生行鎖盈匾,什么情況下會(huì)變成表鎖腾务?一般情況下,innodb只對(duì)指定的行進(jìn)行鎖定削饵,其他進(jìn)程還是可以對(duì)表中的其他行進(jìn)行操作的岩瘦,因此,這時(shí)候innodb加的就是行鎖窿撬;但是启昧,如果在執(zhí)行一個(gè)SQL語(yǔ)句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表劈伴,例如update table set num=1 where name like “%aaa%”密末。 15、大批量插入數(shù)據(jù)跛璧,如何提高insert的性能严里?有如下方法:1)合并多條 insert 為一條,即: insert into t values(a,b,c),? (d,e,f) ,,,原因分析:主要原因是多條insert合并后日志量(MySQL的binlog和innodb的事務(wù)讓日志) 減少了追城,降低日志刷盤(pán)的數(shù)據(jù)量和頻率田炭,從而提高效率。通過(guò)合并SQL語(yǔ)句漓柑,同時(shí)也能減少SQL語(yǔ)句解析的次數(shù)教硫,減少網(wǎng)絡(luò)傳輸?shù)腎O。2)修改參數(shù) bulk_insert_buffer_size辆布, 調(diào)大批量插入的緩存瞬矩;3)設(shè)置 innodb_flush_log_at_trx_commit = 0 ,相對(duì)于 innodb_flush_log_at_trx_commit = 1 可以十分明顯的提升導(dǎo)入速度锋玲;? ? ? (備注:innodb_flush_log_at_trx_commit 參數(shù)對(duì) InnoDB Log 的寫(xiě)入性能有非常關(guān)鍵的影響景用。該參數(shù)可以設(shè)置為0,1惭蹂,2伞插,解釋如下: ? 0:log buffer中的數(shù)據(jù)將以每秒一次的頻率寫(xiě)入到log file中,且同時(shí)會(huì)進(jìn)行文件系統(tǒng)到磁盤(pán)的同步操作盾碗,但是每個(gè)事務(wù)的commit并不會(huì)觸發(fā)任何log buffer 到log file? 的刷新或者文件系統(tǒng)到磁盤(pán)的刷新操作; ? 1:在每次事務(wù)提交的時(shí)候?qū)og buffer 中的數(shù)據(jù)都會(huì)寫(xiě)入到log file媚污,同時(shí)也會(huì)觸發(fā)文件系統(tǒng)到磁盤(pán)的同步; ? 2:事務(wù)提交會(huì)觸發(fā)log buffer 到log file的刷新,但并不會(huì)觸發(fā)磁盤(pán)文件系統(tǒng)到磁盤(pán)的同步廷雅。此外耗美,每秒會(huì)有一次文件系統(tǒng)到磁盤(pán)同步操作京髓。? ? ? ? )4)手動(dòng)使用事務(wù)? 因?yàn)閙ysql默認(rèn)是autocommit的,這樣每插入一條數(shù)據(jù)商架,都會(huì)進(jìn)行一次commit堰怨;所以,為了減少創(chuàng)建事務(wù)的消耗蛇摸,我們可用手工使用事務(wù)备图,即START TRANSACTION;insert 。赶袄。,insert揽涮。。 commit弃鸦;即執(zhí)行多個(gè)insert后再一起提交绞吁;一般1000條insert 提交一次幢痘。 16唬格、如果發(fā)現(xiàn)CPU,或者IO壓力很大颜说,怎么定位問(wèn)題购岗?? 1)、首先我會(huì)用top命令和iostat命令门粪,定位是什么進(jìn)程在占用cpu和磁盤(pán)io喊积;? ? 2)、如果是mysql的問(wèn)題玄妈,我會(huì)登錄到數(shù)據(jù)庫(kù)乾吻,通過(guò)show full processlist命令,看現(xiàn)在數(shù)據(jù)庫(kù)在執(zhí)行什么sql語(yǔ)句拟蜻,是否有語(yǔ)句長(zhǎng)時(shí)間執(zhí)行使數(shù)據(jù)庫(kù)卡滓锴;? 3)酝锅、執(zhí)行show innodb engine status命令诡必,查看數(shù)據(jù)庫(kù)是否有鎖資源爭(zhēng)用;? 4)搔扁、查看mysql慢查詢?nèi)罩景质妫词欠裼新齭ql;? 5)稿蹲、找到引起數(shù)據(jù)庫(kù)占用資源高的語(yǔ)句扭勉,進(jìn)行優(yōu)化,該建索引的建索引苛聘,索引不合適的刪索引剖效,或者根據(jù)情況kill掉耗費(fèi)資源的sql語(yǔ)句等17嫉入、innodb有多少種日志?分別是什么。錯(cuò)誤日志(error log): log-err查詢?nèi)罩?general? query log): log慢查詢?nèi)罩? -log-slow-queries? ? ? 二進(jìn)制日志 (binary log): log-bin中繼日志( relay log)18璧尸、請(qǐng)列舉除mysql外咒林,PHP可以連接的其它關(guān)系數(shù)據(jù)庫(kù)(至少2個(gè))。sqlserver,postgresql,oracle,db219爷光、寫(xiě)出常用5種數(shù)據(jù)庫(kù)函數(shù)垫竞。concat(),find_in_set(),now(),from_unixtime(),unix_timestamp()20、編寫(xiě)SQL語(yǔ)句:(1)創(chuàng)建一張學(xué)生表student蛀序,包含學(xué)號(hào)student_id欢瞪,姓名studen_name,性別sex徐裸,年齡age遣鼓,家庭住址address,聯(lián)系電話tel信息?(2)修改學(xué)生表結(jié)構(gòu)重贺,增加學(xué)歷字段?(3)隨機(jī)插入3條學(xué)生信息?(4)查詢出年齡小于20歲骑祟,學(xué)歷為本科的所有學(xué)員信息?(5)統(tǒng)計(jì)所有學(xué)生的男女人數(shù)?(6)統(tǒng)計(jì)學(xué)生年齡在15-20,20-25,25-30三個(gè)區(qū)間的人數(shù)分別為多少?八帚湘、nosql部分1惠爽、使用redis有哪些好處?(1) 速度快悠汽,因?yàn)閿?shù)據(jù)存在內(nèi)存中潜圃,類似于HashMap缸棵,HashMap的優(yōu)勢(shì)就是查找和操作的時(shí)間復(fù)雜度都是O(1)(2) 支持豐富數(shù)據(jù)類型,支持string谭期,list堵第,set,sorted set隧出,hash(3) 支持事務(wù)踏志,操作都是原子性,所謂的原子性就是對(duì)數(shù)據(jù)的更改要么全部執(zhí)行鸳劳,要么全部不執(zhí)行(4) 豐富的特性:可用于緩存狰贯,消息,按key設(shè)置過(guò)期時(shí)間赏廓,過(guò)期后將會(huì)自動(dòng)刪除2. redis相比memcached有哪些優(yōu)勢(shì)涵紊?(1) memcached所有的值均是簡(jiǎn)單的字符串,redis作為其替代者幔摸,支持更為豐富的數(shù)據(jù)類型(2) redis的速度比memcached快很多摸柄,因?yàn)閿?shù)據(jù)存在內(nèi)存中,類似于HashMap既忆,HashMap的優(yōu)勢(shì)就是查找和操作的時(shí)間復(fù)雜度都是O(1)(3) redis可以持久化其數(shù)據(jù)3驱负、redis常見(jiàn)性能問(wèn)題和解決方案嗦玖?(1) Master最好不要做任何持久化工作,如RDB內(nèi)存快照和AOF日志文件(2) 如果數(shù)據(jù)比較重要跃脊,某個(gè)Slave開(kāi)啟AOF備份數(shù)據(jù)宇挫,策略設(shè)置為每秒同步一次(3) 為了主從復(fù)制的速度和連接的穩(wěn)定性,Master和Slave最好在同一個(gè)局域網(wǎng)內(nèi)(4) 盡量避免在壓力很大的主庫(kù)上增加從庫(kù)(5) 主從復(fù)制不要用圖狀結(jié)構(gòu)酪术,用單向鏈表結(jié)構(gòu)更為穩(wěn)定器瘪,即:Master <- Slave1 <- Slave2 <- Slave3...這樣的結(jié)構(gòu)方便解決單點(diǎn)故障問(wèn)題,實(shí)現(xiàn)Slave對(duì)Master的替換绘雁。如果Master掛了橡疼,可以立刻啟用Slave1做Master,其他不變庐舟。4欣除、redis的并發(fā)競(jìng)爭(zhēng)問(wèn)題如何解決?Redis為單進(jìn)程單線程模式,采用隊(duì)列模式將并發(fā)訪問(wèn)變?yōu)榇性L問(wèn)挪略。Redis本身沒(méi)有鎖的概念历帚,Redis對(duì)于多個(gè)客戶端連接并不存在競(jìng)爭(zhēng),但是在Jedis客戶端對(duì)Redis進(jìn)行并發(fā)訪問(wèn)時(shí)會(huì)發(fā)生連接超時(shí)瘟檩、數(shù)據(jù)轉(zhuǎn)換錯(cuò)誤抹缕、阻塞澈蟆、客戶端關(guān)閉連接等問(wèn)題墨辛,這些問(wèn)題均是由于客戶端連接混亂造成。對(duì)此有2種解決方法: 1.客戶端角度趴俘,為保證每個(gè)客戶端間正常有序與Redis進(jìn)行通信睹簇,對(duì)連接進(jìn)行池化,同時(shí)對(duì)客戶端讀寫(xiě)Redis操作采用內(nèi)部鎖synchronized寥闪√荩 2.服務(wù)器角度,利用setnx實(shí)現(xiàn)鎖疲憋≡湓ǎ 對(duì)于第一種,需要應(yīng)用程序自己處理資源的同步缚柳,可以使用的方法比較通俗埃脏,可以使用synchronized也可以使用lock;第二種需要用到Redis的setnx命令秋忙,但是需要注意一些問(wèn)題彩掐。5、redis持久化有幾種方式灰追,各有什么優(yōu)缺點(diǎn)堵幽? 1)狗超、快照(snapshots)優(yōu)點(diǎn):? ? RDB 是一個(gè)非常緊湊(compact)的文件,它保存了 Redis 在某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)集朴下。 這種文件非常適合用于進(jìn)行備份: 比如說(shuō)努咐,你可以在最近的 24 小時(shí)內(nèi),每小時(shí)備份一次 RDB 文件殴胧,并且在每個(gè)月的每一天麦撵,也備份一個(gè) RDB 文件。 這樣的話溃肪,即使遇上問(wèn)題免胃,也可以隨時(shí)將數(shù)據(jù)集還原到不同的版本。? ? RDB 非常適用于災(zāi)難恢復(fù)(disaster recovery):它只有一個(gè)文件惫撰,并且內(nèi)容都非常緊湊羔沙,可以(在加密后)將它傳送到別的數(shù)據(jù)中心,或者亞馬遜 S3 中厨钻。? ? RDB 可以最大化 Redis 的性能:父進(jìn)程在保存 RDB 文件時(shí)唯一要做的就是 fork 出一個(gè)子進(jìn)程扼雏,然后這個(gè)子進(jìn)程就會(huì)處理接下來(lái)的所有保存工作,父進(jìn)程無(wú)須執(zhí)行任何磁盤(pán) I/O 操作夯膀。? ? RDB 在恢復(fù)大數(shù)據(jù)集時(shí)的速度比 AOF 的恢復(fù)速度要快缺點(diǎn):? ? 如果你需要盡量避免在服務(wù)器故障時(shí)丟失數(shù)據(jù)诗充,那么 RDB 不適合你。 雖然 Redis 允許你設(shè)置不同的保存點(diǎn)(save point)來(lái)控制保存 RDB 文件的頻率诱建, 但是蝴蜓, 因?yàn)镽DB 文件需要保存整個(gè)數(shù)據(jù)集的狀態(tài), 所以它并不是一個(gè)輕松的操作俺猿。 因此你可能會(huì)至少 5 分鐘才保存一次 RDB 文件茎匠。 在這種情況下, 一旦發(fā)生故障停機(jī)押袍, 你就可能會(huì)丟失好幾分鐘的數(shù)據(jù)诵冒。? ? 每次保存 RDB 的時(shí)候,Redis 都要 fork() 出一個(gè)子進(jìn)程谊惭,并由子進(jìn)程來(lái)進(jìn)行實(shí)際的持久化工作汽馋。 在數(shù)據(jù)集比較龐大時(shí), fork()可能會(huì)非常耗時(shí)圈盔,造成服務(wù)器在某某毫秒內(nèi)停止處理客戶端豹芯; 如果數(shù)據(jù)集非常巨大,并且 CPU 時(shí)間非常緊張的話药磺,那么這種停止時(shí)間甚至可能會(huì)長(zhǎng)達(dá)整整一秒告组。 雖然 AOF 重寫(xiě)也需要進(jìn)行 fork() ,但無(wú)論 AOF 重寫(xiě)的執(zhí)行間隔有多長(zhǎng)癌佩,數(shù)據(jù)的耐久性都不會(huì)有任何損失木缝”阆牵 2)、AOF優(yōu)點(diǎn):? ? 使用 AOF 持久化會(huì)讓 Redis 變得非常耐久(much more durable):你可以設(shè)置不同的 fsync 策略我碟,比如無(wú) fsync 放案,每秒鐘一次 fsync ,或者每次執(zhí)行寫(xiě)入命令時(shí) fsync 矫俺。 AOF 的默認(rèn)策略為每秒鐘 fsync 一次吱殉,在這種配置下,Redis 仍然可以保持良好的性能厘托,并且就算發(fā)生故障停機(jī)友雳,也最多只會(huì)丟失一秒鐘的數(shù)據(jù)( fsync 會(huì)在后臺(tái)線程執(zhí)行,所以主線程可以繼續(xù)努力地處理命令請(qǐng)求)铅匹。? ? AOF 文件是一個(gè)只進(jìn)行追加操作的日志文件(append only log)押赊, 因此對(duì) AOF 文件的寫(xiě)入不需要進(jìn)行 seek , 即使日志因?yàn)槟承┰蚨宋磳?xiě)入完整的命令(比如寫(xiě)入時(shí)磁盤(pán)已滿包斑,寫(xiě)入中途停機(jī)流礁,等等), redis-check-aof 工具也可以輕易地修復(fù)這種問(wèn)題罗丰。? ? Redis 可以在 AOF 文件體積變得過(guò)大時(shí)神帅,自動(dòng)地在后臺(tái)對(duì) AOF 進(jìn)行重寫(xiě): 重寫(xiě)后的新 AOF 文件包含了恢復(fù)當(dāng)前數(shù)據(jù)集所需的最小命令集合。 整個(gè)重寫(xiě)操作是絕對(duì)安全的萌抵,因?yàn)?Redis 在創(chuàng)建新 AOF 文件的過(guò)程中找御,會(huì)繼續(xù)將命令追加到現(xiàn)有的 AOF 文件里面,即使重寫(xiě)過(guò)程中發(fā)生停機(jī)谜嫉,現(xiàn)有的 AOF 文件也不會(huì)丟失萎坷。 而一旦新 AOF 文件創(chuàng)建完畢凹联,Redis 就會(huì)從舊 AOF 文件切換到新 AOF 文件沐兰,并開(kāi)始對(duì)新 AOF 文件進(jìn)行追加操作。? ? AOF 文件有序地保存了對(duì)數(shù)據(jù)庫(kù)執(zhí)行的所有寫(xiě)入操作蔽挠, 這些寫(xiě)入操作以 Redis 協(xié)議的格式保存住闯, 因此 AOF 文件的內(nèi)容非常容易被人讀懂, 對(duì)文件進(jìn)行分析(parse)也很輕松澳淑。 導(dǎo)出(export) AOF 文件也非常簡(jiǎn)單: 舉個(gè)例子比原, 如果你不小心執(zhí)行了 FLUSHALL 命令, 但只要 AOF 文件未被重寫(xiě)杠巡, 那么只要停止服務(wù)器量窘, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重啟 Redis 氢拥, 就可以將數(shù)據(jù)集恢復(fù)到 FLUSHALL 執(zhí)行之前的狀態(tài)蚌铜。缺點(diǎn):? ? 對(duì)于相同的數(shù)據(jù)集來(lái)說(shuō)锨侯,AOF 文件的體積通常要大于 RDB 文件的體積。? ? 根據(jù)所使用的 fsync 策略冬殃,AOF 的速度可能會(huì)慢于 RDB 囚痴。 在一般情況下, 每秒 fsync 的性能依然非常高审葬, 而關(guān)閉 fsync 可以讓 AOF 的速度和 RDB 一樣快深滚, 即使在高負(fù)荷之下也是如此。 不過(guò)在處理巨大的寫(xiě)入載入時(shí)涣觉,RDB 可以提供更有保證的最大延遲時(shí)間(latency)痴荐。? ? AOF 在過(guò)去曾經(jīng)發(fā)生過(guò)這樣的 bug : 因?yàn)閭€(gè)別命令的原因,導(dǎo)致 AOF 文件在重新載入時(shí)官册,無(wú)法將數(shù)據(jù)集恢復(fù)成保存時(shí)的原樣蹬昌。 (舉個(gè)例子,阻塞命令 BRPOPLPUSH 就曾經(jīng)引起過(guò)這樣的 bug 攀隔。) 測(cè)試套件里為這種情況添加了測(cè)試: 它們會(huì)自動(dòng)生成隨機(jī)的皂贩、復(fù)雜的數(shù)據(jù)集, 并通過(guò)重新載入這些數(shù)據(jù)來(lái)確保一切正常昆汹。 雖然這種 bug 在 AOF 文件中并不常見(jiàn)明刷, 但是對(duì)比來(lái)說(shuō), RDB 幾乎是不可能出現(xiàn)這種 bug 的6满粗、mySQL里有2000w數(shù)據(jù)辈末,redis中只存20w的數(shù)據(jù),如何保證redis中的數(shù)據(jù)都是熱點(diǎn)數(shù)據(jù)映皆? redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時(shí)候挤聘,就會(huì)施行數(shù)據(jù)淘汰策略。redis 提供 6種數(shù)據(jù)淘汰策略:voltile-lru:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰volatile-ttl:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過(guò)期的數(shù)據(jù)淘汰volatile-random:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)7捅彻、請(qǐng)列舉5種以上redis 最適合的場(chǎng)景组去。(1)、會(huì)話緩存(Session Cache)(2)步淹、全頁(yè)緩存(FPC)(3)从隆、隊(duì)列(4),排行榜/計(jì)數(shù)器(5)缭裆、發(fā)布/訂閱8键闺、Memcache與Redis的區(qū)別都有哪些?1)澈驼、存儲(chǔ)方式Memecache把數(shù)據(jù)全部存在內(nèi)存之中辛燥,斷電后會(huì)掛掉,數(shù)據(jù)不能超過(guò)內(nèi)存大小。Redis有部份存在硬盤(pán)上挎塌,這樣能保證數(shù)據(jù)的持久性畅铭。2)、數(shù)據(jù)支持類型Memcache對(duì)數(shù)據(jù)類型支持相對(duì)簡(jiǎn)單勃蜘。Redis有復(fù)雜的數(shù)據(jù)類型硕噩。3)、使用底層模型不同它們之間底層實(shí)現(xiàn)方式 以及與客戶端之間通信的應(yīng)用協(xié)議不一樣缭贡。Redis直接自己構(gòu)建了VM 機(jī)制 炉擅,因?yàn)橐话愕南到y(tǒng)調(diào)用系統(tǒng)函數(shù)的話,會(huì)浪費(fèi)一定的時(shí)間去移動(dòng)和請(qǐng)求阳惹。4)谍失,value大小redis最大可以達(dá)到1GB,而memcache只有1MB9莹汤、簡(jiǎn)單的描述一下Memcache的工作原理快鱼。Memcached的神奇來(lái)自兩階段哈希(two-stage hash)。Memcached就像一個(gè)巨大的纲岭、存儲(chǔ)了很多對(duì)的哈希表抹竹。通過(guò)key,可以存儲(chǔ)或查詢?nèi)我獾臄?shù)據(jù)止潮。
客戶端可以把數(shù)據(jù)存儲(chǔ)在多臺(tái)memcached上窃判。當(dāng)查詢數(shù)據(jù)時(shí),客戶端首先參考節(jié)點(diǎn)列表計(jì)算出key的哈希值(階段一哈希)喇闸,進(jìn)而選中一個(gè)節(jié)點(diǎn)袄琳;客戶端將請(qǐng)求發(fā)送給選中的節(jié)點(diǎn),然后memcached節(jié)點(diǎn)通過(guò)一個(gè)內(nèi)部的哈希算法(階段二哈希)燃乍,查找真正的數(shù)據(jù)(item)唆樊。
舉個(gè)列子,假設(shè)有3個(gè)客戶端1, 2, 3刻蟹,3臺(tái)memcached A, B, C:
Client 1想把數(shù)據(jù)”barbaz”以key “foo”存儲(chǔ)逗旁。Client 1首先參考節(jié)點(diǎn)列表(A, B, C),計(jì)算key “foo”的哈希值座咆,假設(shè)memcached B被選中痢艺。接著,Client 1直接connect到memcached B介陶,通過(guò)key “foo”把數(shù)據(jù)”barbaz”存儲(chǔ)進(jìn)去∩ǎ Client 2使用與Client 1相同的客戶端庫(kù)(意味著階段一的哈希算法相同)哺呜,也擁有同樣的memcached列表(A, B, C)。
于是箕戳,經(jīng)過(guò)相同的哈希計(jì)算(階段一)某残,Client 2計(jì)算出key “foo”在memcached B上国撵,然后它直接請(qǐng)求memcached B,得到數(shù)據(jù)”barbaz”玻墅。
各種客戶端在memcached中數(shù)據(jù)的存儲(chǔ)形式是不同的(perl Storable, php serialize, java hibernate, JSON等)介牙。一些客戶端實(shí)現(xiàn)的哈希算法也不一樣。但是澳厢,memcached服務(wù)器端的行為總是一致的环础。
最后,從實(shí)現(xiàn)的角度看剩拢,memcached是一個(gè)非阻塞的线得、基于事件的服務(wù)器程序。這種架構(gòu)可以很好地解決C10K problem 徐伐,并具有極佳的可擴(kuò)展性贯钩。
可以參考A Story of Caching ,這篇文章簡(jiǎn)單解釋了客戶端與memcached是如何交互的办素。
10角雷、memcached的cache機(jī)制是怎樣的?
Memcached主要的cache機(jī)制是LRU(最近最少用)算法+超時(shí)失效性穿。
當(dāng)您存數(shù)據(jù)到memcached中谓罗,可以指定該數(shù)據(jù)在緩存中可以呆多久Which is forever, or some time in the future。
如果memcached的內(nèi)存不夠用了季二,過(guò)期的slabs會(huì)優(yōu)先被替換檩咱,接著就輪到最老的未被使用的slabs。
11胯舷、memcached最大能存儲(chǔ)多大的單個(gè)item刻蚯,為什么?
1MB桑嘶。如果你的數(shù)據(jù)大于1MB炊汹,可以考慮在客戶端壓縮或拆分到多個(gè)key中。
12逃顶、memcached最大的優(yōu)勢(shì)是什么讨便?
Memcached最大的好處就是它帶來(lái)了極佳的水平可擴(kuò)展性,特別是在一個(gè)巨大的系統(tǒng)中以政。由于客戶端自己做了一次哈希霸褒,那么我們很容易增加大量memcached到集群中。memcached之間沒(méi)有相互通信盈蛮,因此不會(huì)增加 memcached的負(fù)載废菱;沒(méi)有多播協(xié)議,不會(huì)網(wǎng)絡(luò)通信量爆炸(implode)。memcached的集群很好用殊轴。內(nèi)存不夠了衰倦?增加幾臺(tái) memcached吧;CPU不夠用了旁理?再增加幾臺(tái)吧樊零;有多余的內(nèi)存?在增加幾臺(tái)吧孽文,不要浪費(fèi)了驻襟。
基于memcached的基本原則,可以相當(dāng)輕松地構(gòu)建出不同類型的緩存架構(gòu)叛溢。除了這篇FAQ塑悼,在其他地方很容易找到詳細(xì)資料的。
看看下面的幾個(gè)問(wèn)題吧楷掉,它們?cè)趍emcached厢蒜、服務(wù)器的local cache和MySQL的query cache之間做了比較。這幾個(gè)問(wèn)題會(huì)讓您有更全面的認(rèn)識(shí)烹植。
13斑鸦、memcached能接受的key的最大長(zhǎng)度是多少?
key的最大長(zhǎng)度是250個(gè)字符草雕。
需要注意的是巷屿,250是memcached服務(wù)器端內(nèi)部的限制,如果您使用的客戶端支持”key的前綴”或類似特性墩虹,
那么key(前綴+原始key)的最大長(zhǎng)度是可以超過(guò)250個(gè)字符的嘱巾。
我們推薦使用使用較短的key,因?yàn)榭梢怨?jié)省內(nèi)存和帶寬诫钓。
14旬昭、memcached對(duì)item的過(guò)期時(shí)間有什么限制?為什么菌湃?
過(guò)期時(shí)間最大可以達(dá)到30天问拘。
memcached把傳入的過(guò)期時(shí)間(時(shí)間段)解釋成時(shí)間點(diǎn)后,一旦到了這個(gè)時(shí)間點(diǎn)惧所,memcached就把item置為失效狀態(tài)骤坐。
這是一個(gè)簡(jiǎn)單但obscure的機(jī)制。
九下愈、服務(wù)器架構(gòu)
1,假設(shè)給你5臺(tái)服務(wù)器纽绍,請(qǐng)大致的描述一下,如何使用你所熟悉的開(kāi)源軟件驰唬,搭建一個(gè)日PV300萬(wàn)左右的中型網(wǎng)站顶岸?
1臺(tái)做負(fù)載腔彰,2臺(tái)做應(yīng)用叫编,2臺(tái)做數(shù)據(jù)庫(kù)主從
十辖佣、其它
1:git的使用命令,例如:寫(xiě)出版本回退命令搓逾。
git reset --hard head^
2:git與svn的區(qū)別卷谈。
1) 最核心的區(qū)別Git是分布式的,而Svn不是分布的霞篡。
2) Git把內(nèi)容按元數(shù)據(jù)方式存儲(chǔ)世蔗,而SVN是按文件:
3) Git沒(méi)有一個(gè)全局版本號(hào),而SVN有:
4) Git的內(nèi)容的完整性要優(yōu)于SVN:
5) Git下載下來(lái)后朗兵,在OffLine狀態(tài)下可以看到所有的Log,SVN不可以污淋。
6) 分支合并git比svn列少出現(xiàn)錯(cuò)誤。
3:如何進(jìn)行多分支開(kāi)發(fā)余掖,包括多人開(kāi)發(fā)協(xié)同寸爆,分段測(cè)試,上線盐欺。
參考:GIT版本管理:Git Flow模型