主頁 > 軟體設計 > 階段性學習總結

階段性學習總結

2021-03-08 11:46:16 軟體設計

只是為了做筆記!!!

一,tcp/ip 協議

tcp作業在傳輸層,傳輸包資料

TCP三手握手:

1,客戶端發送一個初始序列號和syn=1請求標志

2,服務端收到后回傳一個syn請求標志,同時發送一個確認標志ack,自己的seq,客戶端的ack+1

3,客戶端收到ack后,發送一個ack,自己的seq對方的ack

三次是為了確保雙方都知道自己接收發送正常

四手揮手:

1,客戶端發出一個fin結束標志,自己的序列號seq=u,進入FIN-WAIT-1的狀態

2,服務端發送ack=1,對方的ack,自己的seq 進入close-wait狀態

3,客戶端進入FIN-WAIT-2狀態,服務端請求斷開,發送seq ack,對方面的ack=對方的序列號+1

4,客戶端收到后,斷開請求,發送ack seq 對方的ack=鄧方的序列號+1

當收到對方的 FIN 報文時,僅僅表示對方不再發送資料了但是還能接收資料,是否結束還需要等待上層應用決定,所以ack和fin分開過需要四次

TCP拆包/粘包

定義: 粘包就是一個較大的包與一個較小的包順序傳輸時,較大的包有部分資料與較小的包粘在了一起,即發生了拆包與粘包

原因:由于沒有明確的包的界限,應用寫入的資料大于套位元組緩沖區,這會發生拆包,反之,粘包

解決辦法:

1,明確邊界,如特殊字符

2,固定長度,不足用0等補足

3,添加包首,包括包長度等資訊

IP作業在網路層

二,mysql

1,mysql架構

一條sql如果執行的

先從連接器進行權限,用戶校驗,如果有快取則直接回傳結果,如果沒再到第二層的決議器進行語法檢查,然后交給優化器進行索引優化,索引選擇,再到執行器呼叫

engine介面,再回傳

2,InnoDB介紹

2.1 整體架構圖

???

記憶體池

???

緩沖池( innodb_buffer_pool)

引數:innodb_buffer_pool_size 調整快取大小,通過lru(最近最小使用策略),利用checkpoint(擦除)機制將資料重繪到磁盤(PS:innodb是dml陳述句是先在緩沖區里操作)

重做日志

redo log(已修改記錄日志) 保證事務的原子性,持久性,采用Write ahead Log方式,在事務提交時,先寫重做日志,再修改頁

redo log 在結構上分為兩個部分:一個redo_log_buffer 一個redo_log_file

redo log通常是物理日志,記錄的是資料頁的物理修改,用來恢復資料頁最后一次提交的位置

//引數:
innodb_log_buffer_size  ##buffer大小

innodb_flush_log_at_trx_commit  ##多少次提交進行一次log file寫入,默認為1

innodb_flush_log_at_timeout ##從緩沖寫入的時間頻率

undo log (回滾日志)是一個邏輯日志,用來回滾到行記錄到某個版本

事務

事務的實作就是通過redo log與鎖機制

事務的隔離級別

事務隔離級別描述實作原理臟讀不可重復讀幻讀
READ UNCOMMITTED一個事務會讀到另一個未提交事務修改過的資料,
READ COMMITTED一個事務只能讀到另一個已經提交的事務修改過的資料,樂觀鎖+MVCC
REPEATABLE READ一個事務只能讀到另一個已經提交的事務修改過的資料,而且該事務第一次讀過某條記錄后,即使其他事務修改了該記錄的值并且提交,該事務之后再讀該條記錄時,讀到的仍是第一次讀到的值,樂觀鎖+MVCC
SERIALIZABLE事務串行化執行悲觀鎖

Purge 最終實作delete update的操作,由于innodb支持mvcc,所以記錄不能在事務提交時立即處理,因為還有其它事務在參考這行資料undo log (未修改記錄日志) 保證事務的原子性,可回滾操作,和MVCC的實作

MVCC原理

1,表中每行的隱藏列:記錄了一個事務的ID,一個指向上一個版本undo log的指標

2,undo log的版本鏈

3,read view(快照):在RR級別下,開啟事務后,select時,會創建一個快照,把其它活躍的事務記錄下來,RC就是每個select都會生成快照

4,可見性判斷:當前事務ID:trx_id_current,最早的事務ID up_limit_id,最晚的事務ID:low_limit_id

口訣:當前事務ID小于最早的,可見;大于最晚的,不可見,在兩者之間,如果這個事務ID存在不可見,不在可見,需要查找undo log上一個版本

輔記點:事務ID越早越可見

定義實作/原因解決辦法
每次操作都會被其事務修改,所以會加鎖

mysql使用共享鎖與排它鎖,行鎖

只有在修改時才會加鎖版本號或Cas提交
讀一行資料
更新/洗掉一行
鎖單行
間隙鎖,不包括本身
record lock + gap lock
兩個事務都在請求同一個資源而持續等待無法釋放程序1,兩個事務加鎖的順序不一致1,編碼時注意查詢與寫入的順序

死鎖

多個事務在請求同一個資源而互相等待對方釋放的程序

查看方法:

//查看當前所有鎖的情況
show status like '%lock%';
//查看當前行程
show processlist;
1:查看當前的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

2:查看當前鎖定的事務

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

3:查看當前等鎖的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 

造成原因及解決方法:兩個(或以上)的Session加鎖的順序不一致

從操作資料庫的動作來分析

1.Delete洗掉不存在的資料導致死鎖

容易造成區間鎖

解決方法:

①先檢查記錄是否存在,否則不洗掉,

②對于同一條記錄,建議使用update

③如果鎖是gap鎖,這種死鎖需要將事務的隔離級別設定為read commit,

④對于等待鎖的的會話使用innodb_lock_wait_timeout,防止過載,

2,insert update時造成死鎖

解決方法:

1,使用mysql自有的方法

1,on duplicate key update 
2,使用replace來解決

2,使用redis自增Key

3, 雪花演算法

3,select for update(行鎖)

Innodb關鍵特性

1,插入緩沖 insert buffer 由于非聚集索引即輔助索引是非連續的,所以在刷盤之前先進行判斷是否在索引快取頁中,如果存在即直接插入或修改,如果不再就放入insert buffer中以一定頻率和輔助索引頁的節點進行合并再刷盤,內部實作也為一果b+tree

2,雙寫:寫redo log和redo log副本,幫且災難恢復

3,自適應hash,監控表的查詢情況,建立一個hash表,不需要建立hash索引

4,異步I/O 預讀,預寫都是通過異步進行

5,重繪鄰近頁:即為同時鄰近臟頁資料

Innodb索引:

原理:使用B+樹的結構,采用聚集索引的結構,葉子節點才會存放行記錄或主鍵記錄,而且索引與資料檔案放在一起的,一張表就是一個聚集索引,myisam是非聚集

優點:按索引排序,方便查詢與order等操作,檢索更快

主索引:葉子節點存放的是行記錄

輔助索引:葉子節點存放的主鍵ID,有一個回表的操作,I/O次數為通常為(樹高-1,ps:這個-1是因為根節點常駐記憶體)

前綴索引:由于mysql的資料頁為16K,一個頁在索引樹上為一個節點,如果要存放更多的索引值,就需要減少索引的長度,而本身索引的長度是有限制的小于767個位元組,組合索引不能超過307位元組,引出一個問題,為什么是3073呢,還是與page 16K相關,因為要預留頁空間和輔助,如果一個頁不能存放一個索引值就退化成了鏈表,不符合設計思想

覆寫索引:用一個sql說明,簡單易懂:select a,b,c from user where a and b and c (a,b,c)union_index

PS:索引下推(5.6后mysql服務器將在判斷條件里有索引的列交給存盤引掣進行判斷,減少底層訪問表的次數,也減少了mysql呼叫存盤引掣的次數)

Mysql主從同步

1,架構圖

2,同步方式

2.1 異步同步:在master上開啟binlog功能一個I/O同步執行緒,在從庫上配置,兩個執行緒(一個IO執行緒,一個請求執行緒)

//主
server-id=1
log-bin=mysql-bin
//從
log_bin           = mysql-bin
server_id         = 2
relay_log         = mysql-relay-bin
log_slave_updates = 1
read_only         = 1

2.2 半同步 master會等待slave至少發送一個寫入relay log成功后提交,否則一直等待至超時(10s)

2.3 多執行緒同步:slave多個執行緒從master同步binlog日志,再順序寫入

3,兩種格式:statment (陳述句);raw(行記錄),一個mixed(混合)

參考檔案 https://zhuanlan.zhihu.com/p/158978012

https://blog.csdn.net/weixin_30311605/article/details/96400293?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&dist_request_id=1328602.26741.16150133251090833&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control

三,redis

1,redis的五種常用型別及資料結構(string,list,hash,set,zset)

原創:redis中8種資料結構的底層資料結構原始碼詳解

SDS simple synamic string:支持自動動態擴容的位元組陣列,遍歷O(N),獲取長度O(1),二進制安全,有一個特定的結束符\0
list :鏈表,雙向,無環,長度計數,多型
dict :使用雙哈希表實作的, 支持平滑擴容的字典 
zskiplist :附加了后向指標的跳躍表 
intset : 用于存盤整數數值集合的自有結構 
ziplist :一種實作上類似于TLV, 但比TLV復雜的, 用于存盤任意資料的有序序列的資料結構 
quicklist:一種以ziplist作為結點的雙鏈表結構, 實作的非常不錯 
zipmap : 一種用于在小規模場合使用的輕量級字典結構 

String:

list:

hash:

set:

zset有三種還有一種是用hash(字典)

sds做為string的底層結構

list 做為list的底層結構

hashTable做hash的底層結構之一

skiplist 跳表 用兩張表

ziplist 壓縮表作為 list,hash,zset的底層結構

在這里插入圖片描述

intset 整數集合作為set的底層結構之一

在這里插入圖片描述

2,快取擊穿,穿透,雪崩

2.1,穿透:快取里沒有,資料庫里有,解決:資料的合法性、安全性進行校驗;布隆過濾器

擊穿:快取里沒有,資料庫里也沒有,解決:熱點Key永不失效;互斥鎖

雪崩:快取里的key大面積失效,解決:隨機過期時間;主動更新資料

3,快取過期策略

3.1 定時洗掉:redis每隔100ms隨機檢查是否有過期Key

3.2 惰性洗掉:在訪問到這個Key時檢查

3.3 淘汰機制:lru(最近最少使用)

noeviction:不足時報錯,無法寫入

allkeys-lru: 不足時,在所有Key中最近最少使用的洗掉

allkeys-ramdom:不足時,在所有Key中隨機洗掉

volatile-lru: 不足時,在過期Key中最近最少使用洗掉

volatile-ramdom:不足時,在過期Key中隨機洗掉

volatile-ttl:不足時,在過期Key中洗掉更早的

4,快取主從+哨兵

4.1,主從

概念:一般來講redis的服務器搭建分為主從,分布式,而哨兵單獨存在是沒有意義的

原理及實作:

1,先在從節點redis.conf中配置:slaveof 主資料庫ip 主資料庫port
先啟動主節點,再啟動從節點即可-------準備階段

2,從節點發送sync(psync)命令,主節點收到后無條件觸發RDB持久化并保存在此期間新的寫命令

3,當快照完成后,主節點將RDB檔案和命令一起發送給從節點

4,從節點會加載快照檔案和命令進行同步

核心機制:

1,offset 偏移量

2,backlog 1M用來做增量復制留存記錄頁

3,run id :主從都會寫

4,psync:同步命令

5,heatbeat機制:主節點10s一次,從節點1s一次

4.2,哨兵

作用:

1.監控主資料庫和從資料庫是否能夠正常運行
2.主資料庫出現故障時自動將從資料庫轉換為主資料庫,

在這里插入圖片描述

實作:由三個定時腳本

  • 每隔10s向主資料庫和從資料庫發送info命令,檢查節點資訊
  • 每隔2s向主資料里和從資料庫的_sentinel_:hello頻道發送自己的資訊,
  • 每隔1s向所有資料庫節點和所有哨兵節點發送ping命令

選舉:兩個選舉,一個是對節點故障的選舉;另一個是哨兵自己本身的故障選舉,哨兵為奇數方便投票

主節點下線:

  • 選出領頭哨兵
  • 領頭哨兵從在線的從資料庫中,選擇優先級最高的從資料庫,優先級可以通過slave-priority選項設定,
  • 如果優先級相同,則從復制的命令偏移量越大(即復同步資料越多,資料越新),越優先,
  • 如果以上條件都一樣,則選擇run ID較小的從資料庫

哨兵自我選舉

  • 發送主資料庫客觀下線的哨兵向每個哨兵命令,要求對方選擇自己為領頭,
  • 如果沒有選擇過其他哨兵,則會同意請求
  • 如果發現有超過半數,且超過quorum的哨兵同意自己的請求,則自己就是哨兵領頭,

4.3,分布式系統資料一致性

四,PHP&Go

五,資料結構

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/267503.html

標籤:其他

上一篇:從“訊息佇列”到“服務總線”和“流處理平臺”

下一篇:Dubbo進階(十四)—— dubbo+zookeeper與提供者provider、消費者consumer通信原理講解

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more