2023年面試資料匯總必會_第1頁
2023年面試資料匯總必會_第2頁
2023年面試資料匯總必會_第3頁
2023年面試資料匯總必會_第4頁
2023年面試資料匯總必會_第5頁
已閱讀5頁,還剩80頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、酒店預訂怎么實現?怎么設計表你好,我大約的說下我們的業務流程,我們的業務流程是:用戶在網站瀏覽酒店信息,可以根據地區檢索出該地區的酒店信息。列表展示酒店的信息由:酒店的名稱,酒店圖片,酒店位置,評論人數,評論分數以及最低入住價格。用戶選中要入住的酒店進入酒店詳情頁面,查看酒店的介紹以及酒店的房型列表,用戶根據他要入住的時間和離店的時間,檢索出這個時間段內的所有可選房型(房間數量-當天的訂單-當天未離店訂單=剩余房間數量)顯示給用戶。用戶選擇好房型后就可以進行下單,規定有訂單的開始時間,結束時間,房間數量,住客姓名,抵店時間,聯系方式,備注信息等等。那我的表是這么設計的,總共有6張表,分別是:用戶表user,里面有下面幾個字段,(用戶編號,用戶名稱,用戶密碼,用戶聯系方式)酒店表hotel,里面有(酒店編號,酒店名稱,酒店圖片,評論人數,評論分數,最低入住價格,所在地區)酒店圖片表pic(圖片編號,圖片地址,圖片排序,圖片所屬酒店)評論表comment(評論編號,評論內容,評論時間,用戶編號,酒店編號)房型表house(房型編號,床型,早餐,寬帶,人數上限,房價,房間數量,最長預定期間)訂單表order(訂單編號,開始時間,結束時間,房間數量,住客姓名,最晚抵店時間,聯系電話,使用優惠券,備注,訂單狀態)以上就是我對這個酒店預訂系統的設計2、預定期間怎么寫入數據庫的以預訂當時的時間戳作為預訂時間寫入數據庫。用戶下訂單時會選擇一個抵店時間,將該抵店時間以時間戳方式存入數據庫中。離店時間以當時的日期轉為時間戳方式存入數據庫中3、怎么判斷尚有沒有房間我可以根據用戶的入住時間和離店時間來檢索這個有效時間段內房間的庫存。房間數量扣除在這個時間段內入住的訂單和在這個時間段內離店的訂單。扣除后等到的數量才是這段時間內有效房間數量。4、怎么記錄天天的房間庫存我的思緒是根據一個公式來推理實現的,天天房間的庫存=房型下房間數量-(當天入住的訂單+當天未離店的訂單),這樣我就可以得到天天尚有多少房間是剩余的了。5、怎么在數據庫里對房間做唯一標記上面所設計的房型表就是我們的房間表,每個房間是唯一的,我們是使用數字作為編號的,也即使用主鍵作為唯一標記。6、最近出的新功能最近我們出了個會員機制,客戶第一次預訂酒店成功后,可以辦理睬員卡,憑借會員卡,下次來的時候可以打折,會員在一些比較特殊的日期預訂酒店成功,可以享受不同樣的優惠措施。怎么保證促銷商品不會超賣這個問題是我們當時開發時碰到的一個難點,超賣的因素重要是下的訂單的數目和我們要促銷的商品的數目不一致導致的,每次總是訂單的數比我們的促銷商品的數目要多,當時我們的小組討論了好久,給出了好幾個方案來實現:第一種方案是:①在每次下訂單前我們判斷促銷商品的數量夠不夠,不夠不允許下訂單,更改庫存量時加上一個條件,只更改商品庫存大于0的商品的庫存,當時我們使用ab進行壓力測試,當并發超過500,訪問量超過2023時,還是會出現超賣現象。所以被我們否認了。第二種方案是:②使用mysql的事務加排他鎖來解決,一方面我們選擇數據庫的存儲引擎為innoDB,使用的是排他鎖實現的,剛開始的時候我們測試了下共享鎖,發現還是會出現超賣的現象。有個問題是,當我們進行高并發測試時,對數據庫的性能影響很大,導致數據庫的壓力很大,最終也被我們否認了。第三種方案是:③使用文獻鎖實現。當用戶搶到一件促銷商品后先觸發文獻鎖,防止其他用戶進入,該用戶搶到促銷品后再解開文獻鎖,放其他用戶進行操作。這樣可以解決超賣的問題,但是會導致文獻得I/O開銷很大。最后我們使用了redis的隊列來實現。將要促銷的商品數量以隊列的方式存入redis中,每當用戶搶到一件促銷商品則從隊列中刪除一個數據,保證商品不會超賣。這個操作起來很方便,并且效率極高,最終我們采用這種方式來實現8、redis集群怎么做HYPERLINK""\o"Redis知識庫"\t""Redis集群提供了以下兩個好處??1、將數據自動切分(split)到多個節點? 2、當集群中的某一個節點故障時,redis還可以繼續解決客戶端的請求。?2、集群的方案:redis-cluster集群,采用無中心結構,每個節點保存數據和整個集群狀態,每個節點都和其他所有節點連接,重要通過節點的配置,輔以redis的主歷來完畢集群。由于這塊東西我使用得很少,所以只是平時抽時間去研究過,并沒有真正的在線上實現過。9、redis和memcacahe、mongoDB的區別答:都是非關系型數據庫,性能都非常高,但是mongoDB和memcache、redis是不同的兩種類型。后兩者重要用于數據的緩存,前者重要用在查詢和儲存大數據方面,是最接近數據庫的文檔型的非關系數據庫。這里我重要談談memcache和redis的區別。①從數據存儲位置上來分,memcache的數據存在內存中,而redis既可以存儲在內存中,也可以存儲的到磁盤中,達成持久化存儲的功能,memcache一旦斷電,數據所有丟失,redis可以運用快照和AOF把數據存到磁盤中,當恢復時又從磁盤中讀取到內存中,當物理內存使用完畢后,可以把數據寫入到磁盤中。②從存儲數據的類型上來分,memcache和redis存儲的方式都是鍵值對,只但是redis值的類型比較豐富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache重要存儲的是字符串。③從架構層次來分,Redis支持master-slave(主—從)模式應用,memcache支持分布式。④此外從存儲數據的大小上來分,Redis單個value的最大限制是1GB,memcached只能保存1MB的數據。但是Memcache在存儲100K以上的數據,性能稍微好一點。⑤此外redis只支持單核,memcache可以支持多核,當然關于redis取代memcache的說法,在一般情況下,兩者性能都很高,在大多的業務場景選擇上,redis的選擇也許更加具有優勢,但也不能說可以完全取代,最終還是取決于你的應用場景。10、持久化redis有幾種方式?答:重要有兩種方式:①快照持久化在redis配置文獻中已經自動啟動了,格式是:saveNM表達在N秒之內,redis至少發生M次修改則redis抓快照到磁盤。當然我們也可以手動執行save或者bgsave(異步)命令來做快照②appendonlyfileAOF持久化總共有三種模式,如appendfsynceverysec默認的是每秒強制寫入磁盤一次appendfsyncalways每次執行寫操作的時候就強制寫入磁盤appendfsyncno完全取決于os,性能最佳但是持久化沒法保證其中第三種模式最佳。redis默認的也是采用第三種模式。11、mysql存儲引擎答:常用的重要分為兩種,一種是innodb,一種是myisam,兩者的重要區別是①myisam不支持事務解決,而innoDB支持事務解決②myisam不支持外鍵,innoDB支持外鍵③myisam支持全文檢索,而innoDB在MySQL5.6版本之后才支持全文檢索④數據的存儲形式不同樣,mysiam表存放在三個文獻:結構、索引、數據,innoDB存儲把結構存儲為一個文獻,索引和數據存儲為一個文獻⑤myisam在查詢和增長數據性能更優于innoDB,innoDB在批量刪除方面性能較高。⑥myisam支持表鎖,而innoDB支持行鎖12、sql注入是什么及如何防止sql注入?答:SQL注入襲擊指的是用戶或者黑客通過構建特殊的輸入作為參數傳入我們的Web應用程序端,而這些輸入大都是SQL語法里的一些組合,通過執行SQL語句進而執行襲擊者所要的操作,其重要因素是程序員沒有細致地過濾用戶輸入的數據,致使非法數據侵入系統而導致的。因此我們在做開發過程中一定要防止sql注入,重要從兩方面著手:1、占位符的方式,就是對sql語句進行預解決,然后執行sql語句2、通過addslashes或者mysql_real_escape_string這兩個函數對用戶輸入的值進行轉義解決,把一些特殊的字符轉義掉。13、有用過預解決么?答:用過,PDO類中,有個prepare方法可以實現預解決,PDOStament類中的excute方法可以執行預解決,預解決的參數分為兩種,一種是:字符串占位符,另一種是?占位符,:字符串占位符在執行預解決傳遞參數時傳入的是關聯數組,而?占位符傳遞的是索引數組。兩者不能混合使用,但一般推薦使用:字符串占位符。14、用框架還用自己的解決嗎答:一般成熟的開源框架中都考慮到了數據安全這方面的東西,但有時候我們也許會使用一些原生的SQL語句時,我們就需要考慮自己對sql語句進行預解決。當然有時候框架中的過濾方法我們不希望采用,比如使用文本編輯器時,我們可以使用自己的過濾方式。15、mysql優化怎么做的?答:mysql優化重要從以下幾個方面來實現:①設計角度:存儲引擎的選擇,字段類型選擇,范式②功能角度:可以運用mysql自身的特性,如索引,查詢緩存,碎片整理,分區、分表等③sql語句的優化方面:盡量簡化查詢語句,能查詢字段少就盡量少查詢字段,優化分頁語句、分組語句等。④部署大負載架構體系:數據庫服務器單獨出來,負載大時可以采用主從復制,讀寫分離機制進行設計⑤從硬件上升級數據庫服務器。16、訂單表用是什么存儲引擎答:由于訂單表存在著事務的解決,比如下了訂單,商品的庫存就要減少,這里就涉及到了事務,所以就用到innodb19、sql語句的優化答:一方面我們得擬定哪些sql語句需要優化,一般在一個系統中,查詢語句最多,所以我們重要是針對查詢語句進行優化。重要采用兩種方式來擬定要優化的sql語句:①使用慢查詢日記,設立需要優化的sql語句的執行時間,記錄下超過該設立時間的語句,即為需要優化的語句。②使用profiling機制,記錄下每條sql語句的執行時間,找出執行較慢的語句,即為需要優化的語句。我們重要通過給表字段添加索引的方式進行優化,加上索引后,sql語句的執行時間顯著提高了,但并不是加上索引了這條sql語句就會用到索引,所以一方面看執行慢的語句后面是否有加索引,我們可以使用explain或者desc加在要執行的sql語句前,查看是否使用到索引。有幾個地方需要注意的是:①為了避免建議索引而導致索引文獻過大,有時候我們會使用復合索引,這時候要遵循最左原則。②like查詢,前%不會用到索引③假如條件中有or,則規定or的索引字段都必須有索引,否則不能用到索引。④假如列類型是字符串,一定要在條件中將數據使用引號引用起來,否則不使用索引。⑤優化groupby語句⑥盡量避免模糊匹配,這樣會導致全盤掃描21、索引有幾種歐4答:索引重要有:主鍵索引:數據記錄里面不能有null,數據內容不能反復,在一張表里面不能有多個主鍵索引。普通索引:使用字段關鍵字建立的索引,重要是提高查詢速度唯一索引:字段數據是唯一的,數據內容里面能否為null,在一張表里面,是可以添加多個唯一索引。全文索引:在比較老的版本中,只有myisam引擎支持全文索引,在innodb5.6后引擎也支持全文索引,在mysql中全文索引不支持中文。我們一般使用sphinx集合coreseek來實現中文的全文索引。復合索引23、左前索引原則答:左前索引重要指的是在復合索引中,給兩個或多個字段建立了復合索引后,在sql語句后的條件中,只有復合索引前面的字段在條件的前面時,該索引才起作用,比如創建了個復合索引index(a,b),在使用where或者orderby條件時,假如只有條件b的,該索引不會生效,必須有條件a且必須要在條件b的前面該索引才會生效。24、分布式數據庫答:我所知道的分布式數據庫有memcache,重要是分布式的非關系型數據庫,用于緩存解決。分布式是指將不同的業務分布在不同的地方。而集群指的是將幾臺服務器集中在一起,實現同一業務。?分布式中的每一個節點,都可以做集群。而集群并不一定就是分布式的。舉例:就比如新浪網,訪問的人多了,他可以做一個群集,前面放一個響應服務器,后面幾臺服務器完畢同一業務,假如有業務訪問的時候,響應服務器看哪臺服務器的負載不是很重,就將給哪一臺去完畢。

而分布式,從窄意上理解,也跟集群差不多,但是它的組織比較松散,不像集群,有一個組織性,一臺服務器垮了,其它的服務器可以頂上來。memcache的應用場景1、合用memcached的業務場景?1)假如網站包含了訪問量很大的動態網頁,因而數據庫的負載將會很高。由于大部分數據庫請求都是讀操作,那么memcached可以顯著地減小數據庫負載。2)運用memcached可以緩存session數據、臨時數據以減少對他們的數據庫寫操作。4)緩存一些很小但是被頻繁訪問的文獻。5)訪問比較頻繁,安全性不高,丟失無所謂,修改比較頻繁的數據,比如一些用戶的在線狀態2、不合用memcached的業務場景?1)緩存對象的大小大于1MBmemcache自身就不是為了解決龐大的多媒體(largemedia)和巨大的二進制塊(streaminghugeblobs)而設計的。2)key的長度大于250字符3)應用運營在不安全的環境中4)業務自身需要的是持久化數據或者說需要的應當是database25、nginx日記,怎么記錄每個ip的訪問量(參考阿銘哥手冊)stub_status模塊重要用于查看Nginx的一些狀態信息,例如記錄nginx的訪問量,一方面我們得查看該模塊有沒有安裝,假如沒有安裝,得先安裝,安裝好后,修改nginx的配置文獻,啟動該模塊,然后就可以使用以下命令來進行記錄,如:1.根據訪問IP記錄UVawk'{print$1}'

access.log|sort|uniq-c|wc-l2.記錄訪問URL記錄PVawk'{print$7}'access.log|wc-l3.查詢訪問最頻繁的URLawk'{print$7}'access.log|sort|uniq-c|sort-n-k1-r|more4.查詢訪問最頻繁的IPawk'{print$1}'access.log|sort|uniq-c|sort-n-k1-r|more記錄nginx日記中訪問最多的100個ip及訪問次數awk‘{print$1}’access.log|sort|uniq-c|sort-n-k1-r|head-n10026、http協議HTTP是一個屬于應用層的面向對象的協議,由于其簡捷、快速的方式,合用于分布式超媒體信息系統HTTP協議的重要特點可概括如下:? 1.支持客戶/服務器模式。? 2.簡樸快速:客戶向服務器請求服務時,只需傳送請求方法和途徑。請求方法常用 的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。由于HTTP 協議簡樸,使得HTTP服務器的程序規模小,因而通信速度不久。? 3.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加 ?以標記。? ?4.無連接:無連接的含義是限制每次連接只解決一個請求。服務器解決完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。? ?5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對于事務解決沒有記憶能力。 缺少狀態意味著假如后續解決需要前面的信息,則它必須重傳,這樣也許導致每次 連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。27、cookie與session的區別?1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙

考慮到安全應當使用session。3、session會在一定期間內保存在服務器上。當訪問增多,會比較占用你服務器的性能

考慮到減輕服務器性能方面,應當使用COOKIE。4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。5、所以個人建議:?

將登陸信息等重要信息存放為SESSION?

其他信息假如需要保存,可以放在COOKIE中28、php在儲存session以什么形式存在 PHP為session的存儲提供了三種方式:文獻/內存/自定義存儲,默認是使用文獻存儲.在訪問量大的網站上采用這種方式就不大合適,由于這樣會導致大量的輸入輸出的冗余.我們可以在php.ini更改配置文獻或者php腳本中通過相應的函數來設立session文獻的存儲類型來改變session文獻的存儲形式29、xss襲擊怎么防止XSS又稱CSS,全稱CrossSiteScript(跨站腳本襲擊),XSS襲擊類似于SQL注入襲擊,是Web程序中常見的漏洞,XSS屬于被動式且用于客戶端的襲擊方式,所以容易被忽略其危害性。其原理是襲擊者向有XSS漏洞的網站中輸入(傳入)惡意的HTML代碼,當用戶瀏覽該網站時,這段HTML代碼會自動執行,從而達成襲擊的目的。如,盜取用戶Cookie信息、破壞頁面結常見的惡意字符XSS輸入:1.XSS輸入通常包含JavaScript腳本,如彈出惡意警告框:<script>alert("XSS");</script>2.XSS輸入也也許是HTML代碼段,譬如:(1)網頁不斷地刷新<metahttp-equiv="refresh"content="0;">(2)嵌入其它網站的鏈接<iframesrc=http://xxxxwidth=250height=250></iframe>構、重定向到其它網站等。方法:運用phphtmlentities()函數php防止XSS跨站腳本襲擊的方法:是針對非法的HTML代碼涉及單雙引號等,使用htmlspecialchars()函數。在使用htmlspecialchars()函數的時候注意第二個參數,直接用htmlspecialchars($string)的話,第二個參數默認是ENT_COMPAT,函數默認只是轉化雙引號("),不對單引號(')做轉義。所以,htmlspecialchars()函數更多的時候要加上第二個參數,應當這樣用:htmlspecialchars($string,ENT_QUOTES)。當然,假如需要不轉化如何的引號,用htmlspecialchars($string,ENT_NOQUOTES)。此外,盡量少用htmlentities(),在所有英文的時候htmlentities()和htmlspecialchars()沒有區別,都可以達成目的。但是,中文情況下,htmlentities()卻會轉化所有的html代碼,連同里面的它無法辨認的中文字符也給轉化了。htmlentities()和htmlspecialchars()這兩個函數對單引號(')之類的字符串支持不好,都不能轉化,所以用htmlentities()和htmlspecialchars()轉化的字符串只能防止XSS襲擊,不能防止SQL注入襲擊。所有有打印的語句如echo,print等,在打印前都要使用htmlentities()進行過濾,這樣可以防止XSS,注意中文要寫出htmlentities($name,ENT_NOQUOTES,GB2312)。30、禁用cookie后,session還能用嗎?可以,在存儲session的文獻中,生成sessionID,通過get傳參的方式將sessionID傳到要實現session共享的頁面,讀取sessionID,從而從session中獲取數據。31、mongodb基于什么開發的?MongoDB是一個基于分布式文獻存儲的數據庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。32、mongodb是非范式還是范式?數據表達的方式有很多種,其中最重要的問題之一就是在多大限度上對數據進行范式化。范式化(normalization)是將數據分散到多個不同的集合,不同集合之間可以互相引用數據。雖然很多文檔可以引用某一塊數據,但是這塊數據只存儲在一個集合中。所以,假如要修改這塊數據,只需修改保存這塊數據的那一個文檔就行了。但是,MongoDB沒有提供連接(join)工具,所以在不同集合之間執行連接查詢需要進行多次查詢。反范式化(denormalization)與范式化相反:將每個文檔所需的數據都嵌入在文檔內部。每個文檔都擁有自己的數據副本,而不是所有文檔共同引用同一個數據副本。這意味著,假如信息發生了變化,那么所有相關文檔都需要進行更新,但是在執行查詢時,只需要一次查詢,就可以得到所有數據。決定何時采用范式化何時采用反范式化時比較困難的。范式化可以提高數據寫入速度,反范式化可以提高數據讀取速度。需要根據自己應用程序的十幾需要仔細權衡。33、mongodb與mysql區別MySQL是關系型數據庫。優勢:在不同的引擎上有不同的存儲方式。查詢語句是使用傳統的sql語句,擁有較為成熟的體系,成熟度很高。開源數據庫的份額在不斷增長,mysql的份額頁在連續增長。缺陷:在海量數據解決的時候效率會顯著變慢。Mongodb是非關系型數據庫(nosql),屬于文檔型數據庫。文檔是mongoDB中數據的基本單元,類似關系數據庫的行,多個鍵值對有序地放置在一起便是文檔,語法有點類似javascript面向對象的查詢語言,它是一個面向集合的,模式自由的文檔型數據庫。存儲方式:虛擬內存+持久化。查詢語句:是獨特的Mongodb的查詢方式。適合場景:事件的記錄,內容管理或者博客平臺等等。架構特點:可以通過副本集,以及分片來實現高可用。數據解決:數據是存儲在硬盤上的,只但是需要經常讀取的數據會被加載到內存中,將數據存儲在物理內存中,從而達成高速讀寫。成熟度與廣泛度:新興數據庫,成熟度較低,Nosql數據庫中最為接近關系型數據庫,比較完善的DB之一,合用人群不斷在增長。優點:快速!在適量級的內存的Mongodb的性能是非常迅速的,它將熱數據存儲在物理內存中,使得熱數據的讀寫變得十分快。高擴展性,存儲的數據格式是json格式!缺陷:不支持事務,并且開發文檔不是很完全,完善。Mysql和Mongodb重要應用場景(簡樸了解敘述下即可)1.假如需要將mongodb作為后端db來代替mysql使用,即這里mysql與mongodb屬于平行級別,那么,這樣的使用也許有以下幾種情況的考量:(1)mongodb所負責部分以文檔形式存儲,可以有較好的代碼親和性,json格式的直接寫入方便。(如日記之類)(2)從datamodels設計階段就將原子性考慮于其中,無需事務之類的輔助。開發用如nodejs之類的語言來進行開發,對開發比較方便。(3)mongodb自身的failover機制,無需使用如MHA之類的方式實現。2.將mongodb作為類似redis,memcache來做緩存db,為mysql提供服務,或是后端日記收集分析。考慮到mongodb屬于nosql型數據庫,sql語句與數據結構不如mysql那么親和,也會有很多時候將mongodb做為輔助mysql而使用的類redismemcache之類的緩存db來使用。亦或是僅作日記收集分析。34、寫一個函數記錄每一個元素出現的次數 PHP中的array_count_values()函數可以實現array_count_values()函數用于記錄數組中所有值出現的次數。本函數返回一個數組,其元素的鍵名是原數組的值,鍵值是該值在原數組中出現的次數。35、手寫排序重要從原理方面來說:重點介紹冒泡排序和選擇排序 //冒泡排序function

BubbleSort($arr)

//

獲得數組總長度

$num

=

count($arr);

//

正向遍歷數組

for

($i

=

1;

$i

<

$num;

$i++)

{

//

反向遍歷

for

($j

$num

-

1;

$j

>=

$i

;

$j--)

{

//

相鄰兩個數比較

if

($arr[$j]

<

$arr[$j-1])

//

暫存較小的數

$iTemp

=

$arr[$j-1];

//

把較大的放前面

$arr[$j-1]

=

$arr[$j];

//

較小的放后面

$arr[$j]

$iTemp;

}

}

return

$arr;}//互換法排序function

ExchangeSort($arr){

$num

=

count($arr);

//

遍歷數組

for

($i

=

0;$i

<

$num

-

1;

$i++)

//

獲得當前索引的下一個索引

for

($j

=

$i

1;

$j

$num;

$j++)

{

//

比較相鄰兩個的值大小

if

($arr[$j]

<

$arr[$i])

{

//

暫存較小的數

$iTemp

=

$arr[$i];

//

把較大的放前面

$arr[$i]

=

$arr[$j];

//

較小的放后面

$arr[$j]

=

$iTemp;

}

return

$arr;}//選擇法排序function

SelectSort($arr)

//

獲得數組總長度

$num

=

count($arr);

//

遍歷數組

for

($i

=

0;$i

<

$num-1;

$i++)

//

暫存當前值

$iTemp

$arr[$i];

//

暫存當前位置

$iPos

=

$i;

//

遍歷當前位置以后的數據

for

($j

=

$i

+

1;$j

<

$num;

$j++){

//

假如有小于當前值的

if

($arr[$j]

<

$iTemp)

{

//

暫存最小值

$iTemp

=

$arr[$j];

//

暫存位置

$iPos

=

$j;

}

}

//

把當前值放到算好的位置

$arr[$iPos]

=

$arr[$i];

//

把當前值換成算好的值

$arr[$i]

=

$iTemp;

}

return

$arr;}//插入法排序function

InsertSort($arr){

$num

=

count($arr);

//

遍歷數組

for

($i

=

1;$i

<

$num;

$i++)

{

//

獲得當前值

$iTemp

=

$arr[$i];

//

獲得當前值的前一個位置

$iPos

=

$i

-

1;

//

假如當前值小于前一個值切未到數組開始位置

while

(($iPos

>=

0)

&&

($iTemp

<

$arr[$iPos]))

{

//

把前一個的值往后放一位

$arr[$iPos

+

1]

$arr[$iPos];

//

位置遞減

$iPos--;

}

$arr[$iPos+1]

=

$iTemp;

}

return

$arr;}//快速排序function

QuickSort($arr){

$num

count($arr);

$l

$r

=

0;

$left

=

$right

array();

//

從索引的第二個開始遍歷數組

for

($i

=

1;$i

<

$num;

$i++)

//

假如值小于索引1

if

($arr[$i]

<

$arr[0])

//

裝入左索引數組(小于索引1的數據)

$left[]

$arr[$i];

$l++;

else

//

否則裝入右索引中(大于索引1的數據)

$right[]

=

$arr[$i];

$r++;

//

}

}

//

假如左索引有值

則對左索引排序

if($l

>

1)

{

$left

=

QuickSort($left);

//

排序后的數組

$new_arr

=

$left;

//

將當前數組第一個放到最后

$new_arr[]

=

$arr[0];

//

假如又索引有值

則對右索引排序

if

($r

>

1)

{

$right

=

QuickSort($right);

}

//

根據右索引的長度再次增長數據

for($i

=

0;$i

<

$r;

$i++)

{

$new_arr[]

=

$right[$i];

}

return

$new_arr;}36、設計模式在PHP中,我重要使用了以下兩種設計模式1、單例模式單例模式顧名思義,就是只有一個實例。作為對象的創建模式,單例模式保證某一個類只有一個實例,并且自行實例化并向整個系統提供這個實例。單例模式的要點有三個:一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。典型的代表如框架中的基類對象。2、簡樸工廠模式①抽象基類:類中定義抽象一些方法,用以在子類中實現②繼承自抽象基類的子類:實現基類中的抽象方法③工廠類:用以實例化所有相相應的子類這種我們使用最常見,基本所有的MVC框架中都是這樣產生的。37、用過什么PHP框架在開發過程中,我重要使用過了這么幾種框架。thinkPHP框架、CI框架,laravel框架和yii框架。我接觸到的第一個框架是TP框架,我簡樸的說下我對這幾個框架的見解:ThinkPHP框架優點:TP借鑒了Java思想,基于PHP5,充足運用了PHP5的特性,部署簡樸只需一個入口文獻,一切搞定,簡樸高效,中文文檔齊全,入門超級簡樸。自帶模板引擎,具有獨特的數據驗證和自動填充功能,框架更新速度比較迅速。缺陷:一個Model中可以操作多個表,但TP只能一個。?TP默認初始化了很多配置,使用起來很方便,但自然也會影響效率。但是把一些加載配置的時間拿去研究算法,這些小影響近乎可以忽略了。CodeIgniter框架優點:配置簡樸,上手不久,所有的配置使用PHP腳本來配置,沒有使用很多太復雜的設計模式,執行性能和代碼可讀性上都不錯,執行效率比較高,具有基本的MVC功能.快速簡潔,代碼量少,框架簡樸,容易上手,自帶了很多簡樸好用的library,框架適合中小型項目,大型項目也不是不可以,只是擴展能力稍差。缺陷:1.把Model層簡樸的理解為數據庫操作2.PHP框架略顯簡樸,只可以滿足小型應用,略微不太可以滿足中型應用需要laravel框架(目前最新的是5.3,規定PHP版本較高5.6)?優點:1.Laravel注重代碼的模塊化和可擴展性。2.artisan:命令行工具,很多手動的工作都自動了3.可繼承的模版,簡化view的開發和管理Laravel一直是PHP開發者最受歡迎的PHP框架。這是一個年輕的框架,但是擁有優雅的語法,可簡樸快速開發你的應用。它擁有大多數常見的功能,如:路由,身份驗證,會話,隊列和緩存。缺陷:laravel的中英文文檔比較少demo也比較少有時候一個功能要試好久甚至要看源碼YII框架(目前是2.0版本)優點:1、快速,靈敏,不拖沓,給程序員飛翔的能力;2、有gii功能!(創建控制器,model層,crud等操作);3、具有高度的可重用性和可擴展性,是純粹的面向對象的。開發速度快,完備的文檔,可重用性可高擴展,是最高效的開發框架之一。缺陷:1、對Model層的指導和考慮較少2、文檔實例較少3、英文太多4、規定PHP技術精通,OOP編程要純熟!5、規定會bootstrap38、代碼管理工具我使用過的版本控制工具有兩種:初期的時候使用的是SVN,現在重要使用git,我就我個人的觀點,簡樸的說下兩者的區別:1.Git是分布式的,SVN是集中式的,好處是跟其他同事不會有太多的沖突,自己寫的代碼放在自己電腦上,一段時間后再提交、合并,也可以不用聯網在本地提交;2.Git下載下來后,在本地不必聯網就可以看到所有的log,很方便學習,SVN卻需要聯網;3.Git鼓勵分Branch(分支),而SVN,說實話,我用Branch的次數還挺少的,SVN自帶的Branchmerge我還真沒用過,有merge時用的是BeyondCompare工具合并后再Commit的;4.SVN在Commit前,我們都建議是先Update一下,跟本地的代碼并確編譯沒問題,保開發的功能正常后再提交SVN

的重要功能

SVN屬于集中化的版本控制系統,有個不太精確的比方:SVN=

版本控制+

備份服務器

SVN使用起來有點像是檔案倉庫的感覺,支持并行讀寫文獻,支持代碼的版本化管理,功能涉及取出、導入、更新、分支、改名、還原、合并等。

功能有許多我就不一一列了,SVN大都采用圖形界面操作,直觀,上手快。Git的重要功能

Git是一個分布式版本控制系統,操作命令涉及:clone,pull,push,branch,merge,rebas,Git擅長的是程序代碼的版本化管理。SVN

的優缺陷

SVN對中文支持好,操作簡樸,使用沒有難度,美工人員,產品人員,測試人員,實行人員都可輕松上手。使用界面統一,功能完善,操作方便。Git的優缺陷

對程序源代碼進行差異化的版本管理,代碼庫占很少的空間。易于代碼的分支化管理。不支持中文,圖形界面支持差,使用難度大。不易推廣。SVN

Git

哪個更合用于項目管理?

SVN更合用于項目管理,

Git僅合用于代碼管理。

一個研發隊伍的成員正常涉及:需求分析、設計、美工、程序員、測試、實行、運維,每個成員在工作中都有產出物,

涉及了文檔、設計代碼、程序代碼,這些都需要按項目集中進行管理的。SVN能清楚的按目錄進行分類管理,使項目組的管理處在有序高效的狀態。現在越來越多人使用git做為版本控制工具,我以前的公司也是使用git.39、手寫單例模式怎么寫三私一公。classExample{//保存例實例在此屬性中privatestatic$_instance;

//構造函數聲明為private,防止直接創建對象privatefunction__construct(){echo'IamConstruceted';}

//單例方法publicstaticfunctionsingleton(){if(!isset(self::$_instance)){$c=__CLASS__;self::$_instance=new$c;}returnself::$_instance;}

//阻止用戶復制對象實例publicfunction__clone(){trigger_error('Cloneisnotallow',E_USER_ERROR);}

functiontest(){echo("test");

}}

//這個寫法會犯錯,由于構造方法被聲明為private$test=newExample;

//下面將得到Example類的單例對象$test=Example::singleton();$test->test();

//復制對象將導致一個E_USER_ERROR.$test_clone=clone$test;?>40、nosql和Mysql的區別也即非關系型數據庫和關系型數據庫。目前世界上主流的存儲系統大部分還是采用了關系型數據庫,其重要有一下優點:1.事務解決—保持數據的一致性;2.由于以標準化為前提,數據更新的開銷很小(相同的字段基本上只有一處);3.可以進行Join等復雜查詢。nosql在優勢方面,重要體現在下面這三點:

?1.簡樸的擴展:典型例子是Cassandra,由于其架構是類似于經典的P2P,所以能通過輕松地添加新的節點來擴展這個集群;

?2.快速的讀寫:重要例子有Redis,由于其邏輯簡樸,并且純內存操作,使得其性能非常杰出,單節點每秒可以解決超過10萬次讀寫操作;

?3.低廉的成本:這是大多數分布式數據庫共有的特點,由于重要都是開源軟件,沒有昂貴的License成本;

?4.

?但瑕不掩瑜,NoSQL數據庫還存在著很多的局限性,常見重要有下面這幾個:

?1.不提供對SQL的支持:假如不支持SQL這樣的工業標準,將會對用戶產生一定的學習和應用遷移成本;

2.支持的特性不夠豐富:現有產品所提供的功能都比較有限,大多數NoSQL數據庫都不支持事務,也不像SQLServer和HYPERLINK""\o"Oracle知識庫"Oracle那樣能提供各種附加功能,比如BI和報表等;

?3.現有產品的不夠成熟:大多數產品都還處在初創期,和關系型數據庫幾十年的完善不可同日而語;

41、在TP中M方法與D方法的區別雖然都是實例化模型對象,兩者還是有區別的D和M的區別重要在于M方法不需要創建模型類文獻,M方法不會讀取模型類,所以默認情況下自動驗證是無效的,但是可以通過動態賦值的方式實現而D方法必須有創建模型類。我們可以用下面兩種方法去創建一個數據表的映射對象第一種:$Test=D(‘Test’)第二種:$Test=newModel(‘Test’)雖然這兩種都可以對數據進行select,insert,delete,udpate操作,在數據驗證上有很大的不同,用第一種方式實例一個模型就會有數據檢查功能,假如title沒有填寫的話就會提醒“請輸入標題”(這個是tp提供的一個自動驗證功能,當然也需要在相應的model中定義好驗證條件);假如用第二種就沒有了這個數據驗證功能,需要手動驗證。D函數實例化的是你當前項目的Lib/Model下面的模塊。

假如該模塊不存在的話,直接返回實例化Model的對象(意義就與M()函數相同)。

而M只返回,實例化Model的對象。它的$name參數作為HYPERLINK""\o"MySQL知識庫"\t""數據庫的表名來解決對數據庫的操作。42、對網站大訪問量的優化方案提高訪問速度。從硬件,最佳從網站程序等等方面考慮。我給出以下幾種方案:1.盡量使用靜態頁,不要老使用動態信息調用。非常容易出問題

2.圖片內容與網站數據盡量放在同一個服務器或者機房內。大量外鏈圖片是會有問題的

3.一次又一次,一遍又一遍的分析流量走向,然后縮短瀏覽者瀏覽距離,舉個例子,瀏覽者假如現在在你網站看一個新聞需要點5次鼠標,你就要縮短這個點擊數。

4.一次又一次,一遍又一遍的分析,修改你的網站HYPERLINK""\t""數據庫結構,使其更加簡潔。?5.提高網站的安防能力?6.買個好服務器,托管在一個好的機房!43、HYPERLINK""網站高并發大流量訪問的解決及解決方法第一:確認服務器硬件是否足夠支持當前的流量。

普通的P4服務器一般最多能支持天天10萬獨立IP,假如訪問量比這個還要大,那么必須一方面配置一臺更高性能的專用服務器才干解決問題,否則怎么優化都不也許徹底解決性能問題。

第二:優化數據庫訪問?前臺實現完全的靜態化當然最佳,可以完全不用訪問數據庫,但是對于頻繁更新的網站,靜態化往往不能滿足某些功能。?緩存就是另一個解決方案,就是將動態數據存儲到緩存文獻中,動態網頁直接調用這些文獻,而不必再訪問數據庫,技術假如的確無法避免對數據庫的訪問,那么可以嘗試優化數據庫的查詢SQL.避免使用Select*from這樣的語句,每次查詢只返回自己需要的結果,避免短時間內的大量SQL查詢。最佳在相同字段進行比較操作,在建立好的索引字段上盡量減少函數操作,假如要做到極致的話需要代碼的優化;?第三,嚴禁外部的盜鏈。

外部網站的或者文獻盜鏈往往會帶來大量的負載壓力,因此應當嚴格限制外部對于自身的圖片或者文獻盜鏈,好在目前可以簡樸地通過refer來控制盜鏈,自己就可以通過配置來嚴禁盜鏈。當然,偽造refer也可以通過來實現盜鏈,但是目前蓄意偽造refer盜鏈的還不多,可以先不去考慮,或者使用非技術手段來解決,比如在圖片上增長水印。

第四,控制大文獻的下載。

大文獻的下載會占用很大的流量,并且對于非SCSI硬盤來說,大量文獻下載會消耗CPU,使得網站響應能力下降。因此,盡量不要提供超過2M的大文獻下載,假如需要提供,建議將大文獻放在此外一臺服務器上。

第五,使用不同主機分流重要流量?將文獻放在不同的主機上,提供不同的鏡像供用戶下載。比如假如覺得RSS文獻占用流量大,那么使用FeedBurner或者FeedSky等服務將RSS輸出放在其他主機上,這樣別人訪問的流量壓力就大多集中在FeedBurner的主機上,RSS就不占用太多資源了。?第六,使用流量分析記錄軟件。

在網站上一個流量分析記錄軟件,可以即時知道哪些地方花費了大量流量,哪些頁面需要再進行優化,因此,解決流量問題還需要進行精確的記錄分析才可以。我推薦使用的流量分析記錄軟件是Analytics(Google分析)。45、重要運用到哪些緩存一、數據緩存這里所說的數據緩存是指數據庫查詢緩存,每次訪問頁面的時候,都會先檢測相應的緩存數據是否存在,假如不存在,就連接數據庫,得到數據,并把查詢結果序列化后保存到文獻中,以后同樣的查詢結果就直接從緩存表或文獻中獲得。用的最廣的例子看Discuz的搜索功能,把結果ID緩存到一個表中,下次搜索相同關鍵字時先搜索緩存表。?舉個常用的方法,多表關聯的時候,把附表中的內容生成數組保存到主表的一個字段中,需要的時候數組分解一下,這樣的好處是只讀一個表,壞處就是兩個數據同步會多不少環節,數據庫永遠是瓶頸,用硬盤換速度,是這個的關鍵點。二、頁面緩存每次訪問頁面的時候,都會先檢測相應的緩存頁面文獻是否存在,假如不存在,就連接數據庫,得到數據,顯示頁面并同時生成緩存頁面文獻,這樣下次訪問的時候頁面文獻就發揮作用了。(模板引擎和網上常見的一些緩存類通常有此功能)。三、時間觸發緩存檢查文獻是否存在并且時間戳小于設立的過期時間,假如文獻修改的時間戳比當前時間戳減去過期時間戳大,那么就用緩存,否則更新緩存。四、內容觸發緩存當插入數據或更新數據時,強制更新緩存。五、靜態緩存這里所說的靜態緩存是指靜態化,直接生成HTML或XML等文本文獻,有更新的時候重生成一次,適合于不太變化的頁面,這就不說了。

六、內存緩存

Memcached是高性能的,分布式的內存對象緩存系統,用于在動態應用中減少數據庫負載,提高訪問速度。redis也可以做到。46、php的設計模式1、單例模式 2、工廠模式 3、觀測者模式?4、命令鏈模式 5、策略模式?單例模式:一個類在整個應用中,只有一個對象實例的設計模式類必須自行創建這個實例必須自行向整個系統提供這個實例三私:私有靜態成員變量、構造函數、克隆函數一公:公共的靜態方法??2、工廠模式可以根據輸入的參數或者應用程序配置的不同一創建一種專門用來實例化并返回其它類的實例的類3、觀測者模式觀測者模式提供了組件之間緊密耦合的另一種方法。該模式:一個對象通過添加一個方法(該方法允許另一個對象,即觀測者注冊自己)全自身變得可觀測。當可觀測的對象更改時,它會將消息發送到已注冊的觀測者。這些觀測者使用該信息執行的操作與可觀測的對象無關。4、命令鏈模式:以松散耦合主題為基礎,發送消息、命令和請求,或通過一組解決程序發送任意內容。每個解決程序都會自行判斷自己能否解決請求,假如可以,該請求被解決,進程停止。5、策略模式:此算法是從復雜類提取的,因而可以方便地替換。47.Mysql事務的特性事務是作為一個邏輯單元執行的一系列操作,一個邏輯工作單元必須有四個屬性,稱為HYPERLINK""\t"_blank"ACID(原子性、一致性、隔離性和持久性)屬性,只有這樣才干成為一個事務:?原子性

事務必須是原子工作單元;對于其數據修改,要么全都執行,要么全都不執行。?一致性?事務在完畢時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用于事務的修改,以保持所有數據的完整性。?事務結束時,所有的內部數據結構(如B樹索引或雙向鏈表)都必須是對的的。?隔離性?由并發事務所作的修改必須與任何其它并發事務所作的修改隔離。事務查看數據時數據所處的狀態,要么是另一并發事務修改它之前的狀態,

要么是另一事務修改它之后的狀態,事務不會查看中間狀態的數據。這稱為可串行性,由于它可以重新裝載起始數據,

并且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。持久性?事務完畢之后,它對于系統的影響是永久性的。該修改即使出現系統故障也將一直保持。begin開始一個事務rollback事務回滾commit事務確認48、Mysql事務的應運場景事務解決在各種管理系統中都有著廣泛的應用,比如人員管理系統,很多同步數據庫操作大都需要用到事務解決。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務!比如手機充值過程,支付寶金額減少,相應的手機話費增長,只要有一個操作不成功,則此外一個操作也不會成功49.Include和require的區別require函數通常放在PHP程序的最前面,在PHP程序執行之前,就會先讀取require指定引入的文獻,使它變成PHP程序網頁的一部分。include函數一般是放在流程控制的解決部分中。PHP程序在讀到include的文獻時,才將它讀進來,這種方式可以把程序執行時的流程簡樸化。他們兩個的用途是同樣的,不一定非要哪個放在最前面哪個放在中間,他們最主線的區別在于錯誤解決的方式不同樣。require一個文獻存在錯誤的話,那么程序就會中斷執行,并顯示致命錯誤而include一個文獻存在錯誤的話,那么程序不會中斷,會繼續執行,并顯示一個警告的錯誤其它區別:include有返回值,而require沒有。50、索引的建立與使用索引就是類似書的目錄,提高檢索數據的效率。索引是系統按照某個具體的算法(哈希,散列,二叉樹),將數據從所有數據里進行提取,維護成一個索引文獻,然后系統在進行數據查詢的時候,發現假如查詢條件剛好滿足索引條件,就可以從索引文獻中快速的定位的數據所在位置。mysql中有以下幾種索引:主鍵索引(primarykey效率最高的索引)唯一索引(uniquekey):不為空的情況下效率最高普通索引(index)對數據沒有規定,文獻很大,效率比較低全文索引(fulltext),對整個文章內部進行關鍵字索引(mysql5.5以后InnoDB支持全文索引) 英文的全文索引很簡樸:英文單詞默認是用空格分離的?中文的全文索引很難:中文的詞組成很麻煩,需要運用分詞工具(sphinx)索引可以在創建表的同時創建索引,也可以在修改表結構時添加索引,索引重要是加在經常做為查詢條件的字段上,可以使用相應的手段來檢測所執行的sql語句中是否使用到了索引。51.正則匹配表達式各個符文表達的意義\?將下一個字符標記為一個特殊字符、或一個原義字符、或一個向后引用、或一個八進制轉義符。例如,’n’匹配字符“n”。’\n’匹配一個換行符。序列‘\\’匹配“\”而“\(”則匹配“(”。^?匹配輸入字符串的開始位置。假如設立了RegExp對象的Multiline屬性,^也匹配‘\n’或‘\r’之后的位置。$ 匹配輸入字符串的結束位置。假如設立了RegExp對象的Multiline屬性,$也匹配‘\n’或‘\r’之前的位置。* 匹配前面的子表達式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等價于{0,}。+ 匹配前面的子表達式一次或多次。例如,’zo+’能匹配“zo”以及“zoo”,但不能匹配“z”。+等價于{1,}。? 匹配前面的子表達式零次或一次。例如,”do(es)?”可以匹配“do”或“does”中的”do”。?等價于{0,1}。{n}?n是一個非負整數。匹配擬定的n次。{n,}?n是一個非負整數。至少匹配n次。{n,m} m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。.?匹配除“\n”之外的任何單個字符。要匹配涉及‘\n’在內的任何字符,請使用象‘[.\n]’的模式。x|y 匹配x或y。[xyz]?字符集合。匹配所包含的任意一個字符。例如,‘[abc]’可以匹配“plain”中的‘a’。[^xyz]?負值字符集合。匹配未包含的任意字符。例如,‘[^abc]’可以匹配“plain”中的’p'。[a-z]?字符范圍。匹配指定范圍內的任意字符。例如,’[a-z]’可以匹配‘a’到‘z’范圍內的任意小寫字母字符。[^a-z] 負值字符范圍。匹配任何不在指定范圍內的任意字符。例如,’[^a-z]’可以匹配任何不在‘a’到‘z’范圍內的任意字符。\b 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如,‘er\b’可以匹配”never”中的‘er’,但不能匹配“verb”中的‘er’。\d?匹配一個數字字符。等價于[0-9]。\D 匹配一個非數字字符。等價于[^0-9]。\f?匹配一個換頁符。等價于\x0c和\cL。\n 匹配一個換行符。等價于\x0a和\cJ。\r?匹配一個回車符。等價于\x0d和\cM。\s?匹配任何空白字符,涉及空格、制表符、換頁符等等。等價于[\f\n\r\t\v]。\S?匹配任何非空白字符。等價于[^\f\n\r\t\v]。\t?匹配一個制表符。等價于\x09和\cI。\v 匹配一個垂直制表符。等價于\x0b和\cK。\w 匹配涉及下劃線的任何單詞字符。等價于’[A-Za-z0-9_]’。\W 匹配任何非單詞字符。等價于‘[^A-Za-z0-9_]’。52.PHP的變量類型四種標量類型:boolean(布爾型):這是最簡樸的類型,只有兩種取值,可認為TRUE/true或FALSE/false,不區分大小寫。具體請查看:PHP布爾類型(boolean)integer(整型):在32位操作系統中它的有效范圍是:-2147483648~+2147483647。整型值可以使用十進制,十六進制或八進制表達,前面可以加上可選的符號(-或者+)。八進制表達數字前必須加上0(零),十六進制表達數字前必須加上0x。float(浮點型,也稱作double)string(字符串):字符型變量不同于其他編程語言有字符與字符串之分,在PHP中,統一使用字符型變量來定義字符或者字符串。兩種復合類型:array(數組):數組型變量是一種比較特殊的變量類型,將在后續章節中具體說明。object(對象):對象也是一種特殊的數據類型。要創建object變量,請使用new關鍵字。具體請查看:PHP對象類型(object)最后是兩種特殊類型:resource(資源):源是一種特殊變量,保存了到外部資源的一個引用。資源是通過專門的函數來建立和使用的。詳情請查看:PHP資源類型(resource)NULL(NULL):表達一個變量沒有值。NULL類型唯一也許的值就是NULL。54.商城秒殺的實現搶購、秒殺是如今很常見的一個應用場景,重要需要解決的問題有兩個:

1高并發對數據庫產生的壓力?2競爭狀態下如何解決庫存的對的減少("超賣"問題)?對于第一個問題,已經很容易想到用緩存來解決搶購,避免直接操作數據庫,例如使用Redis。第二個問題,我們可以使用redis隊列來完畢,把要秒殺的商品放入到隊列中,由于pop操作是原子的,即使有很多用戶同時到達,也是依次執行,文獻鎖和事務在高并發下性能下降不久,當然還要考慮其他方面的東西,比如搶購頁面做成靜態的,通過ajax調用接口,其中也也許會出現一個用戶搶多次的情況,這時候需要再加上一個排隊隊列和搶購結果隊列及庫存隊列。高并發情況下,將用戶進入排隊隊列,用一個線程循環解決從排隊隊列取出一個用戶,判斷用戶是否已在搶購結果隊列,假如在,則已搶購,否則未搶購,庫存減1,寫HYPERLINK""\o"MySQL知識庫"數據庫,將用戶入結果隊列。55.購物車的原理購物車相稱于現實中超市的購物車,不同的是一個是實體車,一個是虛擬車而已。用戶可以在購物網站的不同頁面之間跳轉,以選購自己愛慕的商品,點擊購買時,該商品就自動保存到你的購物車中,反復選購后,最后將選中的所有商品放在購物車中統一到付款臺結賬,這也是盡量讓客戶體驗到現實生活中購物的感覺。服務器通過追蹤每個用戶的行動,以保證在結賬時每件商品都物有其主。重要涉及以下幾點:1、把商品添加到購物車,即訂購2、刪除購物車中已定購的商品3、修改購物車中某一本圖書的訂購數量4、清空購物車5、顯示購物車中商品清單及數量、價格實現購物車的關鍵在于服務器辨認每一個用戶并維持與他們的聯系。但是HTTP協議是一種“無狀態(Stateless)”的協議,因而服務器不能記住是誰在購買商品,當把商品加入購物車時,服務器也不知道購物車里原先有些什么,使得用戶在不同頁面間跳轉時購物車無法“隨身攜帶”,這都給購物車的實現導致了一定的困難。目前購物車的實現重要是通過cookie、session或結合數據庫的方式。下面分析一下它們的機制及作用。1.cookiecookie是由服務器產生,存儲在客戶端的一段信息。它定義了一種Web服務器在客戶端存儲和返回信息的機制,cookie文獻它包含域、途徑、生存期、和由服務器設立的變量值等內容。當用戶以后訪問同一個Web服務器時,瀏覽器會把cookie原樣發送給服務器。通過讓服務器讀取原先保存到客戶端的信息,網站可認為瀏覽者提供一系列的方便,例如在線交易過程中標記用戶身份、安全規定不高的場合避免用戶反復輸入名字和密碼、門戶網站的主頁定制、有針對性地投放廣告等等。運用cookie的特性,大大擴展了WEB應用程序的功能,不僅可以建立服務器與客戶機的聯系,由于cookie可以由服務器定制,因此還可以將購物信息生成cookie值存放在客戶端,從而實現購物車的功能。用基于cookie的方式實現服務器與瀏覽器之間的會話或購物車,有以下特點:1、cookie存儲在客戶端,且占用很少的資源,瀏覽器允許存放300個cookie,每個cookie的大小為4KB,足以滿足購物車的規定,同時也減輕了服務器的負荷;2、cookie為瀏覽器所內置,使用方便。即使用戶不小心關閉了瀏覽器窗口,只要在cookie定義的有效期內,購物車中的信息也不會丟失;3、cookie不是可執行文獻,所以不會以任何方式執行,因此也不會帶來病毒或襲擊用戶的系統;4、基于cookie的購物車規定用戶瀏覽器必須支持并設立為啟用cookie,否則購物車則失效;5、存在著關于cookie侵犯訪問者隱私權的爭論,因此有些用戶會嚴禁本機的cookie功能。2.sessionsession是實現購物車的另一種方法。session提供了可以保存和跟蹤用戶的狀態信息的功能,使當前用戶在session中定義的變量和對象能在頁面之間共享,但是不能為應用中其他用戶所訪問,它與cookie最重大的區別是,session將用戶在會話期間的私有信息存儲在服務器端,提高了安全性。在服務器生成session后,客戶端會生成一個sessionid辨認號保存在客戶端,以保持和服務器的同步。這個sessionid是只讀的,假如客戶端嚴禁cookie功能,session會通過在URL中附加參數,或隱含在表單中提交等其他方式在頁面間傳送。因此運用session實行對用戶的管理則更為安全、有效。同樣,運用session也能實現購物車,這種方式的特點是:1、session用新的機制保持與客戶端的同步,不依賴于客戶端設立;2、與cookie相比,session是存儲在服務器端的信息,因此顯得更為安全,因此可將身份標示,購物等信息存儲在session中;3、session會占用服務器資源,加大服務器端的負載,特別當并發用戶很多時,會生成大量的session,影響服務器的性能;4、由于session存儲的信息更敏感,并且是以文獻形式保存在服務器中,因此仍然存在著安全隱患。3.結合數據庫的方式這也是目前較普遍的模式,在這種方式中,數據庫承擔著存儲購物信息的作用,session或cookie則用來跟蹤用戶。這種方式具有以下特點:1、數據庫與cookie分別負責記錄數據和維持會話,能發揮各自的優勢,使安全性和服務器性能都得到了提高;2、每一個購物的行為,都要直接建立與數據庫的連接,直至對表的操作完畢后,連接才釋放。當并發用戶很多時,會影響數據庫的性能,因此,這對數據庫的性能提出了更高的規定;3、使cookie維持會話有賴客戶端的支持。各種方式的選擇:雖然cookie可用來實現購物車,但必須獲得瀏覽器的支持,再加上它是存儲在客戶端的信息,極易被獲取,所以這也限制了它存儲更多,更重要的信息。所以一般cookie只用來維持與服務器的會話,例如國內最大的當當網絡書店就是用cookie保持與客戶的聯系,但是這種方式最大的缺陷是假如客戶端不支持cookie就會使購物車失效。Session能很好地與交易雙方保持會話,可以忽視客戶端的設立。在購物車技術中得到了廣泛的應用。但session的文獻屬性使其仍然留有安全隱患。結合數據庫的方式雖然在一定限度上解決了上述的問題,但從上面的例子可以看出:在這種購物流程中涉及到對數據庫表的頻繁操作,特別是用戶每選購一次商品,都要與數據庫進行連接,當用戶很多的時候就加大了服務器與數據庫的負荷。56.redis消息隊列先進先出需要注意什么通常使用一個list來實現隊列操作,這樣有一個小限制,所以的任務統一都是先進先出,假如想優先解決某個任務就不太好解決了,這就需要讓隊列有優先級的概念,我們就可以優先解決高級別的任務,實現方式有以下幾種方式:1)單一列表實現:隊列正常的操作是左進右出(lpush,rpop)為了先解決高優先級任務,在碰到高級別任務時,可以直接插隊,直接放入隊列頭部(rpush),這樣,從隊列頭部(右側)獲取任務時,取到的就是高優先級的任務(rpop)2)使用兩個隊列,一個普通隊列,一個高級隊列,針對任務的級別放入不同的隊列,獲取任務時也很簡樸,redis的BRPOP命令可以按順序從多個隊列中取值,BRPOP會按照給出的key順序查看,并在找到的第一個非空list的尾部彈出一個元素,redis>BRPOPlist1list20?

list1做為高優先級任務隊列?list2做為普通任務隊列這樣就實現了先解決高優先級任務,當沒有高優先級任務時,就去獲取普通任務方式1最簡樸,但實際應用比較局限,方式3可以實現復雜優先級,但實現比較復雜,不利于維護

方式2是推薦用法,實際應用最為合適57、你負責的模塊有哪些難題在我負責的B2B電商項目中,當時我負責的是訂單模塊,由于客戶一次選擇了多家商戶的商品,最終生成了一個訂單,這樣我們平臺在給商戶結算時出現了不知道這比費用應當給哪個商戶,這時候我們小組通過討論,需要涉及到訂單拆分,也就是說用戶點擊支付后,假如有多件商品,并且不是同一家店鋪那么就要用到訂單的拆分,比如假如有兩件商品,并且不是同一店鋪就在本來的訂單號下在生成兩個子訂單號并修改訂單表中兩件商品的訂單號。最終實現了商品的分派管理,解決了我們的難題。我覺得在開發過程中,碰到的難題無非是兩個,一個是技術層次的,我認為,只要你有恒心,有熱心,沒有覺得不了的難題。另一個就是溝通問題,在任何地方任何時候溝通都是最重要的,特別是我們做開發的,不溝通好,會影響整個項目的進度,我本人是個非常還溝通的人,所以這點上也沒多大問題。58、用戶下單是怎么解決的判斷用戶有沒有登錄,在沒有登錄的情況下,不允許下單。登陸后,可進行下單并生成唯一的訂單號,此時訂單的狀態為未支付。59、電商的登錄是怎么登錄的分為普通登錄和第三方登錄這邊重要說一下第三方登錄吧,第三方登陸重要使用的是author協議,我就以QQ的第三方登陸為例來進行說明:當用戶在我們的站點請求QQ的第三方登陸時,我們站點會引導用戶跳轉到QQ的登陸授權界面,當用戶輸入QQ和密碼成功登錄以后會自動跳回到我們站點設立好的回調頁面,并附帶一個code參數,接著你使用code再次去請求QQ的授權頁面,就可以從中獲取到一個accesstoken(訪問令牌),通過這個access_token,我們可以調用QQ提供應我們的接口,比如獲取open_id,可以獲取用戶的基本信息。獲取到之后,我們需要拿用戶的授權信息和open_id和我們平臺的普通用戶進行綁定。這樣不管是普通用戶登陸還是第三方登陸用戶,都可以實現登陸。60、有負責開發app嗎我以前有過使用hybridAPP開發過APP,做過一個簡樸的廣場舞APP,但我重要參與到APP的接口編寫這塊中。61、開發app過程中碰到了什么難題hybridAPP開發過程中,前端知識是我的硬傷,以前,前端我一直都沒有花太多精力在上面,所以在使用hybridAPP開發過程中,頁面樣式總是調得很難看,后面我花了一周時間自己自學惡補了以下前端的東西,感覺收獲很大。尚有我記得以前在公司寫接口時,我們的安卓工程師認為他們APP的分頁效果,得我們接口這邊事先分好頁,然后他們再調用接口,其實分頁的頁碼需要他那邊提供應我們,但是他就認定了是我們這邊的問題,后面通過多次溝通和測試,我們共同完畢了這項任務。62、linux殺死一個進程命令是什么一方面,我們得知道要殺死的進程的進程ID,可以通過ps-ef|grep進程名稱查到當前運營的進程ID,然后通過kill命令殺死進程,如kill-93329表達強制殺死進程,當然尚有不同的等級,取決于中間的數

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論