一、redis和mysql一致性怎么保證?
1.編寫刪除緩存的接口,在更新數據庫的同時,調用刪除緩存的接口刪除緩存中的數據。
2.消息隊列:ActiveMQ、消息通知;將更新操作發送到消息隊列中,順序更新mysql和redis。
二、redis分布式鎖有了解過嗎?
redis的特性:1.安全特性:互斥訪問,即永遠只有一個客戶能拿到鎖;
? ? ? ? ? ? ? ? ? ? ? ?2.避免死鎖:最終客戶都可能拿到鎖,不會出現死鎖的情況;
? ? ? ? ? ? ? ? ? ? ? ?3.容錯性:只要大部分redis節點存活就可以正常提供服務。
redis為單進程單線程模式,采用隊列模式將并發訪問變成串行訪問,且多客戶端對redis的連接并不存在競爭關系redis中可以使用sentnx命令實現分布式鎖。當且僅當key不存在,將key值設為value;若給定的key已經存在,則sentnx不做任何操作。
三、ArrayList和Linkedlist的區別?
ArrayList:1.Arraylist使用動態數組實現,底層基于數組,它通過數組的連續內存空間存儲元素,支持隨機訪問;
? ? ? ? ? ? ? ? 2.ArrayList適用于大量隨機訪問和遍歷操作,但插入和刪除元素時性能較低;
Linkedlist:1.使用雙向鏈表實現,每個節點包含數據元素和兩個指針,分別指向前一個節點和后一個節點;
? ? ? ? ? ? ? ? ?2.Linkedlist適用于大量插入和刪除的操作,對隨機訪問性能要求不高。
四、Mysql隔離級別
1.讀未提交:事務中的修改未提交,其他事務可以讀取到這些未提交的數據。
可能出現的問題:臟讀、不可重復讀、幻讀;
2.讀已提交:事務中的修改提交后,其他事務才能讀取到這些已經提交的數據
可能出現的問題:不可重復讀、幻讀
3.可重復讀:事務中查詢結果保持一致,即使其他事務修改了數據也不會影響當前事務的查詢結果
可能出現的問題:幻讀
4.可串行化:最高隔離級別,確保事務之間完全獨立,避免了所有并發訪問問題,但可能導致性能下降
****補充:臟讀、不可重復讀、幻讀
臟讀:事務 A 讀取了事務 B 更新但未提交的數據,然后基于這些數據進行了操作,如果事務 B 回滾了,則事務 A 讀取到的數據是臟數據。導致讀取到的數據不一致,可能會產生錯誤的計算結果或業務邏輯錯誤。
不可重復讀:事務 A 多次讀取同一個數據項,在兩次讀取之間,事務 B 修改了該數據項,并提交了事務,導致事務 A 讀取到的數據不一致。導致同一個事務中多次讀取到的數據不一致,可能影響事務的正確執行。
幻讀:事務 A 多次查詢一個數據范圍,兩次查詢之間,事務 B 插入了新的數據項并提交了事務,導致事務 A 查詢到的數據項數量不一致。
五、接口和抽象類的區別
1.接口是行為的抽象;抽象是對類的抽象
2.接口沒有構造方法;抽象類有構造方法
3.抽象體現繼承關系;接口體現實現關系
六、spring框架中用到了什么設計模式?
1.工廠模式:Beanfactory是簡單工廠模式的體現,用來創建對象的實例
2.單例模式:Bean默認為單例模式
3.代理模式:spring的AOP功能用到了JDK代理和CGLIB代理
4.模板方法:用來解決代碼重復的問題。
5.觀察者模式:定義對象鍵一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都會得到通知被制動更新。
七、注解實現的原理
1.編譯時:編譯器處理源代碼時會檢查注解,并可能據此生成額外的源代碼和資源文件
2.類加載時:某些注解會在類加載到jvm時被處理
3.運行時:在程序運行階段,可以通過反射機制訪問注解信息。