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