1、時(shí)針走一圈,時(shí)針分針重合幾次
我們注重客戶提出的每個(gè)要求,我們充分考慮每一個(gè)細(xì)節(jié),我們積極的做好網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)服務(wù),我們努力開拓更好的視野,通過不懈的努力,創(chuàng)新互聯(lián)公司贏得了業(yè)內(nèi)的良好聲譽(yù),這一切,也不斷的激勵(lì)著我們更好的服務(wù)客戶。 主要業(yè)務(wù):網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),小程序開發(fā),網(wǎng)站開發(fā),技術(shù)開發(fā)實(shí)力,DIV+CSS,PHP及ASP,ASP.Net,SQL數(shù)據(jù)庫的技術(shù)開發(fā)工程師。
2、N*N的方格紙,里面有多少個(gè)正方形
3、2000萬個(gè)整數(shù),找出第五十大的數(shù)字?
4、百度POI中如何試下查找最近的商家功能(提示:坐標(biāo)鏡像+R樹)。
5、一個(gè)文件中有100萬個(gè)整數(shù),由空格分開,在程序中判斷用戶輸入的整數(shù)是否在此文件中。說出最優(yōu)的方法
6、兩個(gè)不重復(fù)的數(shù)組集合中,這兩個(gè)集合都是海量數(shù)據(jù),內(nèi)存中放不下,怎么求共同的元素?
7、燒一根不均勻的繩,從頭燒到尾總共需要1個(gè)小時(shí)?,F(xiàn)在有若干條材質(zhì)相同的繩子,問如何用燒繩的方法來計(jì)時(shí)一個(gè)小時(shí)十五分鐘呢?
8、萬億級別的兩個(gè)URL文件A和B,如何求出A和B的差集C(提示:Bit映射-hash分組-多文件讀寫效率-磁盤尋址以及應(yīng)用層面對尋址的優(yōu)化)
9、怎么在海量數(shù)據(jù)中找出重復(fù)次數(shù)最多的一個(gè)?
10、海量日志數(shù)據(jù),提取出某日訪問百度次數(shù)最多的那個(gè)IP。
11、在2.5億個(gè)整數(shù)中找出不重復(fù)的整數(shù),注,內(nèi)存不足以容納這2.5億個(gè)整數(shù)。
12、搜索引擎會通過日志文件把用戶每次檢索使用的所有檢索串都記錄下來,每個(gè)查詢串的長度為1-255字節(jié)。
13、有一個(gè)1G大小的一個(gè)文件,里面每一行是一個(gè)詞,詞的大小不超過16字節(jié),內(nèi)存限制大小是1M。返回頻數(shù)最高的100個(gè)詞。
14、有10個(gè)文件,每個(gè)文件1G,每個(gè)文件的每一行存放的都是用戶的query,每個(gè)文件的query都可能重復(fù)。要求你按照query的頻度排序。
15、給定a、b兩個(gè)文件,各存放50億個(gè)url,每個(gè)url各占64字節(jié),內(nèi)存限制是4G,讓你找出a、b文件共同的url?
16、一個(gè)文本文件,大約有一萬行,每行一個(gè)詞,要求統(tǒng)計(jì)出其中最頻繁出現(xiàn)的前10個(gè)詞,請給出思想,給出時(shí)間復(fù)雜度分析。
17、騰訊面試題:給40億個(gè)不重復(fù)的unsigned int的整數(shù),沒排過序的,然后再給一個(gè)數(shù),如何快速判斷這個(gè)數(shù)是否在那40億個(gè)數(shù)當(dāng)中?
18、100w個(gè)數(shù)中找出最大的100個(gè)數(shù)。
PHP程序員在面試的時(shí)候一般應(yīng)該抓住以下幾個(gè)點(diǎn)。
一、應(yīng)該介紹自己掌握的開發(fā)一種,主要介紹PHP語言的獨(dú)特語法以及如何使用,比如PHP語言會比CGI更快的執(zhí)行動(dòng)態(tài)頁面。
二、必須熟悉Oracle、Mysql等數(shù)據(jù)庫,并能簡單的介紹自己掌握的程度。由于php做出的動(dòng)態(tài)頁面比用其他語言做出來的頁面在執(zhí)行效率以及CGI方面高得多,所以你還需要在面試中說出自己的文檔撰寫能力很強(qiáng)。
三、PHP程序員應(yīng)該具備獨(dú)立分析和解決問題的能力,可以在自我介紹中講講自己曾經(jīng)遇到過的問題是如何解決的。讓面試官看到你的能力,這將會直接影響到你自我介紹的成功與否。
四、一個(gè)PHP程序員必須有良好的職業(yè)道德和工作態(tài)度,所以在面試中應(yīng)該盡量講自己在做項(xiàng)目時(shí)的認(rèn)真態(tài)度以及今后的工作規(guī)劃,表現(xiàn)出自己的進(jìn)取心。
五、還有關(guān)于溝通能力和理解能力的體現(xiàn),這個(gè)在與HR的交談中就可以表現(xiàn)出來,所以需要做的工作就是從容的有條理的把自我介紹說完,回答每一個(gè)問題時(shí)都應(yīng)該簡潔明了,關(guān)于自我介紹可以提前做個(gè)草稿,背一下。
六、團(tuán)隊(duì)合作能力也是企業(yè)非??粗氐?,在培訓(xùn)中老師一般都會帶領(lǐng)大家做項(xiàng)目,大的項(xiàng)目一般會分小組,每個(gè)人都有相對應(yīng)的任務(wù),這就模擬了公司中的團(tuán)隊(duì)合作,在自我介紹過程中要把做項(xiàng)目的具體流程以及相互協(xié)作的過程說出來,讓HR看到自己具備團(tuán)隊(duì)合作的能力。
七、最后就是執(zhí)行力,每當(dāng)任務(wù)分配下來的時(shí)候該如何執(zhí)行,還有自己講過職業(yè)規(guī)劃后該如何執(zhí)行,還有在學(xué)習(xí)的過程中是如何人字形的,遇到困難又是如何執(zhí)行的,這些都可以體現(xiàn)出php程序員的執(zhí)行力,回答的時(shí)候抓住發(fā)現(xiàn)及時(shí)尋找原因,快速展開行動(dòng)的這個(gè)主線即可。
八、最重要的是你的能力、技術(shù)以及自己的項(xiàng)目
php面試項(xiàng)目遇到的難點(diǎn),
準(zhǔn)備可能遇到的問題,
1.消息隊(duì)列
答:消息隊(duì)列:是在消息的傳輸過程中保存消息的容器。消息隊(duì)列管理器在將消息從它的源中繼到它的目標(biāo)時(shí)充當(dāng)中間人。隊(duì)列的主要目的是提供路由并保證消息的傳遞;如果發(fā)送消息時(shí)接收者不可用,消息隊(duì)列會保留消息,直到可以成功地傳遞它。
應(yīng)用場景:異步處理,應(yīng)用解耦,流量削鋒和消息通訊四個(gè)場景;
2.全文索引
全文檢索大體分兩個(gè)過程,索引創(chuàng)建?(Indexing)?和搜索索引?(Search)?。
索引創(chuàng)建:將現(xiàn)實(shí)世界中所有的結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)提取信息,創(chuàng)建索引的過程。
搜索索引:就是得到用戶的查詢請求,搜索創(chuàng)建的索引,然后返回結(jié)果的過程。
Redis與Memcached的區(qū)別
傳統(tǒng)MySQL+ Memcached架構(gòu)遇到的問題
實(shí)際MySQL是適合進(jìn)行海量數(shù)據(jù)存儲的,通過Memcached將熱點(diǎn)數(shù)據(jù)加載到cache,加速訪問,很多公司都曾經(jīng)使用過這樣的架構(gòu),但隨著業(yè)務(wù)數(shù)據(jù)量的不斷增加,和訪問量的持續(xù)增長,我們遇到了很多問題:
1.MySQL需要不斷進(jìn)行拆庫拆表,Memcached也需不斷跟著擴(kuò)容,擴(kuò)容和維護(hù)工作占據(jù)大量開發(fā)時(shí)間。
2.Memcached與MySQL數(shù)據(jù)庫數(shù)據(jù)一致性問題。
3.Memcached數(shù)據(jù)命中率低或down機(jī),大量訪問直接穿透到DB,MySQL無法支撐。
4.跨機(jī)房cache同步問題。
眾多NoSQL百花齊放,如何選擇
最近幾年,業(yè)界不斷涌現(xiàn)出很多各種各樣的NoSQL產(chǎn)品,那么如何才能正確地使用好這些產(chǎn)品,最大化地發(fā)揮其長處,是我們需要深入研究和思考的
問題,實(shí)際歸根結(jié)底最重要的是了解這些產(chǎn)品的定位,并且了解到每款產(chǎn)品的tradeoffs,在實(shí)際應(yīng)用中做到揚(yáng)長避短,總體上這些NoSQL主要用于解
決以下幾種問題
1.少量數(shù)據(jù)存儲,高速讀寫訪問。此類產(chǎn)品通過數(shù)據(jù)全部in-momery 的方式來保證高速訪問,同時(shí)提供數(shù)據(jù)落地的功能,實(shí)際這正是Redis最主要的適用場景。
2.海量數(shù)據(jù)存儲,分布式系統(tǒng)支持,數(shù)據(jù)一致性保證,方便的集群節(jié)點(diǎn)添加/刪除。
3.這方面最具代表性的是dynamo和bigtable 2篇論文所闡述的思路。前者是一個(gè)完全無中心的設(shè)計(jì),節(jié)點(diǎn)之間通過gossip方式傳遞集群信息,數(shù)據(jù)保證最終一致性,后者是一個(gè)中心化的方案設(shè)計(jì),通過類似一個(gè)分布式鎖服務(wù)來保證強(qiáng)一致性,數(shù)據(jù)寫入先寫內(nèi)存和redo log,然后定期compat歸并到磁盤上,將隨機(jī)寫優(yōu)化為順序?qū)懀岣邔懭胄阅堋?/p>
4.Schema free,auto-sharding等。比如目前常見的一些文檔數(shù)據(jù)庫都是支持schema-free的,直接存儲json格式數(shù)據(jù),并且支持auto-sharding等功能,比如mongodb。
面對這些不同類型的NoSQL產(chǎn)品,我們需要根據(jù)我們的業(yè)務(wù)場景選擇最合適的產(chǎn)品。
Redis適用場景,如何正確的使用
前面已經(jīng)分析過,Redis最適合所有數(shù)據(jù)in-momory的場景,雖然Redis也提供持久化功能,但實(shí)際更多的是一個(gè)disk-
backed的功能,跟傳統(tǒng)意義上的持久化有比較大的差別,那么可能大家就會有疑問,似乎Redis更像一個(gè)加強(qiáng)版的Memcached,那么何時(shí)使用
Memcached,何時(shí)使用Redis呢?
如果簡單地比較Redis與Memcached的區(qū)別,大多數(shù)都會得到以下觀點(diǎn):
1 Redis不僅僅支持簡單的k/v類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
2 Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
3 Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。
拋開這些,可以深入到Redis內(nèi)部構(gòu)造去觀察更加本質(zhì)的區(qū)別,理解Redis的設(shè)計(jì)。
在
Redis中,并不是所有的數(shù)據(jù)都一直存儲在內(nèi)存中的。這是和Memcached相比一個(gè)最大的區(qū)別。Redis只會緩存所有的
key的信息,如果Redis發(fā)現(xiàn)內(nèi)存的使用量超過了某一個(gè)閥值,將觸發(fā)swap的操作,Redis根據(jù)“swappability =
age*log(size_in_memory)”計(jì)
算出哪些key對應(yīng)的value需要swap到磁盤。然后再將這些key對應(yīng)的value持久化到磁盤中,同時(shí)在內(nèi)存中清除。這種特性使得Redis可以
保持超過其機(jī)器本身內(nèi)存大小的數(shù)據(jù)。當(dāng)然,機(jī)器本身的內(nèi)存必須要能夠保持所有的key,畢竟這些數(shù)據(jù)是不會進(jìn)行swap操作的。同時(shí)由于Redis將內(nèi)存
中的數(shù)據(jù)swap到磁盤中的時(shí)候,提供服務(wù)的主線程和進(jìn)行swap操作的子線程會共享這部分內(nèi)存,所以如果更新需要swap的數(shù)據(jù),Redis將阻塞這個(gè)
操作,直到子線程完成swap操作后才可以進(jìn)行修改。
使用Redis特有內(nèi)存模型前后的情況對比:
VM off: 300k keys, 4096 bytes values: 1.3G used
VM on: 300k keys, 4096 bytes values: 73M used
VM off: 1 million keys, 256 bytes values: 430.12M used
VM on: 1 million keys, 256 bytes values: 160.09M used
VM on: 1 million keys, values as large as you want, still: 160.09M used
當(dāng)
從Redis中讀取數(shù)據(jù)的時(shí)候,如果讀取的key對應(yīng)的value不在內(nèi)存中,那么Redis就需要從swap文件中加載相應(yīng)數(shù)據(jù),然后再返回給請求方。
這里就存在一個(gè)I/O線程池的問題。在默認(rèn)的情況下,Redis會出現(xiàn)阻塞,即完成所有的swap文件加載后才會相應(yīng)。這種策略在客戶端的數(shù)量較小,進(jìn)行
批量操作的時(shí)候比較合適。但是如果將Redis應(yīng)用在一個(gè)大型的網(wǎng)站應(yīng)用程序中,這顯然是無法滿足大并發(fā)的情況的。所以Redis運(yùn)行我們設(shè)置I/O線程
池的大小,對需要從swap文件中加載相應(yīng)數(shù)據(jù)的讀取請求進(jìn)行并發(fā)操作,減少阻塞的時(shí)間。
如果希望在海量數(shù)據(jù)的環(huán)境中使用好Redis,我相信理解Redis的內(nèi)存設(shè)計(jì)和阻塞的情況是不可缺少的。
補(bǔ)充的知識點(diǎn):
memcached和redis的比較
1 網(wǎng)絡(luò)IO模型
Memcached是多線程,非阻塞IO復(fù)用的網(wǎng)絡(luò)模型,分為監(jiān)聽主線程和worker子線程,監(jiān)聽線程監(jiān)聽網(wǎng)絡(luò)連接,接受請求后,將連接描述
字pipe 傳遞給worker線程,進(jìn)行讀寫IO, 網(wǎng)絡(luò)層使用libevent封裝的事件庫,多線程模型可以發(fā)揮多核作用,但是引入了cache
coherency和鎖的問題,比如,Memcached最常用的stats
命令,實(shí)際Memcached所有操作都要對這個(gè)全局變量加鎖,進(jìn)行計(jì)數(shù)等工作,帶來了性能損耗。
(Memcached網(wǎng)絡(luò)IO模型)
Redis使用單線程的IO復(fù)用模型,自己封裝了一個(gè)簡單的AeEvent事件處理框架,主要實(shí)現(xiàn)了epoll、kqueue和select,
對于單純只有IO操作來說,單線程可以將速度優(yōu)勢發(fā)揮到最大,但是Redis也提供了一些簡單的計(jì)算功能,比如排序、聚合等,對于這些操作,單線程模型實(shí)
際會嚴(yán)重影響整體吞吐量,CPU計(jì)算過程中,整個(gè)IO調(diào)度都是被阻塞住的。
2.內(nèi)存管理方面
Memcached使用預(yù)分配的內(nèi)存池的方式,使用slab和大小不同的chunk來管理內(nèi)存,Item根據(jù)大小選擇合適的chunk存儲,內(nèi)
存池的方式可以省去申請/釋放內(nèi)存的開銷,并且能減小內(nèi)存碎片產(chǎn)生,但這種方式也會帶來一定程度上的空間浪費(fèi),并且在內(nèi)存仍然有很大空間時(shí),新的數(shù)據(jù)也可
能會被剔除,原因可以參考Timyang的文章:
Redis使用現(xiàn)場申請內(nèi)存的方式來存儲數(shù)據(jù),并且很少使用free-list等方式來優(yōu)化內(nèi)存分配,會在一定程度上存在內(nèi)存碎片,Redis
跟據(jù)存儲命令參數(shù),會把帶過期時(shí)間的數(shù)據(jù)單獨(dú)存放在一起,并把它們稱為臨時(shí)數(shù)據(jù),非臨時(shí)數(shù)據(jù)是永遠(yuǎn)不會被剔除的,即便物理內(nèi)存不夠,導(dǎo)致swap也不會剔
除任何非臨時(shí)數(shù)據(jù)(但會嘗試剔除部分臨時(shí)數(shù)據(jù)),這點(diǎn)上Redis更適合作為存儲而不是cache。
3.數(shù)據(jù)一致性問題
Memcached提供了cas命令,可以保證多個(gè)并發(fā)訪問操作同一份數(shù)據(jù)的一致性問題。 Redis沒有提供cas 命令,并不能保證這點(diǎn),不過Redis提供了事務(wù)的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷。
4.存儲方式及其它方面
Memcached基本只支持簡單的key-value存儲,不支持枚舉,不支持持久化和復(fù)制等功能
Redis除key/value之外,還支持list,set,sorted set,hash等眾多數(shù)據(jù)結(jié)構(gòu),提供了KEYS
進(jìn)行枚舉操作,但不能在線上使用,如果需要枚舉線上數(shù)據(jù),Redis提供了工具可以直接掃描其dump文件,枚舉出所有數(shù)據(jù),Redis還同時(shí)提供了持久化和復(fù)制等功能。
5.關(guān)于不同語言的客戶端支持
在不同語言的客戶端方面,Memcached和Redis都有豐富的第三方客戶端可供選擇,不過因?yàn)镸emcached發(fā)展的時(shí)間更久一些,目
前看在客戶端支持方面,Memcached的很多客戶端更加成熟穩(wěn)定,而Redis由于其協(xié)議本身就比Memcached復(fù)雜,加上作者不斷增加新的功能
等,對應(yīng)第三方客戶端跟進(jìn)速度可能會趕不上,有時(shí)可能需要自己在第三方客戶端基礎(chǔ)上做些修改才能更好的使用。
根據(jù)以上比較不難看出,當(dāng)我們不希望數(shù)據(jù)被踢出,或者需要除key/value之外的更多數(shù)據(jù)類型時(shí),或者需要落地功能時(shí),使用Redis比使用Memcached更合適。
關(guān)于Redis的一些周邊功能
Redis除了作為存儲之外還提供了一些其它方面的功能,比如聚合計(jì)算、pubsub、scripting等,對于此類功能需要了解其實(shí)現(xiàn)原
理,清楚地了解到它的局限性后,才能正確的使用,比如pubsub功能,這個(gè)實(shí)際是沒有任何持久化支持的,消費(fèi)方連接閃斷或重連之間過來的消息是會全部丟
失的,又比如聚合計(jì)算和scripting等功能受Redis單線程模型所限,是不可能達(dá)到很高的吞吐量的,需要謹(jǐn)慎使用。
總的來說Redis作者是一位非常勤奮的開發(fā)者,可以經(jīng)??吹阶髡咴趪L試著各種不同的新鮮想法和思路,針對這些方面的功能就要求我們需要深入了解后再使用。
總結(jié):
1.Redis使用最佳方式是全部數(shù)據(jù)in-memory。
2.Redis更多場景是作為Memcached的替代者來使用。
3.當(dāng)需要除key/value之外的更多數(shù)據(jù)類型支持時(shí),使用Redis更合適。
4.當(dāng)存儲的數(shù)據(jù)不能被剔除時(shí),使用Redis更合適。
談?wù)凪emcached與Redis(一)
1. Memcached簡介
Memcached是以LiveJurnal旗下Danga Interactive公司的Bard
Fitzpatric為首開發(fā)的高性能分布式內(nèi)存緩存服務(wù)器。其本質(zhì)上就是一個(gè)內(nèi)存key-value數(shù)據(jù)庫,但是不支持?jǐn)?shù)據(jù)的持久化,服務(wù)器關(guān)閉之后數(shù)
據(jù)全部丟失。Memcached使用C語言開發(fā),在大多數(shù)像Linux、BSD和Solaris等POSIX系統(tǒng)上,只要安裝了libevent即可使
用。在Windows下,它也有一個(gè)可用的非官方版本()。Memcached
的客戶端軟件實(shí)現(xiàn)非常多,包括C/C++, PHP, Java, Python, Ruby, Perl, Erlang,
Lua等。當(dāng)前Memcached使用廣泛,除了LiveJournal以外還有Wikipedia、Flickr、Twitter、Youtube和
WordPress等。
在Window系統(tǒng)下,Memcached的安裝非常方便,只需從以上給出的地址下載可執(zhí)行軟件然后運(yùn)行memcached.exe –d
install即可完成安裝。在Linux等系統(tǒng)下,我們首先需要安裝libevent,然后從獲取源碼,make make
install即可。默認(rèn)情況下,Memcached的服務(wù)器啟動(dòng)程序會安裝到/usr/local/bin目錄下。在啟動(dòng)Memcached時(shí),我們可
以為其配置不同的啟動(dòng)參數(shù)。
1.1 Memcache配置
Memcached服務(wù)器在啟動(dòng)時(shí)需要對關(guān)鍵的參數(shù)進(jìn)行配置,下面我們就看一看Memcached在啟動(dòng)時(shí)需要設(shè)定哪些關(guān)鍵參數(shù)以及這些參數(shù)的作用。
1)-p num Memcached的TCP監(jiān)聽端口,缺省配置為11211;
2)-U num Memcached的UDP監(jiān)聽端口,缺省配置為11211,為0時(shí)表示關(guān)閉UDP監(jiān)聽;
3)-s file Memcached監(jiān)聽的UNIX套接字路徑;
4)-a mask 訪問UNIX套接字的八進(jìn)制掩碼,缺省配置為0700;
5)-l addr 監(jiān)聽的服務(wù)器IP地址,默認(rèn)為所有網(wǎng)卡;
6)-d 為Memcached服務(wù)器啟動(dòng)守護(hù)進(jìn)程;
7)-r 最大core文件大?。?/p>
8)-u username 運(yùn)行Memcached的用戶,如果當(dāng)前為root的話需要使用此參數(shù)指定用戶;
9)-m num 分配給Memcached使用的內(nèi)存數(shù)量,單位是MB;
10)-M 指示Memcached在內(nèi)存用光的時(shí)候返回錯(cuò)誤而不是使用LRU算法移除數(shù)據(jù)記錄;
11)-c num 最大并發(fā)連數(shù),缺省配置為1024;
12)-v –vv –vvv 設(shè)定服務(wù)器端打印的消息的詳細(xì)程度,其中-v僅打印錯(cuò)誤和警告信息,-vv在-v的基礎(chǔ)上還會打印客戶端的命令和相應(yīng),-vvv在-vv的基礎(chǔ)上還會打印內(nèi)存狀態(tài)轉(zhuǎn)換信息;
13)-f factor 用于設(shè)置chunk大小的遞增因子;
14)-n bytes 最小的chunk大小,缺省配置為48個(gè)字節(jié);
15)-t num Memcached服務(wù)器使用的線程數(shù),缺省配置為4個(gè);
16)-L 嘗試使用大內(nèi)存頁;
17)-R 每個(gè)事件的最大請求數(shù),缺省配置為20個(gè);
18)-C 禁用CAS,CAS模式會帶來8個(gè)字節(jié)的冗余;
2. Redis簡介
Redis是一個(gè)開源的key-value存儲系統(tǒng)。與Memcached類似,Redis將大部分?jǐn)?shù)據(jù)存儲在內(nèi)存中,支持的數(shù)據(jù)類型包括:字
符串、哈希表、鏈表、集合、有序集合以及基于這些數(shù)據(jù)類型的相關(guān)操作。Redis使用C語言開發(fā),在大多數(shù)像Linux、BSD和Solaris等
POSIX系統(tǒng)上無需任何外部依賴就可以使用。Redis支持的客戶端語言也非常豐富,常用的計(jì)算機(jī)語言如C、C#、C++、Object-C、PHP、
Python、Java、Perl、Lua、Erlang等均有可用的客戶端來訪問Redis服務(wù)器。當(dāng)前Redis的應(yīng)用已經(jīng)非常廣泛,國內(nèi)像新浪、淘
寶,國外像Flickr、Github等均在使用Redis的緩存服務(wù)。
Redis的安裝非常方便,只需從獲取源碼,然后make make
install即可。默認(rèn)情況下,Redis的服務(wù)器啟動(dòng)程序和客戶端程序會安裝到/usr/local/bin目錄下。在啟動(dòng)Redis服務(wù)器時(shí),我們
需要為其指定一個(gè)配置文件,缺省情況下配置文件在Redis的源碼目錄下,文件名為redis.conf。
某大公司的PHP面試題
管理提醒: 本帖被 haowubai 執(zhí)行取消置頂操作(2009-07-30)
1. 如何用php的環(huán)境變量得到一個(gè)網(wǎng)頁地址的內(nèi)容?ip地址又要怎樣得到?
[php]
echo $_SERVER ['PHP_SELF'];
echo $_SERVER ['SERVER_ADDR'];
[/php]
2. 求兩個(gè)日期的差數(shù),例如2007-2-5 ~ 2007-3-6 的日期差數(shù)
[php]
$begin=strtotime('2007-2-5');
$end=strtotime('2007-3-6');
echo ($end-$begin)/(24*3600);
[/php]
3. 請寫一個(gè)函數(shù),實(shí)現(xiàn)以下功能:
字符串“open_door” 轉(zhuǎn)換成 “OpenDoor”、”make_by_id” 轉(zhuǎn)換成 ”MakeById”。
[php]
function changeStyle( $str) {
/*$str = str_replace ( "_", " ", $str );
$str = ucwords ( $str );
$str = str_replace ( " ", "", $str );
return $str;*/
$arrStr=explode('_',$str);
foreach($arrStr as $key=$value){
$arrStr[$key]=strtoupper(substr($value,0,1)).substr($value,1);
}
return implode('',$arrStr);
}
$s = "open_door";
echo changeStyle ( $s );
[/php]
4. 要求寫一段程序,實(shí)現(xiàn)以下數(shù)組$arr1轉(zhuǎn)換成數(shù)組$arr2:
[php]$arr1 = array (
'0' = array ('fid' = 1, 'tid' = 1, 'name' ='Name1' ),
'1' = array ('fid' = 1, 'tid' = 2 , 'name' ='Name2' ),
'2' = array ('fid' = 1, 'tid' = 5 , 'name' ='Name3' ),
'3' = array ('fid' = 1, 'tid' = 7 , 'name' ='Name4' ),
'4' = array ('fid' = 3, 'tid' = 9, 'name' ='Name5' )
);
$arr2 = array (
'0' = array (
'0' = array ( 'tid' = 1, 'name' = 'Name1'),
'1' = array ( 'tid' = 2, 'name' = 'Name2'),
'2' = array ( 'tid' = 5, 'name' = 'Name3'),
'3' = array ( 'tid' = 7, 'name' = 'Name4')
),
'1' = array (
'0' = array ( 'tid' = 9, 'name' = 'Name5' )
)
);
?php
$arr1 = array (
'0' = array ('fid' = 1, 'tid' = 1, 'name' ='Name1' ),
'1' = array ('fid' = 1, 'tid' = 2 , 'name' ='Name2' ),
'2' = array ('fid' = 1, 'tid' = 5 , 'name' ='Name3' ),
'3' = array ('fid' = 1, 'tid' = 7 , 'name' ='Name4' ),
'4' = array ('fid' = 3, 'tid' = 9, 'name' ='Name5' )
);
function changeArrayStyle($arr){
foreach($arr as $key=$value){
$result[$value['fid']][]=$value;
}
return array_values($result);
}
$arr2=changeArrayStyle($arr1);
echo "pre";
var_dump($arr2);
[/php]
5. 請簡述數(shù)據(jù)庫設(shè)計(jì)的范式及應(yīng)用。
一般第3范式就足以,用于表結(jié)構(gòu)的優(yōu)化,這樣做既可以避免應(yīng)用程序過于復(fù)雜同時(shí)也避免了SQL語句過于龐大所造成系統(tǒng)效率低下。
ANSWER:
第一范式:若關(guān)系模式R的每一個(gè)屬性是不可再分解的,再屬于第一范式。
第二范式:若R屬于第一范式,且所有的非碼屬性都完全函數(shù)依賴于碼屬性,則為第二范式。
第三范式:若R屬于第二范式,且所有的非碼屬性沒有一個(gè)是傳遞函數(shù)依賴于候選碼,則屬于第三范式。
6.一個(gè)表中的Id有多個(gè)記錄,把所有這個(gè)id的記錄查出來,并顯示共有多少條記錄數(shù),用SQL語句及視圖、存儲過程分別實(shí)現(xiàn)。
存儲過程:
[php]
DELIMITER //
create procedure proc_countNum(in columnId int,out rowsNo int)
begin
select count(*) into rowsNo from member where member_id=columnId;
end
call proc_countNum(1,@no);
select @no;
[/php]
視圖:
create view v_countNum as select member_id,count(*) as countNum from member group by member_id
select countNum from v_countNum where member_id=1
7 表中有A B C三列,用SQL語句實(shí)現(xiàn):當(dāng)A列大于B列時(shí)選擇A列否則選擇B列,當(dāng)B列大于C列時(shí)選擇B列否則選擇C列。
[php]select
case
when first_namemiddle_name then
case when first_namelast_name then first_name
else last_name end
else
case when middle_namelast_name then middle_name else last_name
end
end as name
from member
[/php]
8請簡述項(xiàng)目中優(yōu)化sql語句執(zhí)行效率的方法,從哪些方面,sql語句性能如何分析?
ANSWER: sql優(yōu)化有鳥用,不如直接加索引。
9 如果模板是用smarty模板。怎樣用section語句來顯示一個(gè)名為$data的數(shù)組。比如:
[php]$data = array(
[0] = array( [id]=8 [name]=’name1′)
[1] = array( [id]=10 [name]=’name2′)
[2] = array( [id]=15 [name]=’name3′)
……
)[/php]
寫出在模板頁的代碼? 若用foreach語句又要怎樣顯示呢?
占無答案.
10 寫一個(gè)函數(shù),能夠遍歷一個(gè)文件夾下的所有文件和子文件夾。(目錄操作)
[php] ?php
$d = dir(dirname(__file__));
//echo "Handle: " . $d-handle . "\n";
//echo "Path: " . $d-path . "\n";
while ( false !== ($entry = $d-read ()) ) {
echo $entry . "br /";
}
$d-close ();
[/php]
11 兩張表 city表和province表。分別為城市與省份的關(guān)系表。
city:
id City Provinceid
1 廣州 1
2 深圳 1
3 惠州 1
4 長沙 2
5 武漢 3
………. 廣州
province:
id Province
1 廣東
2 湖南
3 湖北
……….
(1) 寫一條sql語句關(guān)系兩個(gè)表,實(shí)現(xiàn):顯示城市的基本信息。?
(2) 顯示字段:城市id ,城市名, 所屬省份 。
如:
Id(城市id) Cityname(城市名) Privence(所屬省份)
。。。。。。。。。
。。。。。。。。。
(2)如果要統(tǒng)計(jì)每個(gè)省份有多少個(gè)城市,請用group by 查詢出來。?
顯示字段:省份id ,省份名,包含多少個(gè)城市。
ANSWER:
1.select A.id,A.Cityname,B.Province from city A,province B where A.provinceid=B.id
2.select B.id,B.Province,count(*) as num from city A,province B where A.provinceid=B.id group by B.id
12. 按照你的經(jīng)驗(yàn)請簡述軟件工程進(jìn)行軟件開發(fā)的步驟。以下工具Rational Rose、PowerDesigner、Project、VSS或CVS、TestDirector使用過那種,有缺點(diǎn)是什么?
公司用dbdesigner及cvs,測試管理工具用的是Mantis
13. 請簡述操作系統(tǒng)的線程與進(jìn)程的區(qū)別。列舉LINUX下面你使用過的軟件?
14. 請使用偽語言結(jié)合數(shù)據(jù)結(jié)構(gòu)冒泡排序法對以下一組數(shù)據(jù)進(jìn)行排序 10 2 36 14 10 25 23 85 99 45。
[php]function bubble_sort( $arr){
$number=count($arr);
for($i=0;$i$number-1;$i++){
for($j=0;$j$number-1-$i;$j++){
if($arr[$j]$arr[$j+1]){
$tmp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$tmp;
}
}
}
}
$str="10 2 36 14 10 25 23 85 99 45";
$arr=explode(" ",$str);
bubble_sort($arr);
echo "pre";
var_dump($arr);
[/php]