动态

列表
创建 时间

Netty高級使用與源碼詳解

粘包與半包 粘包現象 粘包的問題出現是因為不知道一個用户消息的邊界在哪,如果知道了邊界在哪,接收方就可以通過邊界來劃分出有效的用户消息。 服務端代碼 public class HelloWorldServer { static final Logger log = LoggerFactory.getLogger(HelloWorldServer.class); void start

创建 时间

反轉鏈表(花式反轉)

題目描述 給你單鏈表的頭節點 head ,請你反轉鏈表,並返回反轉後的鏈表。 示例 1: 輸入:head = [1,2,3,4,5] 輸出:[5,4,3,2,1] 示例 2: 輸入:head = [1,2] 輸出:[2,1] 示例 3: 輸入:head = [] 輸出:[] 提示: 鏈表中節點的數目範圍是 [0, 5000] -5000 = Node.val = 5000 進階:鏈表可

创建 时间

從尾到頭打印鏈表

題目描述 輸入一個鏈表的頭節點,按鏈表從尾到頭的順序返回每個節點的值(用數組返回)。 如輸入{1,2,3}的鏈表如下圖: 返回一個數組為[3,2,1] 0 = 鏈表長度 = 10000 示例1 輸入: {1,2,3} 返回值: [3,2,1] 示例2 輸入: {67,0,24,58} 返回值: [58,24,0,67] 思路及解答 ⾸先我們需要想⽤哪些解法可以解,⼤概有如下: 使⽤棧 使⽤

创建 时间

算法題:數組中的第k個最大元素

力扣鏈接 題意 給定整數數組nums和整數k,請返回數組中第k 個最大的元素。 請注意,你需要找的是數組排序後的第k個最大的元素,而不是第k個不同的元素。 你必須設計並實現時間複雜度為O(n)的算法解決此問題。 示例 1: 輸入: [3,2,1,5,6,4], k = 2 輸出: 5 示例2: 輸入: [3,2,3,1,2,4,5,5,6], k = 4 輸出: 4 提示: 1 =

创建 时间

劍指offer-1、⼆維數組中的查找

題目描述 在⼀個⼆維數組中(每個⼀維數組的⻓度相同),每⼀⾏都按照從左到右遞增的順序排序,每⼀列都按照從上到下遞增的順序排序。請完成⼀個函數,輸⼊這樣的⼀個⼆維數組和⼀個整數,判斷數組中是否含有該整數。 例⼦,輸⼊⼀個數組: num[3][4] = [ 1 , 4 , 6 , 28 , 2 , 7 , 32 , 30 , 10 , 11 , 67 , 79 ] 需要查找⼀個數字 32 ,則返回 t

创建 时间

劍指offer-3、從尾到頭打印鏈表

題目描述 輸入一個鏈表的頭節點,按鏈表從尾到頭的順序返回每個節點的值(用數組返回)。 如輸入{1,2,3}的鏈表如下圖: 返回一個數組為[3,2,1] 0 = 鏈表長度 = 10000 示例1 輸入: {1,2,3} 返回值: [3,2,1] 示例2 輸入: {67,0,24,58} 返回值: [58,24,0,67] 思路及解答 ⾸先我們需要想⽤哪些解法可以解,⼤概有如下: 使⽤棧 使⽤

创建 时间

劍指offer-9-變態跳台階

題⽬描述 ⼀只⻘蛙⼀次可以跳上1 級台階,也可以跳上2級……它也可以跳上n級。求該⻘蛙跳上⼀個n級的台階總共有多少種跳法。 思路及解答 數學歸納法 ⾸先⻘蛙⼀次可以跳 1 , 2 , 3 到 n 級。假設函數是f(n) ,則: ⻘蛙跳到第⼀級是f(1)=1 ,只有⼀種跳法。 ⻘蛙跳到第⼆級,可以是直接跳到第⼆級,也可以是從第⼀級直接跳。所以f(2)=f(1)+1 ⻘蛙跳到第三級,可以從第0

创建 时间

RabbitMQ基礎入門

RabbitMQ介紹 RabbitMQ是基於Erlang語言開發的開源消息通信中間件,官網地址: Messaging that just works — RabbitMQ 接下來,我們就學習它的基本概念和基礎用法。 安裝 在安裝命令中有兩個映射的端口: 15672:RabbitMQ提供的管理控制枱的端口 5672:RabbitMQ的消息發送處理接口 安裝完成後,訪問 http:

创建 时间

Maven入門,讀完這篇就夠了

Maven 項⽬⽣命週期 Maven從項⽬的三個不同的⻆度,定義了三套⽣命週期,三套⽣命週期是相互獨⽴的,它們之間不會相互影響。 清理⽣命週期(Clean Lifecycle):該⽣命週期負責清理項⽬中的多餘信息,保持項⽬資源和代碼的整潔性。⼀般拿來清空directory(即⼀般的target)⽬錄下的⽂件。 默認構建⽣命週期(Default Lifeclyle):該⽣命週期表示這項⽬的構

创建 时间

【設計模式】命令模式助力快速添加新命令而不影響現有代碼

概述 日常生活中,我們出去吃飯都會遇到下面的場景。 定義: 將一個請求封裝為一個對象,使發出請求的責任和執行請求的責任分割開。這樣兩者之間通過命令對象進行溝通,這樣方便將命令對象進行存儲、傳遞、調用、增加與管理。 結構 命令模式包含以下主要角色: 抽象命令類(Command)角色: 定義命令的接口,聲明執行的方法。 具體命令(Concrete Command)角色:具體的命令,實現命令接口

创建 时间

【設計模式】責任鏈模式教你如何優雅地分發任務

概述 在現實生活中,常常會出現這樣的事例:一個請求有多個對象可以處理,但每個對象的處理條件或權限不同。例如,公司員工請假,可批假的領導有部門負責人、副總經理、總經理等,但每個領導能批准的天數不同,員工必須根據自己要請假的天數去找不同的領導簽名,也就是説員工必須記住每個領導的姓名、電話和地址等信息,這增加了難度。這樣的例子還有很多,如找領導出差報銷、生活中的“擊鼓傳花”遊戲等。 定義: 又名職責鏈模

创建 时间

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

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

创建 时间

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

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

创建 时间

【設計模式】使用中介者模式實現鬆耦合設計

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

创建 时间

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

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

创建 时间

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

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

创建 时间

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

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

创建 时间

SpringCloud帶你走進微服務的世界

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

创建 时间

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

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

创建 时间

一文帶你瞭解緩存和數據庫一致性問題

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

创建 时间

Redis有哪些部署方案?瞭解哨兵機制嗎?

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

创建 时间

Redis是如何高效管理有限內存的?

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

创建 时间

Redis容量評估模型

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