從大往小說:
服務器結構層面
一、首先是應用服務器和數據服務器分離
二、應用服務器能夠做爲集羣由一臺或多臺nginx服務器使用負載均衡共同管理,這其中涉及到應用服務器集羣共享session等同步問題。多臺nginx也能夠由其餘安裝了負載均衡軟件的機器管理。也就是三層結構:安裝了負載均衡軟件的機器(主要有兩種經常使用的軟件,lvs和keepalived)——多臺nginx——應用服務器集羣。這裏說的都是軟件實現的負載均衡,如今硬件 的負載勻衡效果是最好的可是太貴了,能夠百度一下負載均衡的硬件最少10w+(最便宜的能用嗎?)。
三、數據庫服務器組成集羣進行讀寫分離,主從同步。對mysql來講,可讓多個master分別做爲對方的slave,避免單臺master出現問題整個集羣都壞了。master使用 innodb引擎進行事務和除查詢以外的操做(由innodb的特性決定),slave使用myisam引擎進行查詢操做。整個mysql集羣一樣能夠被負載均衡(lvs加keepalived)。
nginx+tomcat+mysql挺好的,適合本身拿來玩。Apache(阻塞)能夠取代nginx(異步非阻塞),可是併發數3w後效果比nginx差不少,其實lamp(linux+apache+mysql+php)這種主流結構的思路也是免費+併發+靈活。
應用中的細節方面:
數據庫配置和sql語句優化
一、對於innodb引擎來講,每次alter操做都至關於整表重建,把引發結構變動的sql語句調整爲一句話,可以減小數據庫的執行時間。
二、order by的處理,delete insert的合併
三、注意數據庫的緩存,減小io。配置mysql的一些參數起到優化做用
三、使用preparedstatement對象,能夠預編譯sql語句節省時間,還能夠避免sql注入
四、常用的一組命令設置爲存儲過程,省去了每條sql語句的編譯過程
五、若是數據是經過多表關聯獲取,那麼使用join,爲了提升join性能,最好在join列建立索引,而且join條件的這些列最好使用相同的
數據類型和定義
六、評估數據的讀寫行爲是否適用新的壓縮特性,若是能夠建議執行create table時指定row_format=compressed選項提升讀寫性能。
七、myisam引擎能夠把表設爲靜態格式表,空間換時間,使用dynamic格式保存大數據類型(blob、text)更有效率
八、對數據庫的操做會在mysql庫(庫名叫mysql)中的各個priv表中查找權限,順序是user、db、table、column。所以權限粒度越大反而會起到優化做用。
程序優化
一、使用線程池和數據庫鏈接池,使用緩存
二、同步代碼爲了線程吞吐量可使用stampedlock(jdk8新出的lock實現類),jdk6及之後的synchronized關鍵字和reentrantlock類的效率已經差很少了,jdk5仍是使用reentrantlock性能更好
三、對於同步的數據可使用分段加鎖,concurrenthashmap就是這麼幹的
四、避免在循環中加鎖(阻塞和喚醒很費時間),不如直接把整個循環加鎖(若是不影響多線程間的邏輯關係)
五、減小鎖持有的時間,多個線程儘可能以相同的順序去獲取資源
六、同步集合類儘可能使用jdk自帶的concurrent包下的同步集合類,性能比普通的線程安全集合類好不少
七、使用nio,避免阻塞(若是應用須要使用大量io操做)php
http://blog.chinaunix.net/uid-30592332-id-5749869.htmlhtml