一 如何解決多臺web服務器粘性會話的問題?html
粘性session:web服務器會把某個用戶的請求,交給tomcat集羣中的一個節點,之後此節點就負責該保存該用戶的session,若是此節點掛掉,那麼該用戶的session也會消失。
非粘性session:經過負載均衡器會根據節點的狀況,把用戶的請求進行分發,也就是會複製多份session分發給多個節點,這樣,若是節點中其中一個session掛掉的話,其它的還能繼續工做,也就是隻要有一個節點沒有掛掉,該用戶的信息就不會消失:mysql
1. 利用Memcache/Redis共享Session數據:搭建Memcache/Redis集羣,將用戶Session寫入Memcache/Redis,設置key值的有效期,即Session的有效期。通常來講緩存的併發性能高於數據庫,這個方法能夠得到較大的負載量web
2 利用數據庫共享Session數據:建立一個數據庫庫專門存放用戶Session,用戶登陸一次插入一條數據(若是第一次登陸),並由程序去維護Session的時效性。這個作法的弊端是,數據庫的負擔很大並且原本就是容易產生瓶頸的地方,日活的增長致使性能問題。算法
二 假如某項目上線後,系統常常出現宕機或者假死,請問應該從哪幾個方面去分析解決?sql
三 描述一下常見一些hash算法的應用場景數據庫
1. 校驗安裝文件的完整性,在軟件部署的時候,計算軟件包當前的哈希值是否與預設值相等,防止軟件包被篡改或被替換
2. 存儲和校驗用戶口令,用戶口令不能用明文存儲,更進一步,若是系統不知道用戶口令明文,那就更好了,而哈希算法就能夠作到既不知道用戶明文,又能夠校驗用戶口令
3. 做爲數據庫表分區的分區條件緩存
四 假若有100W個敏感詞彙表,如何從一段網絡文章裏快速找出是否存在敏感詞。tomcat
http://www.javashuo.com/article/p-rtasjgak-er.html安全
五 請描述ThreadLocal的做用以及使用場合,在程序中用來傳遞數據合適不合適?服務器
ThreadLocal並非一個Thread,而是Thread的局部變量。針對每一個線程提供本身的變量版本,每一個線程維護本身的版本,彼此獨立,修改不會影響到對方,避免線程衝突。譬如在Web開發中,存放一次請求的Context。在程序中傳遞數據是不合適的,ThreadLocal攜帶多個線程變量版本,傳遞數據浪費性能
六 請描述一下系統信息安全方面的一些常見攻擊手段與預防方法?
1 口令破解:能夠採用字典破解和暴力破解來得到口令。
2 IP欺騙::攻擊者能夠經過假裝成被信任的IP地址等方式來獲取目標的信任。這主要是針對防火牆的IP包過濾以及LINUX/UNIX下創建的IP地址信任關係的主機實施欺騙。
3 DNS欺騙:因爲DNS服務器相互交換信息的時候並不創建身份驗證,這就使得黑客可使用錯誤的信息將用戶引向錯誤主機。
5 DdoS攻擊 :DdoS攻擊(Distributed Denial of Server,分佈式拒絕服務)是一種基於DOS的特殊形式的拒絕服務攻擊,是一種分佈協做的大規模攻擊方式,主要瞄準比較大的站點,像商業公司、搜索引擎和政府部門的站點。他利用一批受控制的機器向一臺目標機器發起攻擊,這樣來勢迅猛的攻擊使人難以防備,所以具備很大的破壞性。
6 緩衝區溢出攻擊(buffer overflow)
經過往程序的緩衝區寫超過其長度的內容,形成緩衝區的溢出,從而破壞程序的堆棧,使程序轉而執行其餘指令,以達到攻擊的目的。緩衝區溢出是一種很是廣泛、很是危險的漏洞,在各類操做系統、應用軟件中普遍存在,根據統計:經過緩衝區溢出進行的攻擊佔全部系統攻擊總數的80%以上。利用緩衝區溢出攻擊能夠致使程序運行失敗、系統死機、從新啓動等後果,更嚴重的是,能夠利用他執行非受權的指令,甚至能夠取得系統特權,進而進行各類非法操做。因爲他歷史悠久、危害巨大,被稱爲數十年來攻擊和防衛的弱點。
社交工程(Social Engineering)
七 請列舉幾個Linux常見命令:
實時查看服務器日誌文件內容
tail -f
修改文件用戶全部者以及所在組
查看服務器內存使用狀況
free
查找進程名稱包括tomcat的進程ID
ps -ef|grep tomcat
查看服務器磁盤空間使用狀況
dh -f
查看服務器IO壓力狀況
top
檢測鏈接到服務器每一個節點的鏈接速度
netstat -an
建立一個/local/usr/mysql/dbfile到/data/mysql/dbfile目錄的軟連接
ln -s /local/usr/mysql/dbfile/ /data/mysql/dbfile/
八 在多服務器集羣部署的狀況下,如何避免併發帶來的問題,好比一個理財產品剩餘金額爲10000,如何應對搶購?
解決秒殺搶購類的關鍵思路是:儘可能將請求攔截在系統上游,減輕數據庫壓力
1 最簡單的方式是採用數據庫事務處理,因爲數據庫併發量有效,沒法應對極大流量的搶購
當某用戶進入搶購時,假定一個用戶只能搶購一份,執行事務僞代碼以下:
begin transaction;
select balace from 產品表 where product_id = xx for update;
if(balace<1) return;
...建立訂單
update 產品表 set balace=balace-1;
end transaction;
2 採用Redis的事務功能和Watch特性,能夠承受較大併發量
http://blog.csdn.net/e421083458/article/details/49741451
http://www.cnblogs.com/longtaosoft/p/6627568.html
九 Java中自帶哪些線程池,分別的應用場景是什麼?
Java經過Executors提供四種線程池,分別爲:
newCachedThreadPool建立一個可緩存線程池,若是線程池長度超過處理須要,可靈活回收空閒線程,若無可回收,則新建線程。
newFixedThreadPool 建立一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待。
newScheduledThreadPool 建立一個定長線程池,支持定時及週期性任務執行。
newSingleThreadExecutor 建立一個單線程化的線程池,它只會用惟一的工做線程來執行任務,保證全部任務按照指定順序(FIFO, LIFO, 優先級)執行
http://cuisuqiang.iteye.com/blog/2019372
http://www.importnew.com/16797.html
十 mysql數據庫有如下三個表及字段說明:
Columns of "Person" Table,人員表 | ||
Column Name | DataType | Comment |
pcode | int | 人員代碼,主鍵 |
name | varchar(100) | 姓名 |
gender | varchar(10) | 性別 |
age | int | 年齡 |
org_code | int | 所在單位的單位代碼,外鍵 |
varchar(100) | 電子郵件 |
Columns of "Organization" Table,單位表 | ||
Column Name | DataType | Comment |
org_code | int | 單位代碼,主鍵 |
name | varchar(100) | 單位名稱 |
province | varchar(100) | 單位所在省份或者直轄市 |
Columns of "UserGroup" Table,人員角色表 | ||
Column Name | DataType | Comment |
pcode | int | 人員代碼 |
group_no | varchar(10) | 角色碼,「20」:項目負責人,「10」:單位聯絡人 |
A 因爲深圳大學的郵箱發生變動,須要緊急將深圳大學全部單位聯絡人的郵箱(eg:zhangshan@szdx.edu.cn),域名"szdx.edu.cn"從替換成"szu.edu.cn",請寫出SQL語句
update person set email = replace(email, 'szdx,edu.cn', 'szu.edu.cn')
where email like '%szdx.edu.cn' and org_code in (select org_code from organization where name = '深圳大學') and pcode in (select pcode from usergroup where group_no = '10')
B 如今要查詢出北京市每一個單位的單位聯絡人平均年齡,請寫出SQL語句,結果輸出:單位代碼,單位名稱,平均年齡
select p.org_code as 單位代碼,o.name as 單位代碼, avg(p.age) as 平均年齡 from person p left join organization o on p.org_code = o.org_code where pcode in (select pcode from usergroup where group_no = '10') group by o.org_code
C 統計全國每一個單位的項目負責人年齡小於40歲的人數,結果輸出:單位代碼,單位名稱,人數
select p.org_code as 單位代碼,o.name as 單位代碼, count(p.age) as 人數 from person p left join organization o on p.org_code = o.org_code where pcode in (select pcode from usergroup where group_no = '20') and p.age < 40 group by o.org_code