網(wǎng)站登錄密碼保存在哪里設(shè)置免費(fèi)可用的網(wǎng)站源碼
Q:介紹一下MySQL的三種日志(redo,undo,bin)
Redo Log 和 Undo Log 是存儲(chǔ)引擎 InnoDB 層面實(shí)現(xiàn)的,Bin Log 是 MySQL 層面實(shí)現(xiàn)的。
下面是三種日志的簡(jiǎn)要介紹:
-
Redo Log:保證事務(wù)的持久性(Durability)。Redo Log 記錄了已提交事務(wù)的所有更改,以便在發(fā)生故障時(shí)可以恢復(fù)數(shù)據(jù)。
- Redo Log 是一種順序?qū)懭氲娜罩?#xff0c;寫入速度比隨機(jī)寫入要快。
- 當(dāng)事務(wù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改時(shí),首先將更改寫入 Redo Log,而不是直接寫入數(shù)據(jù)文件。這樣,即使系統(tǒng)崩潰,也可以使用 Redo Log 中的記錄來恢復(fù)數(shù)據(jù)。
- Redo Log 在 MySQL 中以“日志組”的形式存在,通常在 InnoDB 存儲(chǔ)引擎中使用。
特點(diǎn):
- Redo Log 是物理日志,記錄的是數(shù)據(jù)頁(yè)的物理變化。
- 在數(shù)據(jù)庫(kù)崩潰后進(jìn)行恢復(fù)時(shí)非常重要,確保已提交事務(wù)的數(shù)據(jù)不會(huì)丟失。
-
Undo Log:支持事務(wù)的原子性(Atomicity)和一致性(Consistency),以及實(shí)現(xiàn) MVCC(多版本并發(fā)控制)。
- Undo Log 記錄了事務(wù)對(duì)數(shù)據(jù)的所有修改的反向操作,以便在事務(wù)回滾時(shí)能夠恢復(fù)到事務(wù)開始前的狀態(tài)。
- 當(dāng)一個(gè)事務(wù)執(zhí)行更新操作時(shí),系統(tǒng)會(huì)在 Undo Log 中記錄下修改前的值,這樣在需要回滾時(shí)就可以使用這些信息恢復(fù)數(shù)據(jù)。
- Undo Log 是邏輯日志,記錄的是對(duì)數(shù)據(jù)的邏輯變化。
特點(diǎn):
- Undo Log 使得 MySQL 能夠?qū)崿F(xiàn)事務(wù)的回滾,確保在發(fā)生錯(cuò)誤時(shí)能夠恢復(fù)到一致性狀態(tài)
- 在實(shí)現(xiàn) MVCC 時(shí),Undo Log 允許讀取未提交數(shù)據(jù)的事務(wù)在特定條件下讀取數(shù)據(jù)的歷史版本
-
Bin Log:用于數(shù)據(jù)的復(fù)制和恢復(fù)。Binlog 記錄了所有對(duì)數(shù)據(jù)庫(kù)的更改操作(包括 DDL 和 DML 語(yǔ)句),而不是數(shù)據(jù)的實(shí)際內(nèi)容
- 當(dāng)執(zhí)行任何更新操作時(shí),MySQL 會(huì)將該操作以事件的形式記錄在 Binlog 中。這樣可以將這些操作應(yīng)用到其他數(shù)據(jù)庫(kù)實(shí)例,實(shí)現(xiàn)數(shù)據(jù)復(fù)制。
- Binlog 可以配置為不同的格式,如 Statement、Row 和 Mixed 模式,決定了日志中記錄的信息類型。
- Binlog 是主從復(fù)制的基礎(chǔ),主庫(kù)會(huì)將 Binlog 發(fā)送給從庫(kù)
特點(diǎn):
- Binlog 是邏輯日志,記錄的是 SQL 語(yǔ)句及其變更,而不是具體的物理數(shù)據(jù)
- 在數(shù)據(jù)恢復(fù)中,Binlog 可以用來重放操作,將數(shù)據(jù)庫(kù)恢復(fù)到某個(gè)特定時(shí)間點(diǎn)
- Binlog 的存在使得 MySQL 支持?jǐn)?shù)據(jù)的備份和恢復(fù),以及高可用性集群的實(shí)現(xiàn)
Q:介紹一下Spring 中的 @Autowired和@Resource
**@Resource
和@Autowired
**的對(duì)比:
-
都是用來自動(dòng)裝配的,都可以作用在屬性字段或方法上
-
@Autowired
:- 默認(rèn)通過**類型(byType)**進(jìn)行注入。
- 如果找到多個(gè)同類型的 bean,會(huì)拋出
NoUniqueBeanDefinitionException
。 - 如果使用了
@Qualifier
或@Primary
注解,可以明確指定要注入的具體 bean,從而幫助解決歧義。@Qualifier
可以用來基于名稱選擇特定 bean,但不會(huì)在byType
后嘗試byName
。
-
@Resource
:-
默認(rèn)先通過**名稱(byName)**查找對(duì)應(yīng)的 bean。
-
如果找不到匹配的名稱,則根據(jù)**類型(byType)**進(jìn)行查找。
-
如果
byType
找到多個(gè)同類型的 bean,會(huì)拋出NoUniqueBeanDefinitionException
。 -
如果在名稱和類型查找后都沒有找到 bean,拋出
NoSuchBeanDefinitionException
。
-
Q:Spring 中用到了那些設(shè)計(jì)模式?
- 工廠模式:如
BeanFactory
和AppicationContext
,通過工廠模式創(chuàng)建和管理Bean對(duì)象 - 單例模式:Bean的默認(rèn)作用域。
- 代理模式:AOP 和 一些動(dòng)態(tài)代理的實(shí)現(xiàn),如JDK接口實(shí)現(xiàn)動(dòng)態(tài)代理,CIGLIB繼承實(shí)現(xiàn)動(dòng)態(tài)代理,以及
@Transcational
也會(huì)使用代理模式創(chuàng)建代理對(duì)象。 - 模板方法:如
JdbcTemplate
、RedisTemplate
以及Mybaytis - Spring 整合的sqlSessionTemplate
等 - 觀察者模式:Spring的事件驅(qū)動(dòng)模型
- 策略模式:Spring的
Resource
接口的實(shí)現(xiàn),允許根據(jù)不同的資源類型(系統(tǒng)、url、類路徑)來加載 - 適配器模式:Spring MVC的
HandlerAdapter
允許不同類型的處理器(如Controller
或HttpRequestHandler
)能夠處理 HTTP 請(qǐng)求 - 裝飾器模式:Spring 的
BeanPostProcessor
允許在Bean初始化前后進(jìn)行一些額外的邏輯處理
Q:你了解java是怎么實(shí)現(xiàn)代理模式的嗎?(jdk原生和cglib)
對(duì)于動(dòng)態(tài)代理, JDK 動(dòng)態(tài)代理 vs CGLIB 動(dòng)態(tài)代理
特性 | JDK 動(dòng)態(tài)代理 | CGLIB 動(dòng)態(tài)代理 |
---|---|---|
代理對(duì)象 | 只能代理實(shí)現(xiàn)了InvocationHandler接口的類 | 可以代理沒有實(shí)現(xiàn)接口的類 |
實(shí)現(xiàn)方式 | 基于反射和接口 | 基于繼承和字節(jié)碼生成 |
性能 | 對(duì)于接口的代理,性能較好 | 生成代理類需要更多資源,但一次生成后性能更優(yōu) |
使用場(chǎng)景 | 適用于接口代理 | 適用于沒有接口的類的代理 |
限制 | 只能代理接口 | 目標(biāo)類不能是 final ,方法不能是 final |
CGLIB動(dòng)態(tài)代理 原理:通過繼承生成代理類,使用字節(jié)碼生成庫(kù)(如 ASM)來動(dòng)態(tài)生成目標(biāo)類的子類,并在子類中覆蓋目標(biāo)類的方法。代理對(duì)象實(shí)際上是目標(biāo)對(duì)象的子類,所有對(duì)代理對(duì)象方法的調(diào)用都會(huì)被重定向到代理邏輯。
JDK原生動(dòng)態(tài)代理原理:通過接口代理對(duì)象,當(dāng)通過代理對(duì)象調(diào)用方法時(shí),JDK 實(shí)際上會(huì)執(zhí)行 InvocationHandler
中的 invoke()
方法。在該方法中,您可以添加自定義邏輯(如記錄日志、權(quán)限檢查等),并最終調(diào)用目標(biāo)對(duì)象的方法。代理對(duì)象會(huì)在執(zhí)行目標(biāo)方法時(shí)調(diào)用該方法。