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)
- Propagation.REQUIRED 如果有事務在運行,當前的這個方法就在事務內運行.否則就開啓新的事務,在自己的事務內運行
- Propagation.REQUIRES_NEW 當前的方法必須啓動新事務,並在自己的事務內運行。如果有事務在運行,將它掛起
- Propagation.MANDATORY 當前的方法必須運行在事務內部,如果沒有正在運行的事務則拋出異常
- Propagation.NEVER 當前的方法不應該運行在事務內,如果有運行的事務,就拋出異常
- Propagation.NESTED 如果有事務在運行,當前的方法就應該在這個事務的嵌套事務內運行。否則就啓動一個新的事務,在自己的事務內運行。
- Propagation.SUPPORTS 如果有事務在運行,當前的方法就在這個事務內運行.否則它可以不運行在事務中
- 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的生命週期
- 實例化 Instantiation
- 屬性賦值 Populate
- 初始化 Initialization
- 銷燬 Destruction
spring IOC容器初始化過程
- resource 資源定位
- BeanDefinition 載入,把用戶定義好的bean 表示成IOC容器內部的數據結構
- 向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) 持久性
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