主頁 > 軟體設計 > 詳解Redis核心資料結構和高性能原理分析(一)

詳解Redis核心資料結構和高性能原理分析(一)

2020-12-28 13:32:08 軟體設計

文章目錄

  • 一、Redis介紹
    • 1、Redis是什么
    • 2、Redis的優缺點
  • 二、Redis的安裝(若需要docker版,請看我其他文章)
  • 三、Redis 資料型別
    • 1、string(字串)
      • 1.1、定義
      • 1.2、常用命令
      • 1.3、應用場景
    • 2、list(鏈表)
      • 2.1、定義
      • 2.2、常用命令
      • 2.1、應用場景
    • 3、 Hash(hash表)
      • 3.1、定義
      • 3.2、常用命令
      • 3.3、應用場景
      • 3.4、優缺點
    • 4、set(集合)
      • 4.1、定義
      • 4.2、常用命令
      • 4.3、應用場景
    • 5、zset(sorted set->有序集合)
      • 5.1、定義
      • 5.2、常用命令
      • 5.3、應用場景
    • 6、其他高級命令
  • 四、基本資料結構總結
  • 五、Redis的單執行緒和高性能
    • 1、Redis是單執行緒嗎?
    • 2、Redis 單執行緒為什么還能這么快?
    • 3、Redis 單執行緒如何處理那么多的并發客戶端連接?


一、Redis介紹

1、Redis是什么

Remote Dictionary Server(Redis)是一個開源的使用 ANSI C 語言撰寫、支持網路、可基于記憶體亦可持久化的日志型、Key-Value 資料庫,并提供多種語言的 API,
它通常被稱為資料結構服務器,因為值(value)可以是 字串(String), 哈希(Map),串列(list), 集合(sets) 和 有序集合(sorted sets)等型別,

2、Redis的優缺點

  1. 支持多種資料結構,如 string(字串)、 list(雙向鏈表)、dict(hash 表)、set(集合)、
    zset(排序 set)、hyperloglog(基數估算)
  2. 支持持久化操作,可以進行 aof 及 rdb 資料持久化到磁盤,從而進行資料備份或數
    據恢復等操作,較好的防止資料丟失的手段,
  3. 支持通過 Replication 進行資料復制,通過 master-slave 機制,可以實時進行資料的
    同步復制,支持多級復制和增量復制,master-slave 機制是 Redis 進行 HA 的重要手段,
  4. 單行程請求,所有命令串行執行,并發情況下不需要考慮資料一致性問題,

二、Redis的安裝(若需要docker版,請看我其他文章)

redis安裝

三、Redis 資料型別

總圖:
redis基本型別

1、string(字串)

1.1、定義

Redis 字串是位元組序列,Redis 字串是二進制安全的,這意味著他們有一個已知的
長度沒有任何特殊字符終止,所以你可以存盤任何東西,512 兆為上限

1.2、常用命令

字串常用操作
	SET  key  value 					//存入字串鍵值對
	MSET  key  value [key value ...] 	//批量存盤字串鍵值對
	SETNX  key  value 					//存入一個不存在的字串鍵值對
	GET  key 							//獲取一個字串鍵值
	MGET  key  [key ...]	 			//批量獲取字串鍵值
	DEL  key  [key ...] 				//洗掉一個鍵
	EXPIRE  key  seconds 				//設定一個鍵的過期時間(秒)
	原子加減
	INCR  key 							//將key中儲存的數字值加1
	DECR  key 							//將key中儲存的數字值減1
	INCRBY  key  increment 				//將key所儲存的值加上increment
	DECRBY  key  decrement 				//將key所儲存的值減去decrement

1.3、應用場景

1、單值快取
	SET  key  value 	
	GET  key
2、分布式鎖
	SETNX  product:10001  true 					//回傳1代表獲取鎖成功
	SETNX  product:10001  true 					//回傳0代表獲取鎖失敗
	,,,執行業務操作
	DEL  product:10001							//執行完業務釋放鎖
	SET product:10001 true  ex  10  nx			//防止程式意外終止導致死鎖
3、計數器
	INCR article:readcount:{文章id}  	
	GET article:readcount:{文章id} 
4、Web集群session共享
	spring session + redis實作session共享
5、分布式系統全域序列號	
	INCRBY  orderId  1000						//redis批量生成序列號提升性能
6、物件快取
	1) SET  user:1  value(json格式資料)
	2) MSET  user:1:name  zhz   user:1:balance  1888
    	MGET  user:1:name   user:1:balance 

2、list(鏈表)

2.1、定義

Redis 的鏈表是簡單的字串串列,排序插入順序,您可以添加元素到 Redis 的串列的
頭部或尾部,
在這里插入圖片描述

2.2、常用命令

1、List常用操作
	LPUSH  key  value [value ...] 		//將一個或多個值value插入到key串列的表頭(最左邊)
	RPUSH  key  value [value ...]	 	//將一個或多個值value插入到key串列的表尾(最右邊)
	LPOP  key							//移除并回傳key串列的頭元素
	RPOP  key							//移除并回傳key串列的尾元素
	LRANGE  key  start  stop			//回傳串列key中指定區間內的元素,區間以偏移量start和stop指定
	
	BLPOP  key  [key ...]  timeout		//從key串列表頭彈出一個元素,若串列中沒有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
	BRPOP  key  [key ...]  timeout 		//從key串列表尾彈出一個元素,若串列中沒有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待

2.1、應用場景

1、常用資料結構
	Stack(堆疊) = LPUSH + LPOP
	Queue(佇列)= LPUSH + RPOP
	Blocking MQ(阻塞佇列)= LPUSH + BRPOP
2、微博和微信公號訊息流
3、微博訊息和微信公號訊息
	/**
	* 事例
	**/
	A關注了MacTalk,備胎說車等大V
	1)MacTalk發微博,訊息ID為10018
	LPUSH  msg:{A-ID}  10018
	2)備胎說車發微博,訊息ID為10086
	LPUSH  msg:{A-ID} 10086
	3)查看最新微博訊息
	LRANGE  msg:{A-ID}  0  4

3、 Hash(hash表)

3.1、定義

Redis 的哈希是鍵值對的集合, Redis 的哈希值是字串欄位和字串值之間的映射,
因此它們被用來表示物件,
在這里插入圖片描述

3.2、常用命令

Hash常用操作
	HSET  key  field  value 					//存盤一個哈希表key的鍵值
	HSETNX  key  field  value 					//存盤一個不存在的哈希表key的鍵值
	HMSET  key  field  value [field value ...] 	//在一個哈希表key中存盤多個鍵值對
	HGET  key  field 							//獲取哈希表key對應的field鍵值
	HMGET  key  field  [field ...] 				//批量獲取哈希表key中多個field鍵值
	HDEL  key  field  [field ...] 				//洗掉哈希表key中的field鍵值
	HLEN  key									//回傳哈希表key中field的數量
	HGETALL  key								//回傳哈希表key中所有的鍵值
	HINCRBY  key  field  increment 				//為哈希表key中field鍵的值加上增量increment

3.3、應用場景

物件快取
	HMSET  user  {userId}:name  zhz  {userId}:balance  1888
	HMSET  user  1:name  zhz1:balance  1888
	HMGET  user  1:name  1:balance 
電商購物車
	1)以用戶id為key
	2)商品id為field
	3)商品數量為value
購物車操作
	添加商品->hset cart:1001 10088 1
	增加數量->hincrby cart:1001 10088 1
	商品總數->hlen cart:1001
	洗掉商品->hdel cart:1001 10088
	獲取購物車所有商品->hgetall cart:1001

3.4、優缺點

  • 優點
    1)同類資料歸類整合儲存,方便資料管理
    2)相比string操作消耗記憶體與cpu更小
    3)相比string儲存更節省空間
  • 缺點
    過期功能不能使用在field上,只能用在key上
    Redis集群架構下不適合大規模使用

4、set(集合)

4.1、定義

Redis 的集合是字串的無序集合,
在這里插入圖片描述

4.2、常用命令

1、Set常用操作
	SADD  key  member  [member ...]				//往集合key中存入元素,元素存在則忽略,若key不存在則新建
	SREM  key  member  [member ...]				//從集合key中洗掉元素
	SMEMBERS  key								//獲取集合key中所有元素
	SCARD  key									//獲取集合key的元素個數
	SISMEMBER  key  member						//判斷member元素是否存在于集合key中
	SRANDMEMBER  key  [count]					//從集合key中選出count個元素,元素不從key中洗掉
	SPOP  key  [count]							//從集合key中選出count個元素,元素從key中洗掉

2、Set運算操作
	SINTER  key  [key ...] 						//交集運算
	SINTERSTORE  destination  key  [key ..]		//將交集結果存入新集合destination中
	SUNION  key  [key ..] 						//并集運算
	SUNIONSTORE  destination  key  [key ...]	//將并集結果存入新集合destination中
	SDIFF  key  [key ...] 						//差集運算
	SDIFFSTORE  destination  key  [key ...]		//將差集結果存入新集合destination中

4.3、應用場景

1、微信抽獎小程式
	1)點擊參與抽獎加入集合
	SADD key {userlD}
	2)查看參與抽獎所有用戶
	SMEMBERS key	  
	3)抽取count名中獎者
	SRANDMEMBER key [count] / SPOP key [count]
2、微信微博點贊,收藏,標簽
	1) 點贊
	SADD  like:{訊息ID}  {用戶ID}
	2) 取消點贊
	SREM like:{訊息ID}  {用戶ID}
	3) 檢查用戶是否點過贊
	SISMEMBER  like:{訊息ID}  {用戶ID}
	4) 獲取點贊的用戶串列
	SMEMBERS like:{訊息ID}
	5) 獲取點贊用戶數 
	SCARD like:{訊息ID}
3、集合操作
	SINTER set1 set2 set3 -> { c }
	SUNION set1 set2 set3 -> { a,b,c,d,e }
	SDIFF set1 set2 set3  -> { a }
4、集合操作實作微博微信關注模型
	1) A關注的人: 
	ASet-> {B, C}
	2) D老師關注的人:
	 DSet--> {A, E, B, C}
	3) B老師關注的人: 
	BSet-> {A, D, E, C, F)
	4) 我A和D老師共同關注: 
	SINTER ASet DSet--> {B, C}
	5) 我A關注的人也關注他(D老師): 
	SISMEMBER BSet D
	SISMEMBER CSet D
	6) 我可能認識的人: 
	SDIFF DSet ASet->(A, E}
5、集合操作實作電商商品篩選
	SADD  brand:huawei  P40
	SADD  brand:xiaomi  mi-10
	SADD  brand:iPhone iphone12
	SADD os:android  P40  mi-10
	SADD cpu:brand:intel  P40  mi-10
	SADD ram:8G  P40  mi-10  iphone12
	SINTER  os:android  cpu:brand:intel  ram:8G ->  {P40,mi-10}

5、zset(sorted set->有序集合)

5.1、定義

Redis 的有序集合類似于 Redis 的集合,字串不重復的集合,

5.2、常用命令

ZSet常用操作
	ZADD key score member [[score member]]		//往有序集合key中加入帶分值元素
	ZREM key member [member …]					//從有序集合key中洗掉元素
	ZSCORE key member 							//回傳有序集合key中元素member的分值
	ZINCRBY key increment member				//為有序集合key中元素member的分值加上increment 
	ZCARD key									//回傳有序集合key中元素個數
	ZRANGE key start stop [WITHSCORES]			//正序獲取有序集合key從start下標到stop下標的元素
	ZREVRANGE key start stop [WITHSCORES]		//倒序獲取有序集合key從start下標到stop下標的元素
Zset集合操作
	ZUNIONSTORE destkey numkeys key [key ...] 	//并集計算
	ZINTERSTORE destkey numkeys key [key …]		//交集計算

5.3、應用場景

Zset集合操作實作排行榜
	1)點擊新聞
	ZINCRBY  hotNews:20190819  1  守護香港
	2)展示當日排行前十
	ZREVRANGE  hotNews:20190819  0  9  WITHSCORES 
	3)七日搜索榜單計算
	ZUNIONSTORE  hotNews:20190813-20190819  7 
	hotNews:20190813  hotNews:20190814... hotNews:20190819
	4)展示七日排行前十
	ZREVRANGE hotNews:20190813-20190819  0  9  WITHSCORES

6、其他高級命令

1、keys:
	全量遍歷鍵, 用來列出所有滿足特定正則字串規則的key,當redis資料量比較大時,性能比較差,要避免使用

2、SCAN cursor [MATCH pattern] [COUNT count]
	scan 引數提供了三個引數,第一個是 cursor 整數值(hash桶的索引值),第二個是 key 的正則模式,
	第三個是一次遍歷的key的數量(參考值,底層遍歷的數量不一定),并不是符合條件的結果數量,第
	一次遍歷時,cursor 值為 0,然后將回傳結果中第一個整數值作為下一次遍歷的 cursor,一直遍歷
	到回傳的 cursor 值為 0 時結束,
	注意:但是scan并非完美無瑕, 如果在scan的程序中如果有鍵的變化(增加、 洗掉、 修改) ,那
	么遍歷效果可能會碰到如下問題: 新增的鍵可能沒有遍歷到, 遍歷出了重復的鍵等情況, 也就是說
	scan并不能保證完整的遍歷出來所有的鍵,開發市需要考慮
3、Info:
	查看redis服務運行資訊,分為 9 大塊,每個塊都有非常多的引數,這 9 個塊分別是:
4、Server 
	服務器運行的環境引數
5、Clients 
	客戶端相關資訊
6、Memory 
	服務器運行記憶體統計資料
7、Persistence 
	持久化資訊
8、Stats 
	通用統計資料
9、Replication 
	主從復制相關資訊
10、CPU CPU 
	使用情況
11、Cluster 
	集群資訊
12、KeySpace 
	鍵值對統計數量資訊

四、基本資料結構總結

在這里插入圖片描述

五、Redis的單執行緒和高性能

1、Redis是單執行緒嗎?

Redis 的單執行緒主要是指 Redis 的網路 IO 和鍵值對讀寫是由一個執行緒來完成的,這也是 Redis 對外提供鍵值存盤服務的主要流程,但 Redis 的其他功能,比如持久化、異步洗掉、集群資料同步等,其實是由額外的執行緒執行的,

2、Redis 單執行緒為什么還能這么快?

  • 它所有的資料都在記憶體中,所有的運算都是記憶體級別的運算,而且單執行緒避免了多執行緒的切換性能損耗問題,因為 Redis 是單執行緒,所以要小心使用 Redis 指令,對于那些耗時的指令(比如
    keys),一定要謹慎使用,一不小心就可能會導致 Redis 卡頓,
  • Redis完全基于記憶體,絕大部分請求是純粹的記憶體操作,非常迅速,資料存在記憶體中,
  • 資料結構簡單,對資料操作也簡單,
  • 采用單執行緒,避免了不必要的背景關系切換和競爭條件,不存在多執行緒導致的CPU切換,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有死鎖問題導致的性能消耗,
  • 使用多路復用IO模型,非阻塞IO,

3、Redis 單執行緒如何處理那么多的并發客戶端連接?

Redis的IO多路復用:redis利用epoll來實作IO多路復用,將連接資訊和事件放到佇列中,依次放到
檔案事件分派器,事件分派器將事件分發給事件處理器,
在這里插入圖片描述

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

標籤:其他

上一篇:Kubernetes - Xshell連接虛擬機 & 搭建Kubernetes基礎集群

下一篇:國產微服務網關-Soul(真香)

標籤雲
其他(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