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:在設置了過期時間的所有鍵,拋棄存活時間最短的數據。