標籤:資訊儲存 傳統 spring 簡化 ann 虛擬機器主機 名稱 優點 null
一、Java基礎
1. 集合架構
A)集合中泛型優點?
1)HashMap---允許一個鍵為null,允許多個值為null,預設容量是16,載入因子是0.75f,每次擴容一倍,是一種非同步式線程不安全的映射。
2)Hashtable---不允許索引值為null,預設初始容量是11,載入因子是0.75f,是一種同步式安全執行緒的映射(一個Hashtable在同一時間只能被一個線程訪問)。
3)ConcurrentHashMap---非同步式安全執行緒的映射(一個線程在同一時間只能訪問該Map中的一個索引值對,不同線程在同一時間可以訪問同一Map的不同索引值對)
HashMap, LinkedList, ArrayList底層
手寫LingkedList、ArrayList、Quenue、Stack
2. 設計模式
1)單例模式——在全域過程中只存在該類唯一的一個執行個體。
需要把建構函式私人化,提供一個本類的靜態變數,並且通過對應的靜態方法來擷取這個唯一的靜態變數
餓漢式:不存在多線程並發安全問題,可能會導致記憶體的浪費
懶漢式:相對節省記憶體,存線上程安全問題
Spring架構中bean的建立預設就是單例的
2)裝飾模式---利用一個統一的父類或者介面,將一個子類對象作為參數來構造另一個子類對象,對其中的方法做改變或者增強
3)代理模式
靜態代理產生類
動態代理產生對象,
4)原廠模式
3. JDK環境配置
Java_home指向java jdk安裝目錄,通知某些軟體如何找到jdk安裝目錄;
Classpath表示類搜尋路徑,可以使用點(.);
Path指向jdk的bin目錄,java、javac等命令就安裝在此目錄中
4. 泛型
1. 它提供了編譯期的型別安全,確保你只能把正確類型的對象放入集合中,避免了在運行時出現ClassCastException。
2. 泛型中的限定萬用字元和非限定萬用字元
一種是<? extends T>它通過確保類型必須是T的子類來設定類型的上界,另一種是<? super T>它通過確保類型必須是T的父類來設定類型的下界。
5. Tomcat的連接埠在哪個檔案的哪個標籤修改?
6. 多線程+死結+生產消費模型
7. redis基本類型
8. http, tcp等協議
9. 冒泡排序,
10. jdk1.8 1.9新特性
從JDK1.8開始,介面中允許定義實體方法,但是必須使用default修飾;
在介面中也允許定義靜態方法;
Lambda運算式:實際上是在重寫一個抽象方法;
13. Debug
F5---鑽入方法的內;F6---下一步;F7--從方法中跳出繼續執行;F8---執行到下一個斷點
11. 反射
靜態編譯:在編譯時間確定類型,綁定對象。
動態編譯:運行時確定類型,綁定對象。動態編譯最大限度發揮了java的靈活性,體現了多態的應用,可以降低類之間的藕合性。
而反射就是運用了動態編譯,在程式運行狀態中, 通過反射機制,擷取類的位元組碼,對於任意一個類或者對象, 我們都能剖析它,瞭解它,都能夠知道它的所有屬性和方法; 都能夠調用它的任意一個方法和屬性。
例子:factory原廠模式(fruit介面,很多實作類別(如蘋果類...),如果不用反射,factory會很龐大,用反射,通過傳入類名,建立對象)
反射在ssm中的應用:
1)mybatis在進行resultMap或resultType映射時;
2)Spring設定檔中bean的建立
3)SpringMVC攔截器
常用方法:Class.forName("java.util.List"); newInstance();getMethod();
getConstructor(); getDeclaredField(String filedName)
二、JVM
三、資料庫
1. Sql語句執行順序:from--where--group by--having--select--order by
2. 資料庫事務的四個特性及含義
原子性:整個事務中的所有操作,要麼全部完成,要麼全部不完成;
一致性:在事務開始之前和事務結束以後,資料庫的完整性條件約束沒有被破壞;
隔離性:在同一時間僅有一個請求用於同一資料;
持久性:在事務完成後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中
3. sql最佳化:
對查詢進行最佳化:
A)要盡量避免全表掃描,首先應考慮在 where及 order by 涉及的列上建立索引;但索引不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引
B)盡量避免在where子句中
進行null值判斷(最好不要給資料庫留null)、
使用!=或<>操作符、
使用模糊查詢like、
對欄位進行運算式操作或函數操作
這都將導致引擎放棄使用索引而進行全表掃描
C)盡量避免在where子句中使用or來串連查詢條件,如果一個欄位有索引,一個欄位沒有索引,將導致引擎放棄使用索引而進行全表掃描;可以使用union all來代替or;
D)慎用in和not in,這也會導致全表掃描;對於連續的數值,可以用between代替in;很多時候可以用exists代替in;
E)查詢時,用具體的欄位代替*
其他:
A)如果只更改1、2個欄位,不要Update全部欄位,否則頻繁調用會引起明顯的效能消耗,同時帶來大量日誌。
B)儘可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長欄位儲存空間小,可以節省儲存空間,其次對於查詢來說,在一個相對較小的欄位內搜尋效率顯然要高些。
4. 資料庫索引
建立索引語句: CREATE [unique]INDEX 索引名 ON 表名 (欄位名1,欄位名2)
是資料庫管理系統中一個排序的資料結構,以協助快速查詢、更新資料庫表中資料。索 引的實現通常使用B樹及其變種B+樹。
常見的有4種索引:
唯一索引:唯一索引是不允許其中任何兩行具有相同索引值的索引;
主鍵索引:資料庫表經常有一列或列組合,其值唯一標識表中的每一行,
主鍵將自動建立主鍵索引;
叢集索引:索引中索引值的邏輯順序決定了表中相應行的物理順序;
非叢集索引:索引中索引的邏輯順序與磁碟上行的實體儲存體順序不同。
5. mysql分頁查詢:
SELECT * FROM student LIMIT (PageNo - 1) * PageSize,PageSize;
Oracle分頁:
SELECT * FROM
(SELECT ROWNUM rn ,* FROM student WHERE Rownum <= pageNo * pageSize )
WHERE rn > (pageNo - 1) * pageSize
6. sql預存程序
預存程序就是將常用的或很複雜的工作,預先用SQL語句寫好並用一個指定的名稱儲存起來,可以根據條件執行不同SQL語句,那麼以後要叫資料庫提供與已定義好的預存程序的功能相同的服務時,只需調用execute,即可自動完成命令。
create proc query_book as select * from book go
--調用預存程序 exec query_book
三、架構
1. 攔截器和過濾器的區別
?攔截器是基於Java的反射機制的,而過濾器是基於函數回調。
?攔截器不依賴於servlet容器,過濾器依賴與servlet容器。
?攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
?在action的生命週期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
?攔截器可以訪問action上下文裡的對象,而過濾器不能訪問。
攔截器可以擷取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器裡注入一個service,可以調用商務邏輯。
2. Spring Boot是由Pivotal團隊提供的全新架構,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該架構使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。
四、rabbitMQ
1. rabbitMQ的5常用工作模式(一共有6中模式):
簡單模式:略
工作模式:生產者為訊息佇列中生產訊息,多個消費者爭搶執行權利,誰搶到誰執行.如秒 殺業務、搶紅包等
發布訂閱模式:生產者生產訊息,將訊息發往交換器,交換器再將訊息發往訂閱了 當前訊息的隊列,再次有各個隊列的消費者執行(類似於廣播)
路由模式:生產者發布訊息,會定義指定的路由key(如 key:error),這時交換器會根 據路由key發往滿足條件的隊列中,如果隊列中沒有合格路由key將不 能執行該訊息.
主題模式:與路由模式相似,key=*xx*
2.rabbitMQ中2個重要連接埠連接埠
15672:訪問rabbitMQ的控制台; 5672:程式串連rabbitMQ的連接埠
3. ACK機制(訊息確認機制):
如果採用no-ack的方式進行確認(每次Consumer接到資料後,不管是否處理完成,RabbitMQ Server會立即把這個Message標記為完成,然後從queue中刪除了),在Consumer處理資料的過程中,Consumer出錯了,異常退出了,而資料還沒有處理完成,那麼資料就丟失了。
為了保證資料不被丟失,RabbitMQ支援訊息確認機制(acknowledgments)。為了保證資料能被正確處理而不僅僅是被Consumer收到,應該在處理完資料後發送ack。如果一個Consumer異常退出了,它處理的資料能夠被另外的Consumer處理,這樣資料在這種情況下就不會丟失了。在處理資料後發送的ack,就是告訴RabbitMQ資料已經被接收,處理完成,RabbitMQ可以去安全的刪除它了。
4.其他幾種訊息佇列:MSMQ、ActiveMQ、ZeroMQ
5.隊列持久化:非持久化時,當rabbitmq宕機時,訊息是丟失的。持久化時,會將資料寫入磁碟,宕機重啟後,會恢複這些訊息。非持久化資訊儲存到記憶體,持久化資訊儲存到磁碟。
6.AMQP(進階訊息佇列協議):Spring對AMQP做了支援,目前只是做了RabbitMQ的實現,RabbitMQ是一個開源的AMQP實現
7. rabbitmq的優先順序做法
目前成熟的訊息佇列產品有很多,著名的例如rabbitmq。它使用起來相對還是比較簡單的,功能也相對比較豐富,一般場合下是完全夠用的。但是有個很煩人的就是它不支援優先順序。
例如一個發郵件的任務,某些特權使用者希望它的郵件能夠更加及時的發送出去,至少比普通使用者要優先對待。預設情況下rabbitmq是無法處理掉的,扔給rabbitmq的任務都是FIFO先進先出。但是我們可以使用一些變通的技巧來支援這些優先順序。建立多個隊列,並為rabbitmq的消費者設定相應的路由規則。
我們可以定義一個專門處理高優先順序隊列的消費者,它閒置時候也不處理低優先順序隊列的資料。這類似銀行的VIP櫃檯,普通客戶在銀行取號排隊,一個VIP來了他雖然沒有從取號機裡拿出一個排在普通會員前面的票,但是他還是可以更快地直接走VIP通道。
8. rabbitMQ中幾個重要概念
Broker:簡單來說就是訊息佇列伺服器實體。
Exchange:訊息交換器,它指定訊息按什麼規則,路由到哪個隊列。
Queue:訊息佇列載體,每個訊息都會被投入到一個或多個隊列。
Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞。
vhost:虛擬機器主機,一個broker裡可以開設多個vhost,用作不同使用者的許可權分離。
producer:訊息生產者,就是投遞訊息的程式。
consumer:訊息消費者,就是接受訊息的程式。
channel:訊息通道,在用戶端的每個串連裡,可建立多個channel,每個channel代表 一個會話任務。由Exchange,Queue,RoutingKey三個才能決定一個從Exchange到Queue的唯一的線路。
9. rabbitMQ與activeMQ對比:
A) ActiveMq是Java,RabbitMQ是Erlang(天生具備高並發高可用的erlang 語言),理論上,RabbitMQ的效能比ActiveMq更強,是非Java系統的首選;
B) RabbitMQ:基於AMQP協議
進階訊息佇列協議使得遵從該規範的用戶端應用和訊息中介軟體伺服器的 全功能互操作成為可能。
ActiveMQ:基於STOMP協議(簡單(流)文本定向訊息協議)
C)兩者都支援訊息持久化
D)RabbitMQ支援的並發比較高(天生具備高並發高可用的erlang 語言)
五、Solr
1. 正向索引: 先載入文章,再根據文章中的關鍵字指定相應的位置;
倒排索引(lucene/solr): 先查詢索引關鍵字,之後在返回關鍵字所在的文章.現階段主流的檢索工具一般都會使用倒排索引.
2. Lucene:是一套用於全文檢索索引和搜尋的開源程式庫,採用了詞元匹配和切分詞。舉個例子:java後端工程師,可以分詞為:java、工程師、後端等,所以我們搜尋的時候都可以檢索到。有一種分詞器就是IK中文分詞器,它有細粒度切分和智能切分,即根據某種智能演算法。
Solr:是一個獨立企業級搜尋應用伺服器(採用java5開發),基於Lucene的全文檢索搜尋伺服器。Solr提供了比Lucene更為豐富的查詢語言,同時實現了可配置、可擴充,並對索引、搜尋效能進行了最佳化。只需要進行配置就可以實現全文檢索索引服務。有效降低頻繁訪問資料庫對資料庫造成的壓力。
六、Nginx
1. Nginx是一個高效能的HTTP和反向 Proxy伺服器,同時也是電子郵件(IMAP/POP3)Proxy 伺服器
2. nginx 負載平衡5種配置方式(我主要用3種)
輪詢(預設)、
weight(權重weight=5)、
ip_hash(每個請求按訪問ip的hash結果分配,綁定一個後端伺服器,可以解決session 的問題)
3. 在upstream中定義分布式裝置的Ip及裝置狀態,
其中每一台裝置的狀態可以設定為:
1.down 表示當前的server暫時不參與負載
2.weight 預設為1.weight越大,負載的權重就越大。
3.max_fails :允許請求失敗的次數預設為1.當超過最大次數時,返回 proxy_next_upstream 模組定義的錯誤
4.fail_timeout:max_fails次失敗後,暫停時間。
5.backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。 相當於備胎。
4. 為什麼Nginx效能這麼高?
得益於它的事件處理機制:非同步非阻塞事件處理機制
5. Nginx和apache比較
Nginx優點:
Nginx更加輕量級,比apache佔用更少記憶體及資源,可以做到秒起秒關;
Nginx所有請求由一個線程處理,而apache由單個線程處理單個請求;
Nginx處理請求是非同步非阻塞的,而apache阻塞型的,所以nginx比apache更能 抗擊高並發;
Nginx配置簡潔,而apache複雜;nginx處理靜態檔案好;
但nginx bug比較少,超穩定,模組超多,rewrite強大;
需要效能的web服務,用nginx 。如果不需要效能只求穩定,那就apache
6. 請解釋Nginx伺服器上的Master和Worker進程分別是什麼?
Master進程:讀取及評估配置和維持
Worker進程:處理請求
七、Amoeba和資料庫主從複製
1. 資料庫主從
調用原理
1.當主庫更新資料後,會即時的寫入到二進位記錄檔中
2.從庫的IO線程,即時的監聽主庫的二進位檔案,如果二進位檔案發生了改變則啟動 線程進行讀取修改後的內容.
3.通過IO線程將讀取的二進位檔案寫入到中繼日誌中.
4.Sql線程即時讀取中繼日誌中的訊息,進行資料庫的"更新操作"
二進位記錄檔 vim /etc/my.cnf:log-bin=mysql-bin
掛在到主要資料庫上:change master to MASTER_HOST=...
2. Amoeba是一個以MySQL為底層資料存放區,並對應用提供MySQL協議介面的proxy。它集中地響應應用的請求,依據使用者事先設定的規則,將SQL請求發送到特定的資料庫上執行。基於此可以實現負載平衡、讀寫分離、高可用性等需求。
3. Amoeba的負載平衡也有三種:輪詢,權重和hashIP
4. dbserver.xml:用來儲存和配置Amoeba所代理的資料庫伺服器的資訊
dbserver標籤設定資料庫屬性,dbserver的poolconfig配置
Amoeba.xml:用來配置Amoeba服務的基本參數和資料庫的讀寫分離,如Amoeba 主機地址、連接埠
八、redis
1. Redis 是一個基於記憶體的高效能key-value資料庫。
2. 使用redis有哪些好處?
(1) 速度快,每秒可以處理超過 10萬次讀寫操作,是已知效能最快的 Key-Value DB。
(2) 支援豐富資料類型,支援string,list,set,zset(有序集合),hash等資料結 構的儲存
(3) 支援事務,操作都是原子性
(4) 豐富的特性:可用於緩衝,訊息,按key設定到期時間,到期後將會自動刪除
3. Redis是單進程單線程的,redis利用隊列技術將並發訪問變為串列訪問,消除了傳統資料庫串列控制的開銷;
5. redis主從是怎麼選取的
6. 與memcached比較
(1) memcached所有的值均是簡單的字串,redis支援更為豐富的資料類型
(2) redis的速度比memcached快很多
(3) redis支援資料落地,而memcached不支援
(4)value大小redis最大可以達到1GB,而memcache只有1MB
7. redis常見效能問題和解決方案:
(1) Master最好不要做任何持久化工作,如RDB記憶體快照和AOF記錄檔
(2) 如果資料比較重要,某個Slave開啟AOF備份資料,原則設定為每秒同步一次
(3) 為了主從複製的速度和串連的穩定性,Master和Slave最好在同一個區域網路內
(4) 盡量避免在壓力很大的主庫上增加從庫
(5) 主從複製不要用圖狀結構,用單向鏈表結構更為穩定,即:Master <- Slave1 <- Slave2
8. mySQL裡有2000w資料,redis中只存20w的資料,如何保證redis中的資料都是熱點資料。
redis 記憶體資料集大小上升到一定大小的時候,就會施行資料淘汰策略。redis 提供 6種資料淘汰策略:
(1)volatile-lru:從已設定到期時間的資料集(server.db[i].expires)中挑選最近最少使用的資料淘汰
(2)volatile-ttl:從已設定到期時間的資料集(server.db[i].expires)中挑選將要到期的資料淘汰
(3)volatile-random:從已設定到期時間的資料集(server.db[i].expires)中任意選擇資料淘汰
(4)allkeys-lru:從資料集(server.db[i].dict)中挑選最近最少使用的資料淘汰
(5)allkeys-random:從資料集(server.db[i].dict)中任意選擇資料淘汰
(6)no-enviction(驅逐):禁止驅逐資料
九、Linux常用命令:
ls——列出當前路徑下的檔案名稱或目錄
ll——列出當前路徑下的檔案名稱或目錄的詳細資料
pwd——顯示當前路徑位置
cd——切換目錄
ping ip地址——測試網路連接是否暢通
vim 檔案名稱——修改檔案
i——進入編輯狀態
esc——退出上一狀態
:wq——儲存退出
:q!——表示強制退出 不建議使用
cp 原檔案名稱 複製檔案名稱——複製檔案
mv a.txt b.txt——將a.txt改名為b.txt
mv a.txt aa/——將a.txt 移動到aa檔案夾
clear——清屏命令
service iptables stop——關閉防火牆,start 開啟
rm a.txt——表示刪除單個檔案
rm -rf aa——強制移除檔案
tar -xvf a.tar——解壓a.tar
面試題:java面試基本方向 !=!=未看