博客 / 列表

程序員Seven - 【設計模式】探索狀態模式在現代軟件開發中的應用

概述 【例】通過按鈕來控制一個電梯的狀態,一個電梯有開門狀態,關門狀態,停止狀態,運行狀態。每一種狀態改變,都有可能要根據其他狀態來更新處理。例如,如果電梯門現在處於運行時狀態,就不能進行開門操作,而如果電梯門是停止狀態,就可以執行開門操作。 類圖如下: 代碼如下: public interface ILift { //電梯的4個狀態 //開門狀態 public fina

設計模式 , JAVA , 後端

程序員Seven - 【設計模式】從事件驅動到即時更新:掌握觀察者模式的核心技巧

概述 定義:又被稱為發佈-訂閲(Publish/Subscribe)模式,它定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態變化時,會通知所有的觀察者對象,使他們能夠自動更新自己。 結構 在觀察者模式中有如下角色: Subject:抽象主題(抽象被觀察者),抽象主題角色把所有觀察者對象保存在一個集合裏,每個主題都可以有任意數量的觀察者,抽象主題提供一個接口

設計模式 , JAVA , 後端

程序員Seven - 【設計模式】使用中介者模式實現鬆耦合設計

概述 一般來説,同事類之間的關係是比較複雜的,多個同事類之間互相關聯時,他們之間的關係會呈現為複雜的網狀結構,這是一種過度耦合的架構,即不利於類的複用,也不穩定。例如在下左圖中,有六個同事類對象,假如對象1發生變化,那麼將會有4個對象受到影響。如果對象2發生變化,那麼將會有5個對象受到影響。也就是説,同事類之間直接關聯的設計是不好的。 如果引入中介者模式,那麼同事類之間的關係將變為星型結構,從下右

設計模式 , JAVA , 後端

程序員Seven - 【設計模式】遍歷集合的藝術:深入探索迭代器模式的無限可能

概述 定義:提供一個對象來順序訪問聚合對象中的一系列數據,而不暴露聚合對象的內部表示。 結構 迭代器模式主要包含以下角色: 抽象聚合(Aggregate)角色:定義存儲、添加、刪除聚合元素以及創建迭代器對象的接口。 具體聚合(ConcreteAggregate)角色:實現抽象聚合類,返回一個具體迭代器的實例。 抽象迭代器(Iterator)角色:定義訪問和遍歷聚合元素的接口,通常包含 ha

設計模式 , JAVA , 後端

程序員Seven - 【設計模式】通過訪問者模式實現分離算法與對象結構

概述 定義:封裝一些作用於某種數據結構中的各元素的操作(將數據結構於元素進行分離),它可以在不改變這個數據結構的前提下定義作用於這些元素的新的操作。 結構 訪問者模式包含以下主要角色: 抽象訪問者(Visitor)角色:定義了對每一個元素(Element)訪問的行為,它的參數就是可以訪問的元素,它的方法個數理論上來講與元素類個數(Element的實現類個數)是一樣的,從這點不難看出,訪問者模式

設計模式 , JAVA , 後端

程序員Seven - 【設計模式】備忘錄模式教你如何優雅地處理狀態快照

概述 備忘錄模式提供了一種狀態恢復的實現機制,使得用户可以方便地回到一個特定的歷史步驟,當新的狀態無效或者存在問題時,可以使用暫時存儲起來的備忘錄將狀態復原,很多軟件都提供了撤銷(Undo)操作,如 Word、記事本、Photoshop、IDEA等軟件在編輯時按 Ctrl+Z 組合鍵時能撤銷當前操作,使文檔恢復到之前的狀態;還有在瀏覽器中的後退鍵、數據庫事務管理中的回滾操作、玩遊戲時的中間結果存檔

設計模式 , JAVA , 後端

程序員Seven - 【設計模式】使用解釋器模式簡化複雜的語法規則

概述 如上圖,設計一個軟件用來進行加減計算。我們第一想法就是使用工具類,提供對應的加法和減法的工具方法。 //用於兩個整數相加 public static int add(int a,int b){ return a + b; } //用於兩個整數相加 public static int add(int a,int b,int c){ return a + b + c; }

設計模式 , JAVA , 後端

程序員Seven - SpringCloud帶你走進微服務的世界

認識微服務 隨着互聯網行業的發展,對服務的要求也越來越高,服務架構也從單體架構逐漸演變為現在流行的微服務架構。這些架構之間有怎樣的差別呢? 單體架構 單體架構:將業務的所有功能集中在一個項目中開發,打成一個包部署。 單體架構的優缺點如下: 優點: 架構簡單 部署成本低 缺點: 耦合度高(維護困難、升級困難) 分佈式架構 分佈式架構:根據業務功能對系統做拆分,每個業務功能模塊作為獨立

設計模式 , JAVA , 後端

程序員Seven - 用過redis哪些數據類型?Redis String 類型的底層實現是什麼?

Redis 數據類型有哪些? 詳細可以查看:數據類型及其應用場景 基本數據類型: String:最常用的一種數據類型,String類型的值可以是字符串、數字或者二進制,但值最大不能超過512MB。一般用於 緩存和計數器 Hash:Hash 是一個鍵值對集合。存儲商品的各個屬性 Set:無序去重的集合。Set 提供了交集、並集等方法,對於實現共同好友、共同關注等功能特別方便。 List:有

redis , 後端

程序員Seven - 一文帶你瞭解緩存和數據庫一致性問題

概述 緩存作為持久化存儲(如數據庫)的輔助存在,畢竟屬於兩套系統。理想情況下是緩存數據與數據庫中數據完全一致,但是業務最常使用的旁路緩存架構下,在一些分佈式或者高併發的場景中,可能會出現緩存不一致的情況。 在分佈式系統中,數據一致性是一個核心問題。根據系統的設計與需求,可以選擇實時強一致性(Strong Consistency)或最終一致性(Eventual Consistency)。 實時強一致

redis , MySQL , 後端

程序員Seven - Redis有哪些部署方案?瞭解哨兵機制嗎?

Redis有哪些部署方案? 單機版*:單機部署,單機redis能夠承載的 QPS 大概就在上萬到幾萬不等。這種部署方式很少使用。存在的問題:1、內存容量有限 2、處理能力有限 3、無法高可用。 主從模式:一主多從,主負責寫,並且將數據複製到其它的 slave 節點,從節點負責讀。所有的讀請求全部走從節點。這樣也可以很輕鬆實現水平擴容,支撐讀高併發。master 節點掛掉後,需要手動指定新的

redis , 後端

程序員Seven - Redis是如何高效管理有限內存的?

過期刪除策略的深度剖析 Redis 可以對 key 設置過期時間的,為了防止過期的key長期佔用內存,需要相應的過期刪除策略將過期的key刪除 基礎操作 Redis設置過期時間 setex key1 5 value1:創建記錄的時候指定過期時間,設置key1在5秒後過期 其實Redis這是一種基於創建時間來判定是否過期的機制,也即常規上説的TTL策略,當設定了過期時間之後不管有沒有被使用都會

redis , 後端

程序員Seven - Redis容量評估模型

計算Redis容量,並不只是僅僅計算key佔多少字節,value佔多少字節,因為Redis為了維護自身的數據結構,也會佔用部分內存,本文章簡單介紹每種數據類型(String、Hash、Set、ZSet、List)佔用內存量,供做Redis容量評估時使用。當然,大多數情況下,key和value就是主要佔用,能解大部分問題 在看這裏之前,可以先看一下底層 - 數據結構 這篇文章 jemalloc內存分

redis , 後端

程序員Seven - Redis是如何進行內存管理的?緩存中有哪些常見問題?如何實現分佈式鎖?

Redis內存管理 Redis的內存用完了會怎樣? 如果達到設置的上限,Redis的寫命令會返回錯誤信息(但是讀命令還可以正常返回)。 也可以配置內存淘汰機制,當Redis達到內存上限時會沖刷掉舊的內容。 Redis如何做內存優化? 可以好好利用Hash,list,sorted set,set等集合類型數據,因為通常情況下很多小的Key-Value可以用更緊湊的方式存放到一起。儘可能使用散列表(h

redis

程序員Seven - 《深入理解Mybatis原理》MyBatis初始化機制詳解

主要構件及其相互關係 主要構件: 主要的核心部件解釋如下: SqlSession: 作為MyBatis工作的主要頂層API,表示和數據庫交互的會話,完成必要數據庫增刪改查功能 Executor:MyBatis執行器,是MyBatis 調度的核心,負責SQL語句的生成和查詢緩存的維護 StatementHandler: 封裝了JDBC Statement操作,負責對JDBC stateme

JAVA , 後端 , Mybatis

程序員Seven - 《深入理解Mybatis原理》MyBatis的sqlSession執行流程

sqlSessionFactory 與 SqlSession 正如其名,Sqlsession對應着一次數據庫會話。由於數據庫會話不是永久的,因此Sqlsession的生命週期也不應該是永久的,相反,在你每次訪問數據庫時都需要創建它(當然並不是説在Sqlsession裏只能執行一次sql,你可以執行多次,當一旦關閉了Sqlsession就需要重新創建它)。 那麼咱們就先看看是怎麼獲取SqlSessi

JAVA , 後端 , Mybatis

程序員Seven - 《深入理解Mybatis原理》MyBatis動態SQL原理

引入 我們在使用mybatis的時候,會在xml中編寫sql語句。比如這段動態sql代碼: update id="update" parameterType="org.format.dynamicproxy.mybatis.bean.User" UPDATE users trim prefix="SET" prefixOverrides="," if test="n

JAVA , 後端 , Mybatis

程序員Seven - 《深入理解Mybatis原理》MyBatis數據源與連接池詳解

MyBatis數據源DataSource分類 MyBatis把數據源DataSource分為三種: UNPOOLED 不使用連接池的數據源 POOLED 使用連接池的數據源 JNDI 使用JNDI實現的數據源 相應地,MyBatis內部分別定義了實現了java.sql.DataSource接口的UnpooledDataSource,PooledDataSource類來表示UNPOOLED

JAVA , 後端 , Mybatis

程序員Seven - 《深入理解Mybatis原理》Mybatis插件機制&分頁機制原理

源碼分析 插件機制 首先我們看下MyBatis攔截器的接口定義: public interface Interceptor { Object intercept(Invocation invocation) throws Throwable; Object plugin(Object target); void setProperties(Properties propertie

JAVA , 後端 , Mybatis

程序員Seven - 《深入理解Mybatis原理》MyBatis事務管理機制

概述 對數據庫的事務而言,應該具有以下幾點:創建(create)、提交(commit)、回滾(rollback)、關閉(close)。對應地,MyBatis將事務抽象成了Transaction接口: MyBatis的事務管理分為兩種形式: 使用JDBC的事務管理機制:即利用java.sql.Connection對象完成對事務的提交(commit())、回滾(rollback())、關閉(cl

JAVA , 後端 , Mybatis

程序員Seven - 《深入理解Mybatis原理》Mybatis中的緩存實現原理

一級緩存實現 什麼是一級緩存? 為什麼使用一級緩存? 每當我們使用MyBatis開啓一次和數據庫的會話,MyBatis會創建出一個SqlSession對象表示一次數據庫會話。 在對數據庫的一次會話中,我們有可能會反覆地執行完全相同的查詢語句,如果不採取一些措施的話,每一次查詢都會查詢一次數據庫,而我們在極短的時間內做了完全相同的查詢,那麼它們的結果極有可能完全相同,由於查詢一次數據庫的代價很大,這

JAVA , 後端 , Mybatis

程序員Seven - 《深入理解Mybatis原理》MyBatis配置解析過程

配置解析主體方法 public Configuration parse() { if (parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } parsed = true; //源碼中沒有這一句,只有 parse

JAVA , 後端 , Mybatis

程序員Seven - Springboot 常見面試題彙總

SpringBoot基礎 什麼是 Spring Boot? SpringBoot是一個簡化 Spring 應用程序開發的框架,它的主要目標是減少 Spring 應用程序的配置和開發複雜性,使我們能夠更快地構建、測試和部署 Spring 應用。簡單來説,它通過提供默認配置、自動化配置和嵌入式服務器等功能,簡化了傳統Spring 應用的繁瑣配置過程。有人將一些依賴關係、默認配置都梳理好了,我們直接一個

springboot , JAVA

程序員Seven - ZooKeeper實現分佈式鎖

基礎 ZooKeeper的4個節點 持久節點:默認的節點類型,一直存在於ZooKeeper中 持久順序節點:在創建節點時,ZooKeeper根據節點創建的時間順序對節點進行編號 臨時節點:當客户端與ZooKeeper斷開連接後,該進程創建的臨時節點就會被刪除 臨時順序節點:按時間順序編號的臨時節點 ZK分佈式鎖相關基礎知識 zk分佈式鎖一般由多個節點構成(單數),採用 zab 一致

zookeeper , JAVA , 後端