Java面试总结(2018 - 12 - 10)
1.緩存穿透,緩存雪崩,緩存擊穿解決方案分析
1)緩存穿透就是比如拿Redis數(shù)據(jù)庫來說,它是一個鍵值對,有可能用戶查詢某個數(shù)據(jù)的時候沒有查到這個key,就跑到數(shù)據(jù)庫中去查了,我們設(shè)置緩存的目的就是為了不讓請求去數(shù)據(jù)庫中查,但是穿透呢,沒查到key會自動去數(shù)據(jù)庫中去查了。這種透過緩存去數(shù)據(jù)庫中查就叫緩存穿透。一般我們把那些空的也存到緩存中,這樣就不會穿透緩存了,一般發(fā)生的也不是特別多。
2)緩存雪崩就是在高并發(fā)的情況下,因為在緩存中有緩存的時間,同一時間下有好多數(shù)據(jù)失效了,這樣在高并發(fā)訪問量比較大的時候呢,同時又去數(shù)據(jù)庫查,這樣數(shù)據(jù)庫的壓力就很大,有可能就掛掉了,這就是緩存雪崩。一般我們給實效時間設(shè)置點隨機數(shù),不讓它一起失效。
3)緩存擊穿就是指某一個數(shù)據(jù)失效的話,這個數(shù)據(jù)訪問的也比較多,比如說淘寶在0點的時候某個數(shù)據(jù)實效了,這個時候又有很多用戶提前預(yù)購了,在0點的時候去搶它,這個時候就會造成擊穿的效果。一般這種擊穿很難處理,因為你也不知道這個數(shù)據(jù)會不會用到,所以我也不是太清楚怎么處理。
2.緩存數(shù)據(jù)和數(shù)據(jù)庫數(shù)據(jù)一致性問題
1)用MQ模式的消息隊列,保證串行。
2)或者用Id先查詢數(shù)據(jù),保證每次操作數(shù)據(jù)是同一個,然后再設(shè)置隊列。如果分布式的話就再加個服務(wù)Id,保證同一個服務(wù)。
3.設(shè)計模式
Java中有23種設(shè)計模式,常見的設(shè)計模式有:
1)單列模式
一句話總結(jié):一個類在Java虛擬機中只有一個對象,并提供全局訪問點。
生活中例子:太陽,月亮,國家主席等。
解決什么問題:對象的唯一性,性能浪費太多。
項目里面怎么用:數(shù)據(jù)庫連接對象,屬性配置文件的讀取對象。
模式結(jié)構(gòu):分為懶漢模式和餓漢模式(如果考慮性能問題的話,就使用懶漢模式,因為懶漢模式是在方法里面進行初始化的,構(gòu)造器私有化,對外提供方法加同步關(guān)鍵字)。
框架里面的使用:Struts1的Action。
Jdk里面使用:java.lang.Runtime#getRuntimejava.awt.Desktop#getDesktop。
懶漢模式:就是說比較懶,在用到它的時候它才去創(chuàng)建對象(懶漢模式線程不安全,懶漢加載慢,但是在內(nèi)存作用域短,節(jié)省空間)。
/** 懶漢模式* 懶漢線程不安全* 懶漢加載慢,但是在內(nèi)存作用域短,節(jié)省空間*/ public class SingletonA {//SinglettonA的唯一實例private static SingletonA instance = null;//將構(gòu)造函數(shù)私有,防止外界構(gòu)造SingletonA實例private SingletonA() {}//獲取SingletonA的唯一實例,用synchronized關(guān)鍵字保證某一時刻只有一個線程調(diào)用此方法public static synchronized SingletonA getInstance(){//如果instance為空,便創(chuàng)建一個新的SingletonA實例,否則,返回已有的實例if(instance == null){instance = new SingletonA();}return instance;}public void print(){System.out.println("我是懶漢模式!");}public static void main(String[] args) {SingletonA s1 = SingletonA.getInstance();SingletonA s2 = SingletonA.getInstance();System.out.println(s1 == s2);} }餓漢模式:就是說比較餓,在用到它的時候它早早的就加載完對象了(餓漢模式線程安全,餓漢加載快,但是在內(nèi)存中作用域長,不節(jié)省空間)。
/** 餓漢模式* 餓漢線程安全* 餓漢加載塊,但是在內(nèi)存中作用域長, 不節(jié)省空間*/ public class SingletonB {//SingletonB的唯一實例private static SingletonB instance = new SingletonB();//將構(gòu)造函數(shù)私有,防止外界構(gòu)造SingletonB實例private SingletonB() {}//獲取SingletonB的實例public static SingletonB getInstance() {return instance;}public void print() {System.out.println("我是餓漢模式");}public static void main(String[] args) {SingletonB s1 = SingletonB.getInstance();SingletonB s2 = SingletonB.getInstance();System.out.println(s1 == s2);}}2)Factory(簡單的工廠模式)
一句話總結(jié):用一個方法來代替new關(guān)鍵字。
生活中的例子:制衣廠,面包廠等生產(chǎn)廠。
解決什么問題:對象產(chǎn)生過多,或者經(jīng)常有子類替換生成。
項目里面怎么用:對于經(jīng)常生成的對象,或者父子類替換的對象。
模式結(jié)構(gòu):寫一個對外聲明的方法,方法里面使用new關(guān)鍵字代替。
框架里面使用:Spring的核心就是工廠模式。
Jdk里面使用:newInstance。
工廠模式代碼:
public class UserFactory {public static User createUser(int i){//如果輸入的是1,就創(chuàng)建它的子類,否則就創(chuàng)建父類if(i == 1){return new Alices();}return new User();} }?
3)Proxy(代理模式)
一句話總結(jié):為其他對象提供一個代理,以控制對當前對象的訪問。
生活中的例子:房屋中介,婚姻介紹所。
解決什么問題:不能直接訪問該對象,或者太大的資源耗費多。
項目里面怎么用:權(quán)限,或者大對象的訪問權(quán)限。
模式結(jié)構(gòu):代理類和被代理類實現(xiàn)同一個接口,用戶訪問的時候先訪問代理對象,然后讓代理對象去訪問被代理對象。
框架里面使用:Spring里面的AOP實現(xiàn)。
Jdk里面使用:java.lang.reflect.Proxy。
代理模式代碼:
創(chuàng)建一個接口:
public interface SellHouse { void sell(double money); }創(chuàng)建一個被代理類:
public class Hoster implements SellHouse { @Override public void sell(double money) { System.out.println("祝你居住愉快"); } }創(chuàng)建一個代理類:
public class Medium implements SellHouse { SellHouse hoster=new Hoster(); @Override public void sell(double money) { if(money>=1000){ hoster.sell(money); }else{ System.out.println("你的價格太低了"); } } }創(chuàng)建一個測試類:
public class Renter { public static void main(String[] args) { SellHouse renter=new Medium(); renter.sell(500); } }轉(zhuǎn)載于:https://www.cnblogs.com/chuanqi1995/p/10107369.html
總結(jié)
以上是生活随笔為你收集整理的Java面试总结(2018 - 12 - 10)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [bzoj2882]工艺_后缀数组
- 下一篇: JavaString库