版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、酒店預(yù)訂怎么實(shí)現(xiàn)?怎么設(shè)計(jì)表你好,我大約的說(shuō)下我們的業(yè)務(wù)流程,我們的業(yè)務(wù)流程是:用戶在網(wǎng)站瀏覽酒店信息,可以根據(jù)地區(qū)檢索出該地區(qū)的酒店信息。列表展示酒店的信息由:酒店的名稱,酒店圖片,酒店位置,評(píng)論人數(shù),評(píng)論分?jǐn)?shù)以及最低入住價(jià)格。用戶選中要入住的酒店進(jìn)入酒店詳情頁(yè)面,查看酒店的介紹以及酒店的房型列表,用戶根據(jù)他要入住的時(shí)間和離店的時(shí)間,檢索出這個(gè)時(shí)間段內(nèi)的所有可選房型(房間數(shù)量-當(dāng)天的訂單-當(dāng)天未離店訂單=剩余房間數(shù)量)顯示給用戶。用戶選擇好房型后就可以進(jìn)行下單,規(guī)定有訂單的開始時(shí)間,結(jié)束時(shí)間,房間數(shù)量,住客姓名,抵店時(shí)間,聯(lián)系方式,備注信息等等。那我的表是這么設(shè)計(jì)的,總共有6張表,分別是:用戶表user,里面有下面幾個(gè)字段,(用戶編號(hào),用戶名稱,用戶密碼,用戶聯(lián)系方式)酒店表hotel,里面有(酒店編號(hào),酒店名稱,酒店圖片,評(píng)論人數(shù),評(píng)論分?jǐn)?shù),最低入住價(jià)格,所在地區(qū))酒店圖片表pic(圖片編號(hào),圖片地址,圖片排序,圖片所屬酒店)評(píng)論表comment(評(píng)論編號(hào),評(píng)論內(nèi)容,評(píng)論時(shí)間,用戶編號(hào),酒店編號(hào))房型表house(房型編號(hào),床型,早餐,寬帶,人數(shù)上限,房?jī)r(jià),房間數(shù)量,最長(zhǎng)預(yù)定期間)訂單表order(訂單編號(hào),開始時(shí)間,結(jié)束時(shí)間,房間數(shù)量,住客姓名,最晚抵店時(shí)間,聯(lián)系電話,使用優(yōu)惠券,備注,訂單狀態(tài))以上就是我對(duì)這個(gè)酒店預(yù)訂系統(tǒng)的設(shè)計(jì)2、預(yù)定期間怎么寫入數(shù)據(jù)庫(kù)的以預(yù)訂當(dāng)時(shí)的時(shí)間戳作為預(yù)訂時(shí)間寫入數(shù)據(jù)庫(kù)。用戶下訂單時(shí)會(huì)選擇一個(gè)抵店時(shí)間,將該抵店時(shí)間以時(shí)間戳方式存入數(shù)據(jù)庫(kù)中。離店時(shí)間以當(dāng)時(shí)的日期轉(zhuǎn)為時(shí)間戳方式存入數(shù)據(jù)庫(kù)中3、怎么判斷尚有沒(méi)有房間我可以根據(jù)用戶的入住時(shí)間和離店時(shí)間來(lái)檢索這個(gè)有效時(shí)間段內(nèi)房間的庫(kù)存。房間數(shù)量扣除在這個(gè)時(shí)間段內(nèi)入住的訂單和在這個(gè)時(shí)間段內(nèi)離店的訂單??鄢蟮鹊降臄?shù)量才是這段時(shí)間內(nèi)有效房間數(shù)量。4、怎么記錄天天的房間庫(kù)存我的思緒是根據(jù)一個(gè)公式來(lái)推理實(shí)現(xiàn)的,天天房間的庫(kù)存=房型下房間數(shù)量-(當(dāng)天入住的訂單+當(dāng)天未離店的訂單),這樣我就可以得到天天尚有多少房間是剩余的了。5、怎么在數(shù)據(jù)庫(kù)里對(duì)房間做唯一標(biāo)記上面所設(shè)計(jì)的房型表就是我們的房間表,每個(gè)房間是唯一的,我們是使用數(shù)字作為編號(hào)的,也即使用主鍵作為唯一標(biāo)記。6、最近出的新功能最近我們出了個(gè)會(huì)員機(jī)制,客戶第一次預(yù)訂酒店成功后,可以辦理睬員卡,憑借會(huì)員卡,下次來(lái)的時(shí)候可以打折,會(huì)員在一些比較特殊的日期預(yù)訂酒店成功,可以享受不同樣的優(yōu)惠措施。怎么保證促銷商品不會(huì)超賣這個(gè)問(wèn)題是我們當(dāng)時(shí)開發(fā)時(shí)碰到的一個(gè)難點(diǎn),超賣的因素重要是下的訂單的數(shù)目和我們要促銷的商品的數(shù)目不一致導(dǎo)致的,每次總是訂單的數(shù)比我們的促銷商品的數(shù)目要多,當(dāng)時(shí)我們的小組討論了好久,給出了好幾個(gè)方案來(lái)實(shí)現(xiàn):第一種方案是:①在每次下訂單前我們判斷促銷商品的數(shù)量夠不夠,不夠不允許下訂單,更改庫(kù)存量時(shí)加上一個(gè)條件,只更改商品庫(kù)存大于0的商品的庫(kù)存,當(dāng)時(shí)我們使用ab進(jìn)行壓力測(cè)試,當(dāng)并發(fā)超過(guò)500,訪問(wèn)量超過(guò)2023時(shí),還是會(huì)出現(xiàn)超賣現(xiàn)象。所以被我們否認(rèn)了。第二種方案是:②使用mysql的事務(wù)加排他鎖來(lái)解決,一方面我們選擇數(shù)據(jù)庫(kù)的存儲(chǔ)引擎為innoDB,使用的是排他鎖實(shí)現(xiàn)的,剛開始的時(shí)候我們測(cè)試了下共享鎖,發(fā)現(xiàn)還是會(huì)出現(xiàn)超賣的現(xiàn)象。有個(gè)問(wèn)題是,當(dāng)我們進(jìn)行高并發(fā)測(cè)試時(shí),對(duì)數(shù)據(jù)庫(kù)的性能影響很大,導(dǎo)致數(shù)據(jù)庫(kù)的壓力很大,最終也被我們否認(rèn)了。第三種方案是:③使用文獻(xiàn)鎖實(shí)現(xiàn)。當(dāng)用戶搶到一件促銷商品后先觸發(fā)文獻(xiàn)鎖,防止其他用戶進(jìn)入,該用戶搶到促銷品后再解開文獻(xiàn)鎖,放其他用戶進(jìn)行操作。這樣可以解決超賣的問(wèn)題,但是會(huì)導(dǎo)致文獻(xiàn)得I/O開銷很大。最后我們使用了redis的隊(duì)列來(lái)實(shí)現(xiàn)。將要促銷的商品數(shù)量以隊(duì)列的方式存入redis中,每當(dāng)用戶搶到一件促銷商品則從隊(duì)列中刪除一個(gè)數(shù)據(jù),保證商品不會(huì)超賣。這個(gè)操作起來(lái)很方便,并且效率極高,最終我們采用這種方式來(lái)實(shí)現(xiàn)8、redis集群怎么做HYPERLINK""\o"Redis知識(shí)庫(kù)"\t""Redis集群提供了以下兩個(gè)好處??1、將數(shù)據(jù)自動(dòng)切分(split)到多個(gè)節(jié)點(diǎn)? 2、當(dāng)集群中的某一個(gè)節(jié)點(diǎn)故障時(shí),redis還可以繼續(xù)解決客戶端的請(qǐng)求。?2、集群的方案:redis-cluster集群,采用無(wú)中心結(jié)構(gòu),每個(gè)節(jié)點(diǎn)保存數(shù)據(jù)和整個(gè)集群狀態(tài),每個(gè)節(jié)點(diǎn)都和其他所有節(jié)點(diǎn)連接,重要通過(guò)節(jié)點(diǎn)的配置,輔以redis的主歷來(lái)完畢集群。由于這塊東西我使用得很少,所以只是平時(shí)抽時(shí)間去研究過(guò),并沒(méi)有真正的在線上實(shí)現(xiàn)過(guò)。9、redis和memcacahe、mongoDB的區(qū)別答:都是非關(guān)系型數(shù)據(jù)庫(kù),性能都非常高,但是mongoDB和memcache、redis是不同的兩種類型。后兩者重要用于數(shù)據(jù)的緩存,前者重要用在查詢和儲(chǔ)存大數(shù)據(jù)方面,是最接近數(shù)據(jù)庫(kù)的文檔型的非關(guān)系數(shù)據(jù)庫(kù)。這里我重要談?wù)刴emcache和redis的區(qū)別。①?gòu)臄?shù)據(jù)存儲(chǔ)位置上來(lái)分,memcache的數(shù)據(jù)存在內(nèi)存中,而redis既可以存儲(chǔ)在內(nèi)存中,也可以存儲(chǔ)的到磁盤中,達(dá)成持久化存儲(chǔ)的功能,memcache一旦斷電,數(shù)據(jù)所有丟失,redis可以運(yùn)用快照和AOF把數(shù)據(jù)存到磁盤中,當(dāng)恢復(fù)時(shí)又從磁盤中讀取到內(nèi)存中,當(dāng)物理內(nèi)存使用完畢后,可以把數(shù)據(jù)寫入到磁盤中。②從存儲(chǔ)數(shù)據(jù)的類型上來(lái)分,memcache和redis存儲(chǔ)的方式都是鍵值對(duì),只但是redis值的類型比較豐富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache重要存儲(chǔ)的是字符串。③從架構(gòu)層次來(lái)分,Redis支持master-slave(主—從)模式應(yīng)用,memcache支持分布式。④此外從存儲(chǔ)數(shù)據(jù)的大小上來(lái)分,Redis單個(gè)value的最大限制是1GB,memcached只能保存1MB的數(shù)據(jù)。但是Memcache在存儲(chǔ)100K以上的數(shù)據(jù),性能稍微好一點(diǎn)。⑤此外redis只支持單核,memcache可以支持多核,當(dāng)然關(guān)于redis取代memcache的說(shuō)法,在一般情況下,兩者性能都很高,在大多的業(yè)務(wù)場(chǎng)景選擇上,redis的選擇也許更加具有優(yōu)勢(shì),但也不能說(shuō)可以完全取代,最終還是取決于你的應(yīng)用場(chǎng)景。10、持久化redis有幾種方式?答:重要有兩種方式:①快照持久化在redis配置文獻(xiàn)中已經(jīng)自動(dòng)啟動(dòng)了,格式是:saveNM表達(dá)在N秒之內(nèi),redis至少發(fā)生M次修改則redis抓快照到磁盤。當(dāng)然我們也可以手動(dòng)執(zhí)行save或者bgsave(異步)命令來(lái)做快照②appendonlyfileAOF持久化總共有三種模式,如appendfsynceverysec默認(rèn)的是每秒強(qiáng)制寫入磁盤一次appendfsyncalways每次執(zhí)行寫操作的時(shí)候就強(qiáng)制寫入磁盤appendfsyncno完全取決于os,性能最佳但是持久化沒(méi)法保證其中第三種模式最佳。redis默認(rèn)的也是采用第三種模式。11、mysql存儲(chǔ)引擎答:常用的重要分為兩種,一種是innodb,一種是myisam,兩者的重要區(qū)別是①myisam不支持事務(wù)解決,而innoDB支持事務(wù)解決②myisam不支持外鍵,innoDB支持外鍵③myisam支持全文檢索,而innoDB在MySQL5.6版本之后才支持全文檢索④數(shù)據(jù)的存儲(chǔ)形式不同樣,mysiam表存放在三個(gè)文獻(xiàn):結(jié)構(gòu)、索引、數(shù)據(jù),innoDB存儲(chǔ)把結(jié)構(gòu)存儲(chǔ)為一個(gè)文獻(xiàn),索引和數(shù)據(jù)存儲(chǔ)為一個(gè)文獻(xiàn)⑤myisam在查詢和增長(zhǎng)數(shù)據(jù)性能更優(yōu)于innoDB,innoDB在批量刪除方面性能較高。⑥myisam支持表鎖,而innoDB支持行鎖12、sql注入是什么及如何防止sql注入?答:SQL注入襲擊指的是用戶或者黑客通過(guò)構(gòu)建特殊的輸入作為參數(shù)傳入我們的Web應(yīng)用程序端,而這些輸入大都是SQL語(yǔ)法里的一些組合,通過(guò)執(zhí)行SQL語(yǔ)句進(jìn)而執(zhí)行襲擊者所要的操作,其重要因素是程序員沒(méi)有細(xì)致地過(guò)濾用戶輸入的數(shù)據(jù),致使非法數(shù)據(jù)侵入系統(tǒng)而導(dǎo)致的。因此我們?cè)谧鲩_發(fā)過(guò)程中一定要防止sql注入,重要從兩方面著手:1、占位符的方式,就是對(duì)sql語(yǔ)句進(jìn)行預(yù)解決,然后執(zhí)行sql語(yǔ)句2、通過(guò)addslashes或者mysql_real_escape_string這兩個(gè)函數(shù)對(duì)用戶輸入的值進(jìn)行轉(zhuǎn)義解決,把一些特殊的字符轉(zhuǎn)義掉。13、有用過(guò)預(yù)解決么?答:用過(guò),PDO類中,有個(gè)prepare方法可以實(shí)現(xiàn)預(yù)解決,PDOStament類中的excute方法可以執(zhí)行預(yù)解決,預(yù)解決的參數(shù)分為兩種,一種是:字符串占位符,另一種是?占位符,:字符串占位符在執(zhí)行預(yù)解決傳遞參數(shù)時(shí)傳入的是關(guān)聯(lián)數(shù)組,而?占位符傳遞的是索引數(shù)組。兩者不能混合使用,但一般推薦使用:字符串占位符。14、用框架還用自己的解決嗎答:一般成熟的開源框架中都考慮到了數(shù)據(jù)安全這方面的東西,但有時(shí)候我們也許會(huì)使用一些原生的SQL語(yǔ)句時(shí),我們就需要考慮自己對(duì)sql語(yǔ)句進(jìn)行預(yù)解決。當(dāng)然有時(shí)候框架中的過(guò)濾方法我們不希望采用,比如使用文本編輯器時(shí),我們可以使用自己的過(guò)濾方式。15、mysql優(yōu)化怎么做的?答:mysql優(yōu)化重要從以下幾個(gè)方面來(lái)實(shí)現(xiàn):①設(shè)計(jì)角度:存儲(chǔ)引擎的選擇,字段類型選擇,范式②功能角度:可以運(yùn)用mysql自身的特性,如索引,查詢緩存,碎片整理,分區(qū)、分表等③sql語(yǔ)句的優(yōu)化方面:盡量簡(jiǎn)化查詢語(yǔ)句,能查詢字段少就盡量少查詢字段,優(yōu)化分頁(yè)語(yǔ)句、分組語(yǔ)句等。④部署大負(fù)載架構(gòu)體系:數(shù)據(jù)庫(kù)服務(wù)器單獨(dú)出來(lái),負(fù)載大時(shí)可以采用主從復(fù)制,讀寫分離機(jī)制進(jìn)行設(shè)計(jì)⑤從硬件上升級(jí)數(shù)據(jù)庫(kù)服務(wù)器。16、訂單表用是什么存儲(chǔ)引擎答:由于訂單表存在著事務(wù)的解決,比如下了訂單,商品的庫(kù)存就要減少,這里就涉及到了事務(wù),所以就用到innodb19、sql語(yǔ)句的優(yōu)化答:一方面我們得擬定哪些sql語(yǔ)句需要優(yōu)化,一般在一個(gè)系統(tǒng)中,查詢語(yǔ)句最多,所以我們重要是針對(duì)查詢語(yǔ)句進(jìn)行優(yōu)化。重要采用兩種方式來(lái)擬定要優(yōu)化的sql語(yǔ)句:①使用慢查詢?nèi)沼?設(shè)立需要優(yōu)化的sql語(yǔ)句的執(zhí)行時(shí)間,記錄下超過(guò)該設(shè)立時(shí)間的語(yǔ)句,即為需要優(yōu)化的語(yǔ)句。②使用profiling機(jī)制,記錄下每條sql語(yǔ)句的執(zhí)行時(shí)間,找出執(zhí)行較慢的語(yǔ)句,即為需要優(yōu)化的語(yǔ)句。我們重要通過(guò)給表字段添加索引的方式進(jìn)行優(yōu)化,加上索引后,sql語(yǔ)句的執(zhí)行時(shí)間顯著提高了,但并不是加上索引了這條sql語(yǔ)句就會(huì)用到索引,所以一方面看執(zhí)行慢的語(yǔ)句后面是否有加索引,我們可以使用explain或者desc加在要執(zhí)行的sql語(yǔ)句前,查看是否使用到索引。有幾個(gè)地方需要注意的是:①為了避免建議索引而導(dǎo)致索引文獻(xiàn)過(guò)大,有時(shí)候我們會(huì)使用復(fù)合索引,這時(shí)候要遵循最左原則。②like查詢,前%不會(huì)用到索引③假如條件中有or,則規(guī)定or的索引字段都必須有索引,否則不能用到索引。④假如列類型是字符串,一定要在條件中將數(shù)據(jù)使用引號(hào)引用起來(lái),否則不使用索引。⑤優(yōu)化groupby語(yǔ)句⑥盡量避免模糊匹配,這樣會(huì)導(dǎo)致全盤掃描21、索引有幾種歐4答:索引重要有:主鍵索引:數(shù)據(jù)記錄里面不能有null,數(shù)據(jù)內(nèi)容不能反復(fù),在一張表里面不能有多個(gè)主鍵索引。普通索引:使用字段關(guān)鍵字建立的索引,重要是提高查詢速度唯一索引:字段數(shù)據(jù)是唯一的,數(shù)據(jù)內(nèi)容里面能否為null,在一張表里面,是可以添加多個(gè)唯一索引。全文索引:在比較老的版本中,只有myisam引擎支持全文索引,在innodb5.6后引擎也支持全文索引,在mysql中全文索引不支持中文。我們一般使用sphinx集合coreseek來(lái)實(shí)現(xiàn)中文的全文索引。復(fù)合索引23、左前索引原則答:左前索引重要指的是在復(fù)合索引中,給兩個(gè)或多個(gè)字段建立了復(fù)合索引后,在sql語(yǔ)句后的條件中,只有復(fù)合索引前面的字段在條件的前面時(shí),該索引才起作用,比如創(chuàng)建了個(gè)復(fù)合索引index(a,b),在使用where或者orderby條件時(shí),假如只有條件b的,該索引不會(huì)生效,必須有條件a且必須要在條件b的前面該索引才會(huì)生效。24、分布式數(shù)據(jù)庫(kù)答:我所知道的分布式數(shù)據(jù)庫(kù)有memcache,重要是分布式的非關(guān)系型數(shù)據(jù)庫(kù),用于緩存解決。分布式是指將不同的業(yè)務(wù)分布在不同的地方。而集群指的是將幾臺(tái)服務(wù)器集中在一起,實(shí)現(xiàn)同一業(yè)務(wù)。?分布式中的每一個(gè)節(jié)點(diǎn),都可以做集群。而集群并不一定就是分布式的。舉例:就比如新浪網(wǎng),訪問(wèn)的人多了,他可以做一個(gè)群集,前面放一個(gè)響應(yīng)服務(wù)器,后面幾臺(tái)服務(wù)器完畢同一業(yè)務(wù),假如有業(yè)務(wù)訪問(wèn)的時(shí)候,響應(yīng)服務(wù)器看哪臺(tái)服務(wù)器的負(fù)載不是很重,就將給哪一臺(tái)去完畢。
而分布式,從窄意上理解,也跟集群差不多,但是它的組織比較松散,不像集群,有一個(gè)組織性,一臺(tái)服務(wù)器垮了,其它的服務(wù)器可以頂上來(lái)。memcache的應(yīng)用場(chǎng)景1、合用memcached的業(yè)務(wù)場(chǎng)景?1)假如網(wǎng)站包含了訪問(wèn)量很大的動(dòng)態(tài)網(wǎng)頁(yè),因而數(shù)據(jù)庫(kù)的負(fù)載將會(huì)很高。由于大部分?jǐn)?shù)據(jù)庫(kù)請(qǐng)求都是讀操作,那么memcached可以顯著地減小數(shù)據(jù)庫(kù)負(fù)載。2)運(yùn)用memcached可以緩存session數(shù)據(jù)、臨時(shí)數(shù)據(jù)以減少對(duì)他們的數(shù)據(jù)庫(kù)寫操作。4)緩存一些很小但是被頻繁訪問(wèn)的文獻(xiàn)。5)訪問(wèn)比較頻繁,安全性不高,丟失無(wú)所謂,修改比較頻繁的數(shù)據(jù),比如一些用戶的在線狀態(tài)2、不合用memcached的業(yè)務(wù)場(chǎng)景?1)緩存對(duì)象的大小大于1MBmemcache自身就不是為了解決龐大的多媒體(largemedia)和巨大的二進(jìn)制塊(streaminghugeblobs)而設(shè)計(jì)的。2)key的長(zhǎng)度大于250字符3)應(yīng)用運(yùn)營(yíng)在不安全的環(huán)境中4)業(yè)務(wù)自身需要的是持久化數(shù)據(jù)或者說(shuō)需要的應(yīng)當(dāng)是database25、nginx日記,怎么記錄每個(gè)ip的訪問(wèn)量(參考阿銘哥手冊(cè))stub_stat(yī)us模塊重要用于查看Nginx的一些狀態(tài)信息,例如記錄nginx的訪問(wèn)量,一方面我們得查看該模塊有沒(méi)有安裝,假如沒(méi)有安裝,得先安裝,安裝好后,修改nginx的配置文獻(xiàn),啟動(dòng)該模塊,然后就可以使用以下命令來(lái)進(jìn)行記錄,如:1.根據(jù)訪問(wèn)IP記錄UVawk'{print$1}'
access.log|sort|uniq-c|wc-l2.記錄訪問(wèn)URL記錄PVawk'{print$7}'access.log|wc-l3.查詢?cè)L問(wèn)最頻繁的URLawk'{print$7}'access.log|sort|uniq-c|sort-n-k1-r|more4.查詢?cè)L問(wèn)最頻繁的IPawk'{print$1}'access.log|sort|uniq-c|sort-n-k1-r|more記錄nginx日記中訪問(wèn)最多的100個(gè)ip及訪問(wèn)次數(shù)awk‘{print$1}’access.log|sort|uniq-c|sort-n-k1-r|head-n10026、http協(xié)議HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,由于其簡(jiǎn)捷、快速的方式,合用于分布式超媒體信息系統(tǒng)HTTP協(xié)議的重要特點(diǎn)可概括如下:? 1.支持客戶/服務(wù)器模式。? 2.簡(jiǎn)樸快速:客戶向服務(wù)器請(qǐng)求服務(wù)時(shí),只需傳送請(qǐng)求方法和途徑。請(qǐng)求方法常用 的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。由于HTTP 協(xié)議簡(jiǎn)樸,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度不久。? 3.靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對(duì)象。正在傳輸?shù)念愋陀蒀ontent-Type加 ?以標(biāo)記。? ?4.無(wú)連接:無(wú)連接的含義是限制每次連接只解決一個(gè)請(qǐng)求。服務(wù)器解決完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。? ?5.無(wú)狀態(tài):HTTP協(xié)議是無(wú)狀態(tài)協(xié)議。無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)解決沒(méi)有記憶能力。 缺少狀態(tài)意味著假如后續(xù)解決需要前面的信息,則它必須重傳,這樣也許導(dǎo)致每次 連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。27、cookie與session的區(qū)別?1、cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙
考慮到安全應(yīng)當(dāng)使用session。3、session會(huì)在一定期間內(nèi)保存在服務(wù)器上。當(dāng)訪問(wèn)增多,會(huì)比較占用你服務(wù)器的性能
考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE。4、單個(gè)cookie保存的數(shù)據(jù)不能超過(guò)4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。5、所以個(gè)人建議:?
將登陸信息等重要信息存放為SESSION?
其他信息假如需要保存,可以放在COOKIE中28、php在儲(chǔ)存session以什么形式存在 PHP為session的存儲(chǔ)提供了三種方式:文獻(xiàn)/內(nèi)存/自定義存儲(chǔ),默認(rèn)是使用文獻(xiàn)存儲(chǔ).在訪問(wèn)量大的網(wǎng)站上采用這種方式就不大合適,由于這樣會(huì)導(dǎo)致大量的輸入輸出的冗余.我們可以在php.ini更改配置文獻(xiàn)或者php腳本中通過(guò)相應(yīng)的函數(shù)來(lái)設(shè)立session文獻(xiàn)的存儲(chǔ)類型來(lái)改變session文獻(xiàn)的存儲(chǔ)形式29、xss襲擊怎么防止XSS又稱CSS,全稱CrossSiteScript(跨站腳本襲擊),XSS襲擊類似于SQL注入襲擊,是Web程序中常見(jiàn)的漏洞,XSS屬于被動(dòng)式且用于客戶端的襲擊方式,所以容易被忽略其危害性。其原理是襲擊者向有XSS漏洞的網(wǎng)站中輸入(傳入)惡意的HTML代碼,當(dāng)用戶瀏覽該網(wǎng)站時(shí),這段HTML代碼會(huì)自動(dòng)執(zhí)行,從而達(dá)成襲擊的目的。如,盜取用戶Cookie信息、破壞頁(yè)面結(jié)常見(jiàn)的惡意字符XSS輸入:1.XSS輸入通常包含JavaScript腳本,如彈出惡意警告框:<script>alert("XSS");</script>2.XSS輸入也也許是HTML代碼段,譬如:(1)網(wǎng)頁(yè)不斷地刷新<metahttp-equiv="refresh"content="0;">(2)嵌入其它網(wǎng)站的鏈接<iframesrc=http://xxxxwidth=250height=250></iframe>構(gòu)、重定向到其它網(wǎng)站等。方法:運(yùn)用phphtmlentities()函數(shù)php防止XSS跨站腳本襲擊的方法:是針對(duì)非法的HTML代碼涉及單雙引號(hào)等,使用htmlspecialchars()函數(shù)。在使用htmlspecialchars()函數(shù)的時(shí)候注意第二個(gè)參數(shù),直接用htmlspecialchars($string)的話,第二個(gè)參數(shù)默認(rèn)是ENT_COMPAT,函數(shù)默認(rèn)只是轉(zhuǎn)化雙引號(hào)("),不對(duì)單引號(hào)(')做轉(zhuǎn)義。所以,htmlspecialchars()函數(shù)更多的時(shí)候要加上第二個(gè)參數(shù),應(yīng)當(dāng)這樣用:htmlspecialchars($string,ENT_QUOTES)。當(dāng)然,假如需要不轉(zhuǎn)化如何的引號(hào),用htmlspecialchars($string,ENT_NOQUOTES)。此外,盡量少用htmlentities(),在所有英文的時(shí)候htmlentities()和htmlspecialchars()沒(méi)有區(qū)別,都可以達(dá)成目的。但是,中文情況下,htmlentities()卻會(huì)轉(zhuǎn)化所有的html代碼,連同里面的它無(wú)法辨認(rèn)的中文字符也給轉(zhuǎn)化了。htmlentities()和htmlspecialchars()這兩個(gè)函數(shù)對(duì)單引號(hào)(')之類的字符串支持不好,都不能轉(zhuǎn)化,所以用htmlentities()和htmlspecialchars()轉(zhuǎn)化的字符串只能防止XSS襲擊,不能防止SQL注入襲擊。所有有打印的語(yǔ)句如echo,print等,在打印前都要使用htmlentities()進(jìn)行過(guò)濾,這樣可以防止XSS,注意中文要寫出htmlentities($name,ENT_NOQUOTES,GB2312)。30、禁用cookie后,session還能用嗎?可以,在存儲(chǔ)session的文獻(xiàn)中,生成sessionI(lǐng)D,通過(guò)get傳參的方式將sessionID傳到要實(shí)現(xiàn)session共享的頁(yè)面,讀取sessionID,從而從session中獲取數(shù)據(jù)。31、mongodb基于什么開發(fā)的?MongoDB是一個(gè)基于分布式文獻(xiàn)存儲(chǔ)的數(shù)據(jù)庫(kù)。由C++語(yǔ)言編寫。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。32、mongodb是非范式還是范式?數(shù)據(jù)表達(dá)的方式有很多種,其中最重要的問(wèn)題之一就是在多大限度上對(duì)數(shù)據(jù)進(jìn)行范式化。范式化(normalization)是將數(shù)據(jù)分散到多個(gè)不同的集合,不同集合之間可以互相引用數(shù)據(jù)。雖然很多文檔可以引用某一塊數(shù)據(jù),但是這塊數(shù)據(jù)只存儲(chǔ)在一個(gè)集合中。所以,假如要修改這塊數(shù)據(jù),只需修改保存這塊數(shù)據(jù)的那一個(gè)文檔就行了。但是,MongoDB沒(méi)有提供連接(join)工具,所以在不同集合之間執(zhí)行連接查詢需要進(jìn)行多次查詢。反范式化(denormalizat(yī)ion)與范式化相反:將每個(gè)文檔所需的數(shù)據(jù)都嵌入在文檔內(nèi)部。每個(gè)文檔都擁有自己的數(shù)據(jù)副本,而不是所有文檔共同引用同一個(gè)數(shù)據(jù)副本。這意味著,假如信息發(fā)生了變化,那么所有相關(guān)文檔都需要進(jìn)行更新,但是在執(zhí)行查詢時(shí),只需要一次查詢,就可以得到所有數(shù)據(jù)。決定何時(shí)采用范式化何時(shí)采用反范式化時(shí)比較困難的。范式化可以提高數(shù)據(jù)寫入速度,反范式化可以提高數(shù)據(jù)讀取速度。需要根據(jù)自己應(yīng)用程序的十幾需要仔細(xì)權(quán)衡。33、mongodb與mysql區(qū)別MySQL是關(guān)系型數(shù)據(jù)庫(kù)。優(yōu)勢(shì):在不同的引擎上有不同的存儲(chǔ)方式。查詢語(yǔ)句是使用傳統(tǒng)的sql語(yǔ)句,擁有較為成熟的體系,成熟度很高。開源數(shù)據(jù)庫(kù)的份額在不斷增長(zhǎng),mysql的份額頁(yè)在連續(xù)增長(zhǎng)。缺陷:在海量數(shù)據(jù)解決的時(shí)候效率會(huì)顯著變慢。Mongodb是非關(guān)系型數(shù)據(jù)庫(kù)(nosql),屬于文檔型數(shù)據(jù)庫(kù)。文檔是mongoDB中數(shù)據(jù)的基本單元,類似關(guān)系數(shù)據(jù)庫(kù)的行,多個(gè)鍵值對(duì)有序地放置在一起便是文檔,語(yǔ)法有點(diǎn)類似javascript面向?qū)ο蟮牟樵冋Z(yǔ)言,它是一個(gè)面向集合的,模式自由的文檔型數(shù)據(jù)庫(kù)。存儲(chǔ)方式:虛擬內(nèi)存+持久化。查詢語(yǔ)句:是獨(dú)特的Mongodb的查詢方式。適合場(chǎng)景:事件的記錄,內(nèi)容管理或者博客平臺(tái)等等。架構(gòu)特點(diǎn):可以通過(guò)副本集,以及分片來(lái)實(shí)現(xiàn)高可用。數(shù)據(jù)解決:數(shù)據(jù)是存儲(chǔ)在硬盤上的,只但是需要經(jīng)常讀取的數(shù)據(jù)會(huì)被加載到內(nèi)存中,將數(shù)據(jù)存儲(chǔ)在物理內(nèi)存中,從而達(dá)成高速讀寫。成熟度與廣泛度:新興數(shù)據(jù)庫(kù),成熟度較低,Nosql數(shù)據(jù)庫(kù)中最為接近關(guān)系型數(shù)據(jù)庫(kù),比較完善的DB之一,合用人群不斷在增長(zhǎng)。優(yōu)點(diǎn):快速!在適量級(jí)的內(nèi)存的Mongodb的性能是非常迅速的,它將熱數(shù)據(jù)存儲(chǔ)在物理內(nèi)存中,使得熱數(shù)據(jù)的讀寫變得十分快。高擴(kuò)展性,存儲(chǔ)的數(shù)據(jù)格式是json格式!缺陷:不支持事務(wù),并且開發(fā)文檔不是很完全,完善。Mysql和Mongodb重要應(yīng)用場(chǎng)景(簡(jiǎn)樸了解敘述下即可)1.假如需要將mongodb作為后端db來(lái)代替mysql使用,即這里mysql與mongodb屬于平行級(jí)別,那么,這樣的使用也許有以下幾種情況的考量:(1)mongodb所負(fù)責(zé)部分以文檔形式存儲(chǔ),可以有較好的代碼親和性,json格式的直接寫入方便。(如日記之類)(2)從dat(yī)amodels設(shè)計(jì)階段就將原子性考慮于其中,無(wú)需事務(wù)之類的輔助。開發(fā)用如nodejs之類的語(yǔ)言來(lái)進(jìn)行開發(fā),對(duì)開發(fā)比較方便。(3)mongodb自身的failover機(jī)制,無(wú)需使用如MHA之類的方式實(shí)現(xiàn)。2.將mongodb作為類似redis,memcache來(lái)做緩存db,為mysql提供服務(wù),或是后端日記收集分析??紤]到mongodb屬于nosql型數(shù)據(jù)庫(kù),sql語(yǔ)句與數(shù)據(jù)結(jié)構(gòu)不如mysql那么親和,也會(huì)有很多時(shí)候?qū)ⅲ恚飊godb做為輔助mysql而使用的類redismemcache之類的緩存db來(lái)使用。亦或是僅作日記收集分析。34、寫一個(gè)函數(shù)記錄每一個(gè)元素出現(xiàn)的次數(shù) PHP中的array_count_values()函數(shù)可以實(shí)現(xiàn)array_count_values()函數(shù)用于記錄數(shù)組中所有值出現(xiàn)的次數(shù)。本函數(shù)返回一個(gè)數(shù)組,其元素的鍵名是原數(shù)組的值,鍵值是該值在原數(shù)組中出現(xiàn)的次數(shù)。35、手寫排序重要從原理方面來(lái)說(shuō):重點(diǎn)介紹冒泡排序和選擇排序 //冒泡排序function
BubbleSort($arr)
{
//
獲得數(shù)組總長(zhǎng)度
$num
=
count($arr);
//
正向遍歷數(shù)組
for
($i
=
1;
$i
<
$num;
$i++)
{
//
反向遍歷
for
($j
=
$num
-
1;
$j
>=
$i
;
$j--)
{
//
相鄰兩個(gè)數(shù)比較
if
($arr[$j]
<
$arr[$j-1])
{
//
暫存較小的數(shù)
$iTemp
=
$arr[$j-1];
//
把較大的放前面
$arr[$j-1]
=
$arr[$j];
//
較小的放后面
$arr[$j]
=
$iTemp;
}
}
}
return
$arr;}//互換法排序function
ExchangeSort($arr){
$num
=
count($arr);
//
遍歷數(shù)組
for
($i
=
0;$i
<
$num
-
1;
$i++)
{
//
獲得當(dāng)前索引的下一個(gè)索引
for
($j
=
$i
+
1;
$j
<
$num;
$j++)
{
//
比較相鄰兩個(gè)的值大小
if
($arr[$j]
<
$arr[$i])
{
//
暫存較小的數(shù)
$iTemp
=
$arr[$i];
//
把較大的放前面
$arr[$i]
=
$arr[$j];
//
較小的放后面
$arr[$j]
=
$iTemp;
}
}
}
return
$arr;}//選擇法排序function
SelectSort($arr)
{
//
獲得數(shù)組總長(zhǎng)度
$num
=
count($arr);
//
遍歷數(shù)組
for
($i
=
0;$i
<
$num-1;
$i++)
{
//
暫存當(dāng)前值
$iTemp
=
$arr[$i];
//
暫存當(dāng)前位置
$iPos
=
$i;
//
遍歷當(dāng)前位置以后的數(shù)據(jù)
for
($j
=
$i
+
1;$j
<
$num;
$j++){
//
假如有小于當(dāng)前值的
if
($arr[$j]
<
$iTemp)
{
//
暫存最小值
$iTemp
=
$arr[$j];
//
暫存位置
$iPos
=
$j;
}
}
//
把當(dāng)前值放到算好的位置
$arr[$iPos]
=
$arr[$i];
//
把當(dāng)前值換成算好的值
$arr[$i]
=
$iTemp;
}
return
$arr;}//插入法排序function
InsertSort($arr){
$num
=
count($arr);
//
遍歷數(shù)組
for
($i
=
1;$i
<
$num;
$i++)
{
//
獲得當(dāng)前值
$iTemp
=
$arr[$i];
//
獲得當(dāng)前值的前一個(gè)位置
$iPos
=
$i
-
1;
//
假如當(dāng)前值小于前一個(gè)值切未到數(shù)組開始位置
while
(($iPos
>=
0)
&&
($iTemp
<
$arr[$iPos]))
{
//
把前一個(gè)的值往后放一位
$arr[$iPos
+
1]
=
$arr[$iPos];
//
位置遞減
$iPos--;
}
$arr[$iPos+1]
=
$iTemp;
}
return
$arr;}//快速排序function
QuickSort($arr){
$num
=
count($arr);
$l
=
$r
=
0;
$left
=
$right
=
array();
//
從索引的第二個(gè)開始遍歷數(shù)組
for
($i
=
1;$i
<
$num;
$i++)
{
//
假如值小于索引1
if
($arr[$i]
<
$arr[0])
{
//
裝入左索引數(shù)組(小于索引1的數(shù)據(jù))
$left[]
=
$arr[$i];
$l++;
}
else
{
//
否則裝入右索引中(大于索引1的數(shù)據(jù))
$right[]
=
$arr[$i];
$r++;
//
}
}
//
假如左索引有值
則對(duì)左索引排序
if($l
>
1)
{
$left
=
QuickSort($left);
}
//
排序后的數(shù)組
$new_arr
=
$left;
//
將當(dāng)前數(shù)組第一個(gè)放到最后
$new_arr[]
=
$arr[0];
//
假如又索引有值
則對(duì)右索引排序
if
($r
>
1)
{
$right
=
QuickSort($right);
}
//
根據(jù)右索引的長(zhǎng)度再次增長(zhǎng)數(shù)據(jù)
for($i
=
0;$i
<
$r;
$i++)
{
$new_arr[]
=
$right[$i];
}
return
$new_arr;}36、設(shè)計(jì)模式在PHP中,我重要使用了以下兩種設(shè)計(jì)模式1、單例模式單例模式顧名思義,就是只有一個(gè)實(shí)例。作為對(duì)象的創(chuàng)建模式,單例模式保證某一個(gè)類只有一個(gè)實(shí)例,并且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。單例模式的要點(diǎn)有三個(gè):一是某個(gè)類只能有一個(gè)實(shí)例;二是它必須自行創(chuàng)建這個(gè)實(shí)例;三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。典型的代表如框架中的基類對(duì)象。2、簡(jiǎn)樸工廠模式①抽象基類:類中定義抽象一些方法,用以在子類中實(shí)現(xiàn)②繼承自抽象基類的子類:實(shí)現(xiàn)基類中的抽象方法③工廠類:用以實(shí)例化所有相相應(yīng)的子類這種我們使用最常見(jiàn),基本所有的MVC框架中都是這樣產(chǎn)生的。37、用過(guò)什么PHP框架在開發(fā)過(guò)程中,我重要使用過(guò)了這么幾種框架。thinkPHP框架、CI框架,laravel框架和yii框架。我接觸到的第一個(gè)框架是TP框架,我簡(jiǎn)樸的說(shuō)下我對(duì)這幾個(gè)框架的見(jiàn)解:ThinkPHP框架優(yōu)點(diǎn):TP借鑒了Java思想,基于PHP5,充足運(yùn)用了PHP5的特性,部署簡(jiǎn)樸只需一個(gè)入口文獻(xiàn),一切搞定,簡(jiǎn)樸高效,中文文檔齊全,入門超級(jí)簡(jiǎn)樸。自帶模板引擎,具有獨(dú)特的數(shù)據(jù)驗(yàn)證和自動(dòng)填充功能,框架更新速度比較迅速。缺陷:一個(gè)Model中可以操作多個(gè)表,但TP只能一個(gè)。?TP默認(rèn)初始化了很多配置,使用起來(lái)很方便,但自然也會(huì)影響效率。但是把一些加載配置的時(shí)間拿去研究算法,這些小影響近乎可以忽略了。CodeIgniter框架優(yōu)點(diǎn):配置簡(jiǎn)樸,上手不久,所有的配置使用PHP腳本來(lái)配置,沒(méi)有使用很多太復(fù)雜的設(shè)計(jì)模式,執(zhí)行性能和代碼可讀性上都不錯(cuò),執(zhí)行效率比較高,具有基本的MVC功能.快速簡(jiǎn)潔,代碼量少,框架簡(jiǎn)樸,容易上手,自帶了很多簡(jiǎn)樸好用的library,框架適合中小型項(xiàng)目,大型項(xiàng)目也不是不可以,只是擴(kuò)展能力稍差。缺陷:1.把Model層簡(jiǎn)樸的理解為數(shù)據(jù)庫(kù)操作2.PHP框架略顯簡(jiǎn)樸,只可以滿足小型應(yīng)用,略微不太可以滿足中型應(yīng)用需要laravel框架(目前最新的是5.3,規(guī)定PHP版本較高5.6)?優(yōu)點(diǎn):1.Laravel注重代碼的模塊化和可擴(kuò)展性。2.artisan:命令行工具,很多手動(dòng)的工作都自動(dòng)了3.可繼承的模版,簡(jiǎn)化view的開發(fā)和管理Laravel一直是PHP開發(fā)者最受歡迎的PHP框架。這是一個(gè)年輕的框架,但是擁有優(yōu)雅的語(yǔ)法,可簡(jiǎn)樸快速開發(fā)你的應(yīng)用。它擁有大多數(shù)常見(jiàn)的功能,如:路由,身份驗(yàn)證,會(huì)話,隊(duì)列和緩存。缺陷:laravel的中英文文檔比較少demo也比較少有時(shí)候一個(gè)功能要試好久甚至要看源碼YII框架(目前是2.0版本)優(yōu)點(diǎn):1、快速,靈敏,不拖沓,給程序員飛翔的能力;2、有g(shù)ii功能!(創(chuàng)建控制器,model層,crud等操作);3、具有高度的可重用性和可擴(kuò)展性,是純粹的面向?qū)ο蟮?。開發(fā)速度快,完備的文檔,可重用性可高擴(kuò)展,是最高效的開發(fā)框架之一。缺陷:1、對(duì)Model層的指導(dǎo)和考慮較少2、文檔實(shí)例較少3、英文太多4、規(guī)定PHP技術(shù)精通,OOP編程要純熟?。?、規(guī)定會(huì)bootstrap38、代碼管理工具我使用過(guò)的版本控制工具有兩種:初期的時(shí)候使用的是SVN,現(xiàn)在重要使用git,我就我個(gè)人的觀點(diǎn),簡(jiǎn)樸的說(shuō)下兩者的區(qū)別:1.Git是分布式的,SVN是集中式的,好處是跟其他同事不會(huì)有太多的沖突,自己寫的代碼放在自己電腦上,一段時(shí)間后再提交、合并,也可以不用聯(lián)網(wǎng)在本地提交;2.Git下載下來(lái)后,在本地不必聯(lián)網(wǎng)就可以看到所有的log,很方便學(xué)習(xí),SVN卻需要聯(lián)網(wǎng);3.Git鼓勵(lì)分Branch(分支),而SVN,說(shuō)實(shí)話,我用Branch的次數(shù)還挺少的,SVN自帶的Branchmerge我還真沒(méi)用過(guò),有merge時(shí)用的是BeyondCompare工具合并后再Commit的;4.SVN在Commit前,我們都建議是先Update一下,跟本地的代碼并確編譯沒(méi)問(wèn)題,保開發(fā)的功能正常后再提交SVN
的重要功能
SVN屬于集中化的版本控制系統(tǒng),有個(gè)不太精確的比方:SVN=
版本控制+
備份服務(wù)器
SVN使用起來(lái)有點(diǎn)像是檔案?jìng)}庫(kù)的感覺(jué),支持并行讀寫文獻(xiàn),支持代碼的版本化管理,功能涉及取出、導(dǎo)入、更新、分支、改名、還原、合并等。
功能有許多我就不一一列了,SVN大都采用圖形界面操作,直觀,上手快。Git的重要功能
Git是一個(gè)分布式版本控制系統(tǒng),操作命令涉及:clone,pull,push,branch,merge,rebas,Git擅長(zhǎng)的是程序代碼的版本化管理。SVN
的優(yōu)缺陷
SVN對(duì)中文支持好,操作簡(jiǎn)樸,使用沒(méi)有難度,美工人員,產(chǎn)品人員,測(cè)試人員,實(shí)行人員都可輕松上手。使用界面統(tǒng)一,功能完善,操作方便。Git的優(yōu)缺陷
對(duì)程序源代碼進(jìn)行差異化的版本管理,代碼庫(kù)占很少的空間。易于代碼的分支化管理。不支持中文,圖形界面支持差,使用難度大。不易推廣。SVN
和
Git
哪個(gè)更合用于項(xiàng)目管理?
SVN更合用于項(xiàng)目管理,
Git僅合用于代碼管理。
一個(gè)研發(fā)隊(duì)伍的成員正常涉及:需求分析、設(shè)計(jì)、美工、程序員、測(cè)試、實(shí)行、運(yùn)維,每個(gè)成員在工作中都有產(chǎn)出物,
涉及了文檔、設(shè)計(jì)代碼、程序代碼,這些都需要按項(xiàng)目集中進(jìn)行管理的。SVN能清楚的按目錄進(jìn)行分類管理,使項(xiàng)目組的管理處在有序高效的狀態(tài)?,F(xiàn)在越來(lái)越多人使用git做為版本控制工具,我以前的公司也是使用git.39、手寫單例模式怎么寫三私一公。classExample{//保存例實(shí)例在此屬性中privatestatic$_instance;
//構(gòu)造函數(shù)聲明為privat(yī)e,防止直接創(chuàng)建對(duì)象privatefunction__construct(){echo'IamConstruceted';}
//單例方法publicstaticfunctionsingleton(){if(?。閟set(self::$_instance)){$c=__CLASS__;self::$_instance=new$c;}returnself::$_instance;}
//阻止用戶復(fù)制對(duì)象實(shí)例publicfunction__clone(){trigger_error('Cloneisnotallow',E_USER_ERROR);}
functiontest(){echo("test");
}}
//這個(gè)寫法會(huì)犯錯(cuò),由于構(gòu)造方法被聲明為private$test=newExample;
//下面將得到Example類的單例對(duì)象$test=Example::singleton();$test->test();
//復(fù)制對(duì)象將導(dǎo)致一個(gè)E_USER_ERROR.$test_clone=clone$test;?>40、nosql和Mysql的區(qū)別也即非關(guān)系型數(shù)據(jù)庫(kù)和關(guān)系型數(shù)據(jù)庫(kù)。目前世界上主流的存儲(chǔ)系統(tǒng)大部分還是采用了關(guān)系型數(shù)據(jù)庫(kù),其重要有一下優(yōu)點(diǎn):1.事務(wù)解決—保持?jǐn)?shù)據(jù)的一致性;2.由于以標(biāo)準(zhǔn)化為前提,數(shù)據(jù)更新的開銷很小(相同的字段基本上只有一處);3.可以進(jìn)行Join等復(fù)雜查詢。nosql在優(yōu)勢(shì)方面,重要體現(xiàn)在下面這三點(diǎn):
?1.簡(jiǎn)樸的擴(kuò)展:典型例子是Cassandra,由于其架構(gòu)是類似于經(jīng)典的P2P,所以能通過(guò)輕松地添加新的節(jié)點(diǎn)來(lái)擴(kuò)展這個(gè)集群;
?2.快速的讀寫:重要例子有Redis,由于其邏輯簡(jiǎn)樸,并且純內(nèi)存操作,使得其性能非常杰出,單節(jié)點(diǎn)每秒可以解決超過(guò)10萬(wàn)次讀寫操作;
?3.低廉的成本:這是大多數(shù)分布式數(shù)據(jù)庫(kù)共有的特點(diǎn),由于重要都是開源軟件,沒(méi)有昂貴的License成本;
?4.
?但瑕不掩瑜,NoSQL數(shù)據(jù)庫(kù)還存在著很多的局限性,常見(jiàn)重要有下面這幾個(gè):
?1.不提供對(duì)SQL的支持:假如不支持SQL這樣的工業(yè)標(biāo)準(zhǔn),將會(huì)對(duì)用戶產(chǎn)生一定的學(xué)習(xí)和應(yīng)用遷移成本;
2.支持的特性不夠豐富:現(xiàn)有產(chǎn)品所提供的功能都比較有限,大多數(shù)NoSQL數(shù)據(jù)庫(kù)都不支持事務(wù),也不像SQLServer和HYPERLINK""\o"Oracle知識(shí)庫(kù)"Oracle那樣能提供各種附加功能,比如BI和報(bào)表等;
?3.現(xiàn)有產(chǎn)品的不夠成熟:大多數(shù)產(chǎn)品都還處在初創(chuàng)期,和關(guān)系型數(shù)據(jù)庫(kù)幾十年的完善不可同日而語(yǔ);
41、在TP中M方法與D方法的區(qū)別雖然都是實(shí)例化模型對(duì)象,兩者還是有區(qū)別的D和M的區(qū)別重要在于M方法不需要?jiǎng)?chuàng)建模型類文獻(xiàn),M方法不會(huì)讀取模型類,所以默認(rèn)情況下自動(dòng)驗(yàn)證是無(wú)效的,但是可以通過(guò)動(dòng)態(tài)賦值的方式實(shí)現(xiàn)而D方法必須有創(chuàng)建模型類。我們可以用下面兩種方法去創(chuàng)建一個(gè)數(shù)據(jù)表的映射對(duì)象第一種:$Test=D(‘Test’)第二種:$Test=newModel(‘Test’)雖然這兩種都可以對(duì)數(shù)據(jù)進(jìn)行select,insert,delete,udpate操作,在數(shù)據(jù)驗(yàn)證上有很大的不同,用第一種方式實(shí)例一個(gè)模型就會(huì)有數(shù)據(jù)檢查功能,假如title沒(méi)有填寫的話就會(huì)提醒“請(qǐng)輸入標(biāo)題”(這個(gè)是tp提供的一個(gè)自動(dòng)驗(yàn)證功能,當(dāng)然也需要在相應(yīng)的model中定義好驗(yàn)證條件);假如用第二種就沒(méi)有了這個(gè)數(shù)據(jù)驗(yàn)證功能,需要手動(dòng)驗(yàn)證。D函數(shù)實(shí)例化的是你當(dāng)前項(xiàng)目的Lib/Model下面的模塊。
假如該模塊不存在的話,直接返回實(shí)例化Model的對(duì)象(意義就與M()函數(shù)相同)。
而M只返回,實(shí)例化Model的對(duì)象。它的$name參數(shù)作為HYPERLINK""\o"MySQL知識(shí)庫(kù)"\t""數(shù)據(jù)庫(kù)的表名來(lái)解決對(duì)數(shù)據(jù)庫(kù)的操作。42、對(duì)網(wǎng)站大訪問(wèn)量的優(yōu)化方案提高訪問(wèn)速度。從硬件,最佳從網(wǎng)站程序等等方面考慮。我給出以下幾種方案:1.盡量使用靜態(tài)頁(yè),不要老使用動(dòng)態(tài)信息調(diào)用。非常容易出問(wèn)題
2.圖片內(nèi)容與網(wǎng)站數(shù)據(jù)盡量放在同一個(gè)服務(wù)器或者機(jī)房?jī)?nèi)。大量外鏈圖片是會(huì)有問(wèn)題的
3.一次又一次,一遍又一遍的分析流量走向,然后縮短瀏覽者瀏覽距離,舉個(gè)例子,瀏覽者假如現(xiàn)在在你網(wǎng)站看一個(gè)新聞需要點(diǎn)5次鼠標(biāo),你就要縮短這個(gè)點(diǎn)擊數(shù)。
4.一次又一次,一遍又一遍的分析,修改你的網(wǎng)站HYPERLINK""\t""數(shù)據(jù)庫(kù)結(jié)構(gòu),使其更加簡(jiǎn)潔。?5.提高網(wǎng)站的安防能力?6.買個(gè)好服務(wù)器,托管在一個(gè)好的機(jī)房!43、HYPERLINK""網(wǎng)站高并發(fā)大流量訪問(wèn)的解決及解決方法第一:確認(rèn)服務(wù)器硬件是否足夠支持當(dāng)前的流量。
普通的P4服務(wù)器一般最多能支持天天10萬(wàn)獨(dú)立IP,假如訪問(wèn)量比這個(gè)還要大,那么必須一方面配置一臺(tái)更高性能的專用服務(wù)器才干解決問(wèn)題,否則怎么優(yōu)化都不也許徹底解決性能問(wèn)題。
第二:優(yōu)化數(shù)據(jù)庫(kù)訪問(wèn)?前臺(tái)實(shí)現(xiàn)完全的靜態(tài)化當(dāng)然最佳,可以完全不用訪問(wèn)數(shù)據(jù)庫(kù),但是對(duì)于頻繁更新的網(wǎng)站,靜態(tài)化往往不能滿足某些功能。?緩存就是另一個(gè)解決方案,就是將動(dòng)態(tài)數(shù)據(jù)存儲(chǔ)到緩存文獻(xiàn)中,動(dòng)態(tài)網(wǎng)頁(yè)直接調(diào)用這些文獻(xiàn),而不必再訪問(wèn)數(shù)據(jù)庫(kù),技術(shù)假如的確無(wú)法避免對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),那么可以嘗試優(yōu)化數(shù)據(jù)庫(kù)的查詢SQL.避免使用Select*from這樣的語(yǔ)句,每次查詢只返回自己需要的結(jié)果,避免短時(shí)間內(nèi)的大量SQL查詢。最佳在相同字段進(jìn)行比較操作,在建立好的索引字段上盡量減少函數(shù)操作,假如要做到極致的話需要代碼的優(yōu)化;?第三,嚴(yán)禁外部的盜鏈。
外部網(wǎng)站的或者文獻(xiàn)盜鏈往往會(huì)帶來(lái)大量的負(fù)載壓力,因此應(yīng)當(dāng)嚴(yán)格限制外部對(duì)于自身的圖片或者文獻(xiàn)盜鏈,好在目前可以簡(jiǎn)樸地通過(guò)refer來(lái)控制盜鏈,自己就可以通過(guò)配置來(lái)嚴(yán)禁盜鏈。當(dāng)然,偽造refer也可以通過(guò)來(lái)實(shí)現(xiàn)盜鏈,但是目前蓄意偽造refer盜鏈的還不多,可以先不去考慮,或者使用非技術(shù)手段來(lái)解決,比如在圖片上增長(zhǎng)水印。
第四,控制大文獻(xiàn)的下載。
大文獻(xiàn)的下載會(huì)占用很大的流量,并且對(duì)于非SCSI硬盤來(lái)說(shuō),大量文獻(xiàn)下載會(huì)消耗CPU,使得網(wǎng)站響應(yīng)能力下降。因此,盡量不要提供超過(guò)2M的大文獻(xiàn)下載,假如需要提供,建議將大文獻(xiàn)放在此外一臺(tái)服務(wù)器上。
第五,使用不同主機(jī)分流重要流量?將文獻(xiàn)放在不同的主機(jī)上,提供不同的鏡像供用戶下載。比如假如覺(jué)得RSS文獻(xiàn)占用流量大,那么使用FeedBurner或者FeedSky等服務(wù)將RSS輸出放在其他主機(jī)上,這樣別人訪問(wèn)的流量壓力就大多集中在FeedBurner的主機(jī)上,RSS就不占用太多資源了。?第六,使用流量分析記錄軟件。
在網(wǎng)站上一個(gè)流量分析記錄軟件,可以即時(shí)知道哪些地方花費(fèi)了大量流量,哪些頁(yè)面需要再進(jìn)行優(yōu)化,因此,解決流量問(wèn)題還需要進(jìn)行精確的記錄分析才可以。我推薦使用的流量分析記錄軟件是Analytics(Google分析)。45、重要運(yùn)用到哪些緩存一、數(shù)據(jù)緩存這里所說(shuō)的數(shù)據(jù)緩存是指數(shù)據(jù)庫(kù)查詢緩存,每次訪問(wèn)頁(yè)面的時(shí)候,都會(huì)先檢測(cè)相應(yīng)的緩存數(shù)據(jù)是否存在,假如不存在,就連接數(shù)據(jù)庫(kù),得到數(shù)據(jù),并把查詢結(jié)果序列化后保存到文獻(xiàn)中,以后同樣的查詢結(jié)果就直接從緩存表或文獻(xiàn)中獲得。用的最廣的例子看Discuz的搜索功能,把結(jié)果ID緩存到一個(gè)表中,下次搜索相同關(guān)鍵字時(shí)先搜索緩存表。?舉個(gè)常用的方法,多表關(guān)聯(lián)的時(shí)候,把附表中的內(nèi)容生成數(shù)組保存到主表的一個(gè)字段中,需要的時(shí)候數(shù)組分解一下,這樣的好處是只讀一個(gè)表,壞處就是兩個(gè)數(shù)據(jù)同步會(huì)多不少環(huán)節(jié),數(shù)據(jù)庫(kù)永遠(yuǎn)是瓶頸,用硬盤換速度,是這個(gè)的關(guān)鍵點(diǎn)。二、頁(yè)面緩存每次訪問(wèn)頁(yè)面的時(shí)候,都會(huì)先檢測(cè)相應(yīng)的緩存頁(yè)面文獻(xiàn)是否存在,假如不存在,就連接數(shù)據(jù)庫(kù),得到數(shù)據(jù),顯示頁(yè)面并同時(shí)生成緩存頁(yè)面文獻(xiàn),這樣下次訪問(wèn)的時(shí)候頁(yè)面文獻(xiàn)就發(fā)揮作用了。(模板引擎和網(wǎng)上常見(jiàn)的一些緩存類通常有此功能)。三、時(shí)間觸發(fā)緩存檢查文獻(xiàn)是否存在并且時(shí)間戳小于設(shè)立的過(guò)期時(shí)間,假如文獻(xiàn)修改的時(shí)間戳比當(dāng)前時(shí)間戳減去過(guò)期時(shí)間戳大,那么就用緩存,否則更新緩存。四、內(nèi)容觸發(fā)緩存當(dāng)插入數(shù)據(jù)或更新數(shù)據(jù)時(shí),強(qiáng)制更新緩存。五、靜態(tài)緩存這里所說(shuō)的靜態(tài)緩存是指靜態(tài)化,直接生成HTML或XML等文本文獻(xiàn),有更新的時(shí)候重生成一次,適合于不太變化的頁(yè)面,這就不說(shuō)了。
六、內(nèi)存緩存
Memcached是高性能的,分布式的內(nèi)存對(duì)象緩存系統(tǒng),用于在動(dòng)態(tài)應(yīng)用中減少數(shù)據(jù)庫(kù)負(fù)載,提高訪問(wèn)速度。redis也可以做到。46、php的設(shè)計(jì)模式1、單例模式 2、工廠模式 3、觀測(cè)者模式?4、命令鏈模式 5、策略模式?單例模式:一個(gè)類在整個(gè)應(yīng)用中,只有一個(gè)對(duì)象實(shí)例的設(shè)計(jì)模式類必須自行創(chuàng)建這個(gè)實(shí)例必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例三私:私有靜態(tài)成員變量、構(gòu)造函數(shù)、克隆函數(shù)一公:公共的靜態(tài)方法??2、工廠模式可以根據(jù)輸入的參數(shù)或者應(yīng)用程序配置的不同一創(chuàng)建一種專門用來(lái)實(shí)例化并返回其它類的實(shí)例的類3、觀測(cè)者模式觀測(cè)者模式提供了組件之間緊密耦合的另一種方法。該模式:一個(gè)對(duì)象通過(guò)添加一個(gè)方法(該方法允許另一個(gè)對(duì)象,即觀測(cè)者注冊(cè)自己)全自身變得可觀測(cè)。當(dāng)可觀測(cè)的對(duì)象更改時(shí),它會(huì)將消息發(fā)送到已注冊(cè)的觀測(cè)者。這些觀測(cè)者使用該信息執(zhí)行的操作與可觀測(cè)的對(duì)象無(wú)關(guān)。4、命令鏈模式:以松散耦合主題為基礎(chǔ),發(fā)送消息、命令和請(qǐng)求,或通過(guò)一組解決程序發(fā)送任意內(nèi)容。每個(gè)解決程序都會(huì)自行判斷自己能否解決請(qǐng)求,假如可以,該請(qǐng)求被解決,進(jìn)程停止。5、策略模式:此算法是從復(fù)雜類提取的,因而可以方便地替換。47.Mysql事務(wù)的特性事務(wù)是作為一個(gè)邏輯單元執(zhí)行的一系列操作,一個(gè)邏輯工作單元必須有四個(gè)屬性,稱為HYPERLINK""\t"_blank"ACID(原子性、一致性、隔離性和持久性)屬性,只有這樣才干成為一個(gè)事務(wù):?原子性
事務(wù)必須是原子工作單元;對(duì)于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。?一致性?事務(wù)在完畢時(shí),必須使所有的數(shù)據(jù)都保持一致?tīng)顟B(tài)。在相關(guān)數(shù)據(jù)庫(kù)中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。?事務(wù)結(jié)束時(shí),所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如B樹索引或雙向鏈表)都必須是對(duì)的的。?隔離性?由并發(fā)事務(wù)所作的修改必須與任何其它并發(fā)事務(wù)所作的修改隔離。事務(wù)查看數(shù)據(jù)時(shí)數(shù)據(jù)所處的狀態(tài),要么是另一并發(fā)事務(wù)修改它之前的狀態(tài),
要么是另一事務(wù)修改它之后的狀態(tài),事務(wù)不會(huì)查看中間狀態(tài)的數(shù)據(jù)。這稱為可串行性,由于它可以重新裝載起始數(shù)據(jù),
并且重播一系列事務(wù),以使數(shù)據(jù)結(jié)束時(shí)的狀態(tài)與原始事務(wù)執(zhí)行的狀態(tài)相同。持久性?事務(wù)完畢之后,它對(duì)于系統(tǒng)的影響是永久性的。該修改即使出現(xiàn)系統(tǒng)故障也將一直保持。begin開始一個(gè)事務(wù)rollback事務(wù)回滾commit事務(wù)確認(rèn)48、Mysql事務(wù)的應(yīng)運(yùn)場(chǎng)景事務(wù)解決在各種管理系統(tǒng)中都有著廣泛的應(yīng)用,比如人員管理系統(tǒng),很多同步數(shù)據(jù)庫(kù)操作大都需要用到事務(wù)解決。比如說(shuō),在人員管理系統(tǒng)中,你刪除一個(gè)人員,你即需要?jiǎng)h除人員的基本資料,也要?jiǎng)h除和該人員相關(guān)的信息,如信箱,文章等等,這樣,這些數(shù)據(jù)庫(kù)操作語(yǔ)句就構(gòu)成一個(gè)事務(wù)!比如手機(jī)充值過(guò)程,支付寶金額減少,相應(yīng)的手機(jī)話費(fèi)增長(zhǎng),只要有一個(gè)操作不成功,則此外一個(gè)操作也不會(huì)成功49.Include和require的區(qū)別require函數(shù)通常放在PHP程序的最前面,在PHP程序執(zhí)行之前,就會(huì)先讀取require指定引入的文獻(xiàn),使它變成PHP程序網(wǎng)頁(yè)的一部分。include函數(shù)一般是放在流程控制的解決部分中。PHP程序在讀到include的文獻(xiàn)時(shí),才將它讀進(jìn)來(lái),這種方式可以把程序執(zhí)行時(shí)的流程簡(jiǎn)樸化。他們兩個(gè)的用途是同樣的,不一定非要哪個(gè)放在最前面哪個(gè)放在中間,他們最主線的區(qū)別在于錯(cuò)誤解決的方式不同樣。require一個(gè)文獻(xiàn)存在錯(cuò)誤的話,那么程序就會(huì)中斷執(zhí)行,并顯示致命錯(cuò)誤而include一個(gè)文獻(xiàn)存在錯(cuò)誤的話,那么程序不會(huì)中斷,會(huì)繼續(xù)執(zhí)行,并顯示一個(gè)警告的錯(cuò)誤其它區(qū)別:include有返回值,而require沒(méi)有。50、索引的建立與使用索引就是類似書的目錄,提高檢索數(shù)據(jù)的效率。索引是系統(tǒng)按照某個(gè)具體的算法(哈希,散列,二叉樹),將數(shù)據(jù)從所有數(shù)據(jù)里進(jìn)行提取,維護(hù)成一個(gè)索引文獻(xiàn),然后系統(tǒng)在進(jìn)行數(shù)據(jù)查詢的時(shí)候,發(fā)現(xiàn)假如查詢條件剛好滿足索引條件,就可以從索引文獻(xiàn)中快速的定位的數(shù)據(jù)所在位置。mysql中有以下幾種索引:主鍵索引(primarykey效率最高的索引)唯一索引(uniquekey):不為空的情況下效率最高普通索引(index)對(duì)數(shù)據(jù)沒(méi)有規(guī)定,文獻(xiàn)很大,效率比較低全文索引(fulltext),對(duì)整個(gè)文章內(nèi)部進(jìn)行關(guān)鍵字索引(mysql5.5以后InnoDB支持全文索引) 英文的全文索引很簡(jiǎn)樸:英文單詞默認(rèn)是用空格分離的?中文的全文索引很難:中文的詞組成很麻煩,需要運(yùn)用分詞工具(sphinx)索引可以在創(chuàng)建表的同時(shí)創(chuàng)建索引,也可以在修改表結(jié)構(gòu)時(shí)添加索引,索引重要是加在經(jīng)常做為查詢條件的字段上,可以使用相應(yīng)的手段來(lái)檢測(cè)所執(zhí)行的sql語(yǔ)句中是否使用到了索引。51.正則匹配表達(dá)式各個(gè)符文表達(dá)的意義\?將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、或一個(gè)原義字符、或一個(gè)向后引用、或一個(gè)八進(jìn)制轉(zhuǎn)義符。例如,’n’匹配字符“n”?!痋n’匹配一個(gè)換行符。序列‘\\’匹配“\”而“\(”則匹配“(”。^?匹配輸入字符串的開始位置。假如設(shè)立了RegExp對(duì)象的Multiline屬性,^也匹配‘\n’或‘\r’之后的位置?!?匹配輸入字符串的結(jié)束位置。假如設(shè)立了RegExp對(duì)象的Multiline屬性,$也匹配‘\n’或‘\r’之前的位置。* 匹配前面的子表達(dá)式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等價(jià)于{0,}。+ 匹配前面的子表達(dá)式一次或多次。例如,’zo+’能匹配“zo”以及“zoo”,但不能匹配“z”。+等價(jià)于{1,}。? 匹配前面的子表達(dá)式零次或一次。例如,”do(es)?”可以匹配“do”或“does”中的”do”。?等價(jià)于{0,1}。{n}?n是一個(gè)非負(fù)整數(shù)。匹配擬定的n次。{n,}?n是一個(gè)非負(fù)整數(shù)。至少匹配n次。{n,m} m和n均為非負(fù)整數(shù),其中n<=m。最少匹配n次且最多匹配m次。.?匹配除“\n”之外的任何單個(gè)字符。要匹配涉及‘\n’在內(nèi)的任何字符,請(qǐng)使用象‘[.\n]’的模式。x|y 匹配x或y。[xyz]?字符集合。匹配所包含的任意一個(gè)字符。例如,‘[abc]’可以匹配“plain”中的‘a’。[^xyz]?負(fù)值字符集合。匹配未包含的任意字符。例如,‘[^abc]’可以匹配“plain”中的’p'。[a-z]?字符范圍。匹配指定范圍內(nèi)的任意字符。例如,’[a-z]’可以匹配‘a(chǎn)’到‘z’范圍內(nèi)的任意小寫字母字符。[^a-z] 負(fù)值字符范圍。匹配任何不在指定范圍內(nèi)的任意字符。例如,’[^a-z]’可以匹配任何不在‘a(chǎn)’到‘z’范圍內(nèi)的任意字符。\b 匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。例如,‘er\b’可以匹配”never”中的‘er’,但不能匹配“verb”中的‘er’。\d?匹配一個(gè)數(shù)字字符。等價(jià)于[0-9]。\D 匹配一個(gè)非數(shù)字字符。等價(jià)于[^0-9]。\f?匹配一個(gè)換頁(yè)符。等價(jià)于\x0c和\cL。\n 匹配一個(gè)換行符。等價(jià)于\x0a和\cJ。\r?匹配一個(gè)回車符。等價(jià)于\x0d和\cM。\s?匹配任何空白字符,涉及空格、制表符、換頁(yè)符等等。等價(jià)于[\f\n\r\t\v]。\S?匹配任何非空白字符。等價(jià)于[^\f\n\r\t\v]。\t?匹配一個(gè)制表符。等價(jià)于\x09和\cI。\v 匹配一個(gè)垂直制表符。等價(jià)于\x0b和\cK。\w 匹配涉及下劃線的任何單詞字符。等價(jià)于’[A-Za-z0-9_]’。\W 匹配任何非單詞字符。等價(jià)于‘[^A-Za-z0-9_]’。52.PHP的變量類型四種標(biāo)量類型:boolean(布爾型):這是最簡(jiǎn)樸的類型,只有兩種取值,可認(rèn)為TRUE/true或FALSE/false,不區(qū)分大小寫。具體請(qǐng)查看:PHP布爾類型(boolean)integer(整型):在32位操作系統(tǒng)中它的有效范圍是:-2147483648~+2147483647。整型值可以使用十進(jìn)制,十六進(jìn)制或八進(jìn)制表達(dá),前面可以加上可選的符號(hào)(-或者+)。八進(jìn)制表達(dá)數(shù)字前必須加上0(零),十六進(jìn)制表達(dá)數(shù)字前必須加上0x。float(浮點(diǎn)型,也稱作double)string(字符串):字符型變量不同于其他編程語(yǔ)言有字符與字符串之分,在PHP中,統(tǒng)一使用字符型變量來(lái)定義字符或者字符串。兩種復(fù)合類型:array(數(shù)組):數(shù)組型變量是一種比較特殊的變量類型,將在后續(xù)章節(jié)中具體說(shuō)明。object(對(duì)象):對(duì)象也是一種特殊的數(shù)據(jù)類型。要?jiǎng)?chuàng)建object變量,請(qǐng)使用new關(guān)鍵字。具體請(qǐng)查看:PHP對(duì)象類型(object)最后是兩種特殊類型:resource(資源):源是一種特殊變量,保存了到外部資源的一個(gè)引用。資源是通過(guò)專門的函數(shù)來(lái)建立和使用的。詳情請(qǐng)查看:PHP資源類型(resource)NULL(NULL):表達(dá)一個(gè)變量沒(méi)有值。NULL類型唯一也許的值就是NULL。54.商城秒殺的實(shí)現(xiàn)搶購(gòu)、秒殺是如今很常見(jiàn)的一個(gè)應(yīng)用場(chǎng)景,重要需要解決的問(wèn)題有兩個(gè):
1高并發(fā)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生的壓力?2競(jìng)爭(zhēng)狀態(tài)下如何解決庫(kù)存的對(duì)的減少("超賣"問(wèn)題)?對(duì)于第一個(gè)問(wèn)題,已經(jīng)很容易想到用緩存來(lái)解決搶購(gòu),避免直接操作數(shù)據(jù)庫(kù),例如使用Redis。第二個(gè)問(wèn)題,我們可以使用redis隊(duì)列來(lái)完畢,把要秒殺的商品放入到隊(duì)列中,由于pop操作是原子的,即使有很多用戶同時(shí)到達(dá),也是依次執(zhí)行,文獻(xiàn)鎖和事務(wù)在高并發(fā)下性能下降不久,當(dāng)然還要考慮其他方面的東西,比如搶購(gòu)頁(yè)面做成靜態(tài)的,通過(guò)ajax調(diào)用接口,其中也也許會(huì)出現(xiàn)一個(gè)用戶搶多次的情況,這時(shí)候需要再加上一個(gè)排隊(duì)隊(duì)列和搶購(gòu)結(jié)果隊(duì)列及庫(kù)存隊(duì)列。高并發(fā)情況下,將用戶進(jìn)入排隊(duì)隊(duì)列,用一個(gè)線程循環(huán)解決從排隊(duì)隊(duì)列取出一個(gè)用戶,判斷用戶是否已在搶購(gòu)結(jié)果隊(duì)列,假如在,則已搶購(gòu),否則未搶購(gòu),庫(kù)存減1,寫HYPERLINK""\o"MySQL知識(shí)庫(kù)"數(shù)據(jù)庫(kù),將用戶入結(jié)果隊(duì)列。55.購(gòu)物車的原理購(gòu)物車相稱于現(xiàn)實(shí)中超市的購(gòu)物車,不同的是一個(gè)是實(shí)體車,一個(gè)是虛擬車而已。用戶可以在購(gòu)物網(wǎng)站的不同頁(yè)面之間跳轉(zhuǎn),以選購(gòu)自己愛(ài)慕的商品,點(diǎn)擊購(gòu)買時(shí),該商品就自動(dòng)保存到你的購(gòu)物車中,反復(fù)選購(gòu)后,最后將選中的所有商品放在購(gòu)物車中統(tǒng)一到付款臺(tái)結(jié)賬,這也是盡量讓客戶體驗(yàn)到現(xiàn)實(shí)生活中購(gòu)物的感覺(jué)。服務(wù)器通過(guò)追蹤每個(gè)用戶的行動(dòng),以保證在結(jié)賬時(shí)每件商品都物有其主。重要涉及以下幾點(diǎn):1、把商品添加到購(gòu)物車,即訂購(gòu)2、刪除購(gòu)物車中已定購(gòu)的商品3、修改購(gòu)物車中某一本圖書的訂購(gòu)數(shù)量4、清空購(gòu)物車5、顯示購(gòu)物車中商品清單及數(shù)量、價(jià)格實(shí)現(xiàn)購(gòu)物車的關(guān)鍵在于服務(wù)器辨認(rèn)每一個(gè)用戶并維持與他們的聯(lián)系。但是HTTP協(xié)議是一種“無(wú)狀態(tài)(Stateless)”的協(xié)議,因而服務(wù)器不能記住是誰(shuí)在購(gòu)買商品,當(dāng)把商品加入購(gòu)物車時(shí),服務(wù)器也不知道購(gòu)物車?yán)镌扔行┦裁?,使得用戶在不同?yè)面間跳轉(zhuǎn)時(shí)購(gòu)物車無(wú)法“隨身攜帶”,這都給購(gòu)物車的實(shí)現(xiàn)導(dǎo)致了一定的困難。目前購(gòu)物車的實(shí)現(xiàn)重要是通過(guò)cookie、session或結(jié)合數(shù)據(jù)庫(kù)的方式。下面分析一下它們的機(jī)制及作用。1.cookiecookie是由服務(wù)器產(chǎn)生,存儲(chǔ)在客戶端的一段信息。它定義了一種Web服務(wù)器在客戶端存儲(chǔ)和返回信息的機(jī)制,cookie文獻(xiàn)它包含域、途徑、生存期、和由服務(wù)器設(shè)立的變量值等內(nèi)容。當(dāng)用戶以后訪問(wèn)同一個(gè)Web服務(wù)器時(shí),瀏覽器會(huì)把cookie原樣發(fā)送給服務(wù)器。通過(guò)讓服務(wù)器讀取原先保存到客戶端的信息,網(wǎng)站可認(rèn)為瀏覽者提供一系列的方便,例如在線交易過(guò)程中標(biāo)記用戶身份、安全規(guī)定不高的場(chǎng)合避免用戶反復(fù)輸入名字和密碼、門戶網(wǎng)站的主頁(yè)定制、有針對(duì)性地投放廣告等等。運(yùn)用cookie的特性,大大擴(kuò)展了WEB應(yīng)用程序的功能,不僅可以建立服務(wù)器與客戶機(jī)的聯(lián)系,由于cookie可以由服務(wù)器定制,因此還可以將購(gòu)物信息生成cookie值存放在客戶端,從而實(shí)現(xiàn)購(gòu)物車的功能。用基于cookie的方式實(shí)現(xiàn)服務(wù)器與瀏覽器之間的會(huì)話或購(gòu)物車,有以下特點(diǎn):1、cookie存儲(chǔ)在客戶端,且占用很少的資源,瀏覽器允許存放300個(gè)cookie,每個(gè)cookie的大小為4KB,足以滿足購(gòu)物車的規(guī)定,同時(shí)也減輕了服務(wù)器的負(fù)荷;2、cookie為瀏覽器所內(nèi)置,使用方便。即使用戶不小心關(guān)閉了瀏覽器窗口,只要在cookie定義的有效期內(nèi),購(gòu)物車中的信息也不會(huì)丟失;3、cookie不是可執(zhí)行文獻(xiàn),所以不會(huì)以任何方式執(zhí)行,因此也不會(huì)帶來(lái)病毒或襲擊用戶的系統(tǒng);4、基于cookie的購(gòu)物車規(guī)定用戶瀏覽器必須支持并設(shè)立為啟用cookie,否則購(gòu)物車則失效;5、存在著關(guān)于cookie侵犯訪問(wèn)者隱私權(quán)的爭(zhēng)論,因此有些用戶會(huì)嚴(yán)禁本機(jī)的cookie功能。2.sessionsession是實(shí)現(xiàn)購(gòu)物車的另一種方法。session提供了可以保存和跟蹤用戶的狀態(tài)信息的功能,使當(dāng)前用戶在session中定義的變量和對(duì)象能在頁(yè)面之間共享,但是不能為應(yīng)用中其他用戶所訪問(wèn),它與cookie最重大的區(qū)別是,session將用戶在會(huì)話期間的私有信息存儲(chǔ)在服務(wù)器端,提高了安全性。在服務(wù)器生成session后,客戶端會(huì)生成一個(gè)sessionid辨認(rèn)號(hào)保存在客戶端,以保持和服務(wù)器的同步。這個(gè)sessionid是只讀的,假如客戶端嚴(yán)禁cookie功能,session會(huì)通過(guò)在URL中附加參數(shù),或隱含在表單中提交等其他方式在頁(yè)面間傳送。因此運(yùn)用session實(shí)行對(duì)用戶的管理則更為安全、有效。同樣,運(yùn)用session也能實(shí)現(xiàn)購(gòu)物車,這種方式的特點(diǎn)是:1、session用新的機(jī)制保持與客戶端的同步,不依賴于客戶端設(shè)立;2、與cookie相比,session是存儲(chǔ)在服務(wù)器端的信息,因此顯得更為安全,因此可將身份標(biāo)示,購(gòu)物等信息存儲(chǔ)在session中;3、session會(huì)占用服務(wù)器資源,加大服務(wù)器端的負(fù)載,特別當(dāng)并發(fā)用戶很多時(shí),會(huì)生成大量的session,影響服務(wù)器的性能;4、由于session存儲(chǔ)的信息更敏感,并且是以文獻(xiàn)形式保存在服務(wù)器中,因此仍然存在著安全隱患。3.結(jié)合數(shù)據(jù)庫(kù)的方式這也是目前較普遍的模式,在這種方式中,數(shù)據(jù)庫(kù)承擔(dān)著存儲(chǔ)購(gòu)物信息的作用,session或cookie則用來(lái)跟蹤用戶。這種方式具有以下特點(diǎn):1、數(shù)據(jù)庫(kù)與cookie分別負(fù)責(zé)記錄數(shù)據(jù)和維持會(huì)話,能發(fā)揮各自的優(yōu)勢(shì),使安全性和服務(wù)器性能都得到了提高;2、每一個(gè)購(gòu)物的行為,都要直接建立與數(shù)據(jù)庫(kù)的連接,直至對(duì)表的操作完畢后,連接才釋放。當(dāng)并發(fā)用戶很多時(shí),會(huì)影響數(shù)據(jù)庫(kù)的性能,因此,這對(duì)數(shù)據(jù)庫(kù)的性能提出了更高的規(guī)定;3、使cookie維持會(huì)話有賴客戶端的支持。各種方式的選擇:雖然cookie可用來(lái)實(shí)現(xiàn)購(gòu)物車,但必須獲得瀏覽器的支持,再加上它是存儲(chǔ)在客戶端的信息,極易被獲取,所以這也限制了它存儲(chǔ)更多,更重要的信息。所以一般cookie只用來(lái)維持與服務(wù)器的會(huì)話,例如國(guó)內(nèi)最大的當(dāng)當(dāng)網(wǎng)絡(luò)書店就是用cookie保持與客戶的聯(lián)系,但是這種方式最大的缺陷是假如客戶端不支持cookie就會(huì)使購(gòu)物車失效。Session能很好地與交易雙方保持會(huì)話,可以忽視客戶端的設(shè)立。在購(gòu)物車技術(shù)中得到了廣泛的應(yīng)用。但session的文獻(xiàn)屬性使其仍然留有安全隱患。結(jié)合數(shù)據(jù)庫(kù)的方式雖然在一定限度上解決了上述的問(wèn)題,但從上面的例子可以看出:在這種購(gòu)物流程中涉及到對(duì)數(shù)據(jù)庫(kù)表的頻繁操作,特別是用戶每選購(gòu)一次商品,都要與數(shù)據(jù)庫(kù)進(jìn)行連接,當(dāng)用戶很多的時(shí)候就加大了服務(wù)器與數(shù)據(jù)庫(kù)的負(fù)荷。56.redis消息隊(duì)列先進(jìn)先出需要注意什么通常使用一個(gè)list來(lái)實(shí)現(xiàn)隊(duì)列操作,這樣有一個(gè)小限制,所以的任務(wù)統(tǒng)一都是先進(jìn)先出,假如想優(yōu)先解決某個(gè)任務(wù)就不太好解決了,這就需要讓隊(duì)列有優(yōu)先級(jí)的概念,我們就可以優(yōu)先解決高級(jí)別的任務(wù),實(shí)現(xiàn)方式有以下幾種方式:1)單一列表實(shí)現(xiàn):隊(duì)列正常的操作是左進(jìn)右出(lpush,rpop)為了先解決高優(yōu)先級(jí)任務(wù),在碰到高級(jí)別任務(wù)時(shí),可以直接插隊(duì),直接放入隊(duì)列頭部(rpush),這樣,從隊(duì)列頭部(右側(cè))獲取任務(wù)時(shí),取到的就是高優(yōu)先級(jí)的任務(wù)(rpop)2)使用兩個(gè)隊(duì)列,一個(gè)普通隊(duì)列,一個(gè)高級(jí)隊(duì)列,針對(duì)任務(wù)的級(jí)別放入不同的隊(duì)列,獲取任務(wù)時(shí)也很簡(jiǎn)樸,redis的BRPOP命令可以按順序從多個(gè)隊(duì)列中取值,BRPOP會(huì)按照給出的key順序查看,并在找到的第一個(gè)非空list的尾部彈出一個(gè)元素,redis>BRPOPlist1list20?
list1做為高優(yōu)先級(jí)任務(wù)隊(duì)列?list2做為普通任務(wù)隊(duì)列這樣就實(shí)現(xiàn)了先解決高優(yōu)先級(jí)任務(wù),當(dāng)沒(méi)有高優(yōu)先級(jí)任務(wù)時(shí),就去獲取普通任務(wù)方式1最簡(jiǎn)樸,但實(shí)際應(yīng)用比較局限,方式3可以實(shí)現(xiàn)復(fù)雜優(yōu)先級(jí),但實(shí)現(xiàn)比較復(fù)雜,不利于維護(hù)
方式2是推薦用法,實(shí)際應(yīng)用最為合適57、你負(fù)責(zé)的模塊有哪些難題在我負(fù)責(zé)的B2B電商項(xiàng)目中,當(dāng)時(shí)我負(fù)責(zé)的是訂單模塊,由于客戶一次選擇了多家商戶的商品,最終生成了一個(gè)訂單,這樣我們平臺(tái)在給商戶結(jié)算時(shí)出現(xiàn)了不知道這比費(fèi)用應(yīng)當(dāng)給哪個(gè)商戶,這時(shí)候我們小組通過(guò)討論,需要涉及到訂單拆分,也就是說(shuō)用戶點(diǎn)擊支付后,假如有多件商品,并且不是同一家店鋪那么就要用到訂單的拆分,比如假如有兩件商品,并且不是同一店鋪就在本來(lái)的訂單號(hào)下在生成兩個(gè)子訂單號(hào)并修改訂單表中兩件商品的訂單號(hào)。最終實(shí)現(xiàn)了商品的分派管理,解決了我們的難題。我覺(jué)得在開發(fā)過(guò)程中,碰到的難題無(wú)非是兩個(gè),一個(gè)是技術(shù)層次的,我認(rèn)為,只要你有恒心,有熱心,沒(méi)有覺(jué)得不了的難題。另一個(gè)就是溝通問(wèn)題,在任何地方任何時(shí)候溝通都是最重要的,特別是我們做開發(fā)的,不溝通好,會(huì)影響整個(gè)項(xiàng)目的進(jìn)度,我本人是個(gè)非常還溝通的人,所以這點(diǎn)上也沒(méi)多大問(wèn)題。58、用戶下單是怎么解決的判斷用戶有沒(méi)有登錄,在沒(méi)有登錄的情況下,不允許下單。登陸后,可進(jìn)行下單并生成唯一的訂單號(hào),此時(shí)訂單的狀態(tài)為未支付。59、電商的登錄是怎么登錄的分為普通登錄和第三方登錄這邊重要說(shuō)一下第三方登錄吧,第三方登陸重要使用的是author協(xié)議,我就以QQ的第三方登陸為例來(lái)進(jìn)行說(shuō)明:當(dāng)用戶在我們的站點(diǎn)請(qǐng)求QQ的第三方登陸時(shí),我們站點(diǎn)會(huì)引導(dǎo)用戶跳轉(zhuǎn)到QQ的登陸授權(quán)界面,當(dāng)用戶輸入QQ和密碼成功登錄以后會(huì)自動(dòng)跳回到我們站點(diǎn)設(shè)立好的回調(diào)頁(yè)面,并附帶一個(gè)code參數(shù),接著你使用code再次去請(qǐng)求QQ的授權(quán)頁(yè)面,就可以從中獲取到一個(gè)accesstoken(訪問(wèn)令牌),通過(guò)這個(gè)access_token,我們可以調(diào)用QQ提供應(yīng)我們的接口,比如獲取open_id,可以獲取用戶的基本信息。獲取到之后,我們需要拿用戶的授權(quán)信息和open_id和我們平臺(tái)的普通用戶進(jìn)行綁定。這樣不管是普通用戶登陸還是第三方登陸用戶,都可以實(shí)現(xiàn)登陸。60、有負(fù)責(zé)開發(fā)app嗎我以前有過(guò)使用hybridAPP開發(fā)過(guò)APP,做過(guò)一個(gè)簡(jiǎn)樸的廣場(chǎng)舞APP,但我重要參與到APP的接口編寫這塊中。61、開發(fā)app過(guò)程中碰到了什么難題hybridAPP開發(fā)過(guò)程中,前端知識(shí)是我的硬傷,以前,前端我一直都沒(méi)有花太多精力在上面,所以在使用hybridAPP開發(fā)過(guò)程中,頁(yè)面樣式總是調(diào)得很難看,后面我花了一周時(shí)間自己自學(xué)惡補(bǔ)了以下前端的東西,感覺(jué)收獲很大。尚有我記得以前在公司寫接口時(shí),我們的安卓工程師認(rèn)為他們APP的分頁(yè)效果,得我們接口這邊事先分好頁(yè),然后他們?cè)僬{(diào)用接口,其實(shí)分頁(yè)的頁(yè)碼需要他那邊提供應(yīng)我們,但是他就認(rèn)定了是我們這邊的問(wèn)題,后面通過(guò)多次溝通和測(cè)試,我們共同完畢了這項(xiàng)任務(wù)。62、linux殺死一個(gè)進(jìn)程命令是什么一方面,我們得知道要?dú)⑺赖倪M(jìn)程的進(jìn)程ID,可以通過(guò)ps-ef|grep進(jìn)程名稱查到當(dāng)前運(yùn)營(yíng)的進(jìn)程ID,然后通過(guò)kill命令殺死進(jìn)程,如kill-93329表達(dá)強(qiáng)制殺死進(jìn)程,當(dāng)然尚有不同的等級(jí),取決于中間的數(shù)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育局聘任小學(xué)校長(zhǎng)協(xié)議書(2篇)
- 2024年版財(cái)產(chǎn)分割協(xié)議:離婚雙方適用2篇
- 2024年度塔吊司機(jī)承包勞務(wù)合作協(xié)議書3篇
- 2024年版標(biāo)準(zhǔn)化建筑工程協(xié)議范本版
- 《頜面神經(jīng)痛》課件
- 2024年版專業(yè)養(yǎng)殖場(chǎng)租賃協(xié)議范本一
- 第10課 阿長(zhǎng)與山海經(jīng)(學(xué)生版)
- 電子特氣研發(fā)中心建設(shè)項(xiàng)目可行性研究報(bào)告寫作模板-申批備案
- 2024年標(biāo)準(zhǔn)版英文個(gè)人擔(dān)保協(xié)議模板版B版
- 2024年歐洲能源市場(chǎng)交易合同
- 小學(xué)語(yǔ)文作文技巧六年級(jí)寫人文章寫作指導(dǎo)(課堂PPT)
- NLP時(shí)間線療法
- JJG596-2012《電子式交流電能表檢定規(guī)程》
- 醫(yī)療質(zhì)量檢查分析、總結(jié)、反饋
- 《APQP培訓(xùn)資料》
- 通信線路架空光纜通用圖紙指導(dǎo)
- 家具銷售合同,家居訂購(gòu)訂貨協(xié)議A4標(biāo)準(zhǔn)版(精編版)
- 食品加工與保藏課件
- 銅芯聚氯乙烯絕緣聚氯乙烯護(hù)套控制電纜檢測(cè)報(bào)告可修改
- 有功、無(wú)功控制系統(tǒng)(AGCAVC)技術(shù)規(guī)范書
- PE拖拉管施工方案(完整版)
評(píng)論
0/150
提交評(píng)論