面試進階問題總結

1.rpc通信協議http和thrift之間的區別

使用thrift等工具可以實現二進制傳輸,相比http的文傳輸無疑大大提高了傳輸效率;http通常使用的json,需要用戶序列化/反序列化,性能和複雜度高。相比之下,Thrift等工具,使用了成熟的代碼生成技術,將通信接口的IDL文件(IDL(Interface Definition Language)即接口定義語言)生成了對應語言的代碼接口,實現了遠程調用接近於本地方法的調用。另外無論是網絡傳輸編碼、解碼,還是傳輸內容大小還是網絡開銷都相比http有較大的優勢,另外一個企業內部的開發語言、框架不會有太大的異構性,http並無優勢。

2.volatile關鍵詞的作用

被volatile修飾的變量,可以保證不同的線程都能多能取得最新狀態值;volatile保證了可見性,避免在線程在緩存中取舊值;

1. volatile 保證可見性

一旦一個共享變量(類的成員變量、類的靜態成員變量)被volatile修飾之後,那麼就具備了兩層語義:

1)保證了不同線程對這個變量進行操作時的可見性,即一個線程修改了某個變量的值,這新值對其他線程來說是立即可見的。

2)禁止進行指令重排序。

2. volatile 不能確保原子性

下面看一個例子:


public class Test {
    public volatile int inc = 0;
 
    public void increase() {
        inc++;
    }
 
    public static void main(String[] args) {
        final Test test = new Test();
        for(int i=0;i<10;i++){
            new Thread(){
                public void run() {
                    for(int j=0;j<1000;j++)
                        test.increase();
                };
            }.start();
        }
 
        while(Thread.activeCount()>1)  //保證前面的線程都執行完
            Thread.yield();
        System.out.println(test.inc);
    }

2.Redis淘汰機制(Eviction policies)

首先,需要設置最大內存限制

maxmemory 100mb

選擇策略

maxmemory-policy noeviction

 解釋:
noeviction:默認策略,不淘汰,如果內存已滿,添加數據是報錯。
allkeys-lru:在所有鍵中,選取最近最少使用的數據拋棄。
volatile-lru:在設置了過期時間的所有鍵中,選取最近最少使用的數據拋棄。
allkeys-random: 在所有鍵中,隨機拋棄。
volatile-random: 在設置了過期時間的所有鍵,隨機拋棄。
volatile-ttl:在設置了過期時間的所有鍵,拋棄存活時間最短的數據。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章