面試常問題彙總、redis 、 mangodb 、 memcache對比

 redis 、 mangodb 、 memcache

都是NoSQLs數據庫:非關係型數據庫。mysql就是關係型數據庫。

  redis mongodb memcache
數據類型

五大類型

string、list、hash、sorted set 、set

key-value

值可以是文檔,數組及文檔數組

key-value
線程 單核單線程 多線程

多核多線程

主要存儲形式 內存(也可持久化到磁盤) 磁盤 內存
主從模式(分佈) 支持 支持 不支持
自動複製 支持 支持 不支持
TPS性能 稍弱
分片 支持 支持 支持
過期策略 支持 不支持 支持
自動故障恢復 哨兵模式 內部paxos選舉 不支持
事務支持 支持(稍弱,事務中的每個操作連續執行 不支持 支持(cas保證)
消息發佈/訂閱 支持 不支持 不支持
斷電數據恢復 支持 支持 不支持
編寫語言 ANSI C C++ C
應用場景 數據量較小但更性能操作和運算上 海量數據的訪問效率問題 減少數據庫負載,提升性能;做緩存,提高性能

 

Redis發佈訂閱與ActiveMQ的比較

(1)ActiveMQ支持多種消息協議,包括AMQP,MQTT,Stomp等,並且支持JMS規範,但Redis沒有提供對這些協議的支持; 
(2)ActiveMQ提供持久化功能,但Redis無法對消息持久化存儲,一旦消息被髮送,如果沒有訂閱者接收,那麼消息就會丟失; 
(3)ActiveMQ提供了消息傳輸保障,當客戶端連接超時或事務回滾等情況發生時,消息會被重新發送給客戶端,Redis沒有提供消息傳輸保障。 

  (4) MQ 提供了豐富的發佈訂閱方式,例如 queue、topic。還有 ack 消息確認機制,以及推送和主動拉取消息的選擇方式。
總之,ActiveMQ所提供的功能遠比Redis發佈訂閱要複雜,畢竟Redis不是專門做發佈訂閱的。
 

JVM調優

cpu 100%

1.執行 top 命令,查看佔用cpu使用率最高的 pid 進程

2.使用 top -Hp  pid ,鍵入大寫P,按照cpu使用率排序,找出最耗cpu的線程id

3.將線程 id 轉換成 16 進制(堆棧裏面線程id 是16進製表示的)

4.使用 jstack pid | grep '線程id(16進制)'  -C5 --color  查看最耗cpu的線程

5.找到對應代碼進行排查。
 

內存飆高:

使用top ,查看 %MEM% 比較高的 pid

jmap -heap pid 查看堆內存使用情況,

jmap -histo:live pid | head   打印出前幾條佔用情況

jmap -dump:live,format=b,file=myheap.dump pid  導出堆內存到文件

 

 

Mysql

索引何時失效


    (1)組合索引未使用最左前綴,例如組合索引(A,B),where B=b不會使用索引;

    (2)like未使用最左前綴,where A like '%China';

    (3)搜索一個索引而在另一個索引上做order by,where A=a order by B,只使用A上的索引,因爲查詢只使用一個索引 ;

    (4)or會使索引失效。如果查詢字段相同,也可以使用索引。例如where A=a1 or A=a2(生效),where A=a or B=b(失效)

    (5)如果列類型是字符串,要使用引號。例如where A='China',否則索引失效(會進行類型轉換);

    (6)在索引列上的操作,函數(upper()等)、or、!=(<>)、not in等;
 

數據庫中隔離級別四種

Spring 配置 

Isolation.DEFAULT  默認,使用數據庫默認的隔離級別
 
隔離級別越往下,安全性越高,數據越安全。
Isolation.READ_UNCOMMITTED  讀未提交,即使沒有提交,但是做了更改也可以被讀到。會產生髒讀、幻讀,不可重複讀。
Isolation.READ_COMMITTED    讀已提交,只讀取已經提交的事務。會產生幻讀,不可重複讀。
Isolation.REPEATABLE_READ   可重複讀,兩個事務之間的讀寫不衝突。當一個事務進行數據讀取,另一個事務進行了修改之     後,第一個事務再次讀取,但是數據依舊和第一次讀到的一樣。可重複讀
Isolation.SERIALIZABLE      序列化。效率低。不會髒讀、幻讀、重複讀
 

mysql默認的事務處理級別是'REPEATABLE-READ',也就是可重複讀

oracle 默認系統事務隔離級別是READ COMMITTED,也就是讀已提交

事務的隔離級別(spring)

  1. Propagation.REQUIRED  如果有事務在運行,當前的這個方法就在事務內運行.否則就開啓新的事務,在自己的事務內運行
  2. Propagation.REQUIRES_NEW    當前的方法必須啓動新事務,並在自己的事務內運行。如果有事務在運行,將它掛起
  3. Propagation.MANDATORY    當前的方法必須運行在事務內部,如果沒有正在運行的事務則拋出異常
  4. Propagation.NEVER   當前的方法不應該運行在事務內,如果有運行的事務,就拋出異常
  5. Propagation.NESTED   如果有事務在運行,當前的方法就應該在這個事務的嵌套事務內運行。否則就啓動一個新的事務,在自己的事務內運行。
  6. Propagation.SUPPORTS  如果有事務在運行,當前的方法就在這個事務內運行.否則它可以不運行在事務中
  7. Propagation.NOT_SUPPORTED   當前的事務不應該運行在事務中,如果有運行的事務,就將它掛起 

 

BeanFactory 和 FactoryBean的區別

beanfactory 是個 factory ,也就是 IOC容器(spring 容器)或對象工廠。在spring中,所有的bean都由 beanfactory 來管理,提供了實例化對象和獲取的功能。

使用場景:

  • 從 IOC 容器中獲取bean
  • 檢索 IOC 容器是否包含指定的bean
  • 判斷bean是否是單例

FactoryBean 是個 bean,這個bean不是簡單的bean,而是一個能生產或者修飾對象生成的工廠bean,它的實現與設計模式中的工廠模式和修飾器模式類似。

使用場景:

ProxyFactoryBean

 

spring bean的生命週期

  1. 實例化 Instantiation
  2. 屬性賦值 Populate
  3. 初始化 Initialization
  4. 銷燬 Destruction

spring IOC容器初始化過程

  1. resource 資源定位
  2. BeanDefinition 載入,把用戶定義好的bean 表示成IOC容器內部的數據結構
  3. 向IOC容器註冊這些 BeanDefinition 的過程,保存到 hashmap


名詞

CAP定理(CAP theorem)

在計算機科學中, CAP定理(CAP theorem), 又被稱作 布魯爾定理(Brewer's theorem), 它指出對於一個分佈式計算系統來說,不可能同時滿足以下三點:

  • 一致性(Consistency) (所有節點在同一時間具有相同的數據)
  • 可用性(Availability) (保證每個請求不管成功或者失敗都有響應)
  • 分隔容忍(Partition tolerance) (系統中任意信息的丟失或失敗不會影響系統的繼續運作)

一般只能滿足兩個

  • CA - 單點集羣,滿足一致性,可用性的系統,通常在可擴展性上不太強大。
  • CP - 滿足一致性,分區容忍必的系統,通常性能不是特別高。
  • AP - 滿足可用性,分區容忍性的系統,通常可能對一致性要求低一些。

ACID

1、A (Atomicity) 原子性

2、C (Consistency) 一致性

3、I (Isolation) 獨立性(隔離性)

4、D (Durability) 持久性

 

JAVA種的設計模式:23種設計模式

 

mybatis 的緩存

聯表查詢優化

 

 

Feign、hystrix、ribbon 調用關係

 

jdk代理和CGLIB代理的區別
一、簡單來說:

JDK動態代理只能對實現了接口的類生成代理,而不能針對類,它的實現原理是通過InvocationHandler.invoke方法實現對實現類方法的調用(InvocationHandler實例已經持有了對實現類對象的引用了),然後實現方法前後的攔截。

CGLIB是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的方法(繼承),然後通過MethodIntercept.intercept方法來實現在調用父類方法的前後執行攔截。
  
  jdk代理是通過持有實現類的引用來實現對實現類方法的調用的,而CGLIB是通過調用父類的方法來實現對被代理類的方法調用的。

 

二、Spring在選擇用JDK還是CGLiB的依據:

    (1)當Bean實現接口時,Spring就會用JDK的動態代理。
    (2)當Bean沒有實現接口時,Spring使用CGlib實現。
    (3)可以強制使用CGlib(在spring配置中加入<aop:aspectj-autoproxy proxy-target-class=“true”/>)
 

生成類的三種方式:

Class.forName("")
類.class
類.class.getClass()

 

5 << 1  = 5 * 2

5 >> 1 = 5 / 2

(5 << 1)  |  1= 5 * 2 + 1

(5 << 1)  & 1= 5 * 2 - 1

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