Untitled
1.5.2 WrapperWrapper 模式是一種常見的設計模式,它可以用來包裝現有的物件,提供額外的功能或改變其行為。在泛型的幫助下,我們可以建立通用的 Wrapper 類別來處理任何型別的物件
🎯 Wrapper 基本概念Wrapper 類別的主要目的是:
🔐 封裝原始物件:提供對底層物件的受控存取
🎨 增強功能:在不修改原始類別的情況下添加新功能
🛡️ 保護資料:控制對包裝物件的存取方式
🔄 轉換介面:為不相容的介面提供適配
📝 實際應用範例以下範例展示了泛型 Wrapper 的使用和一些需要注意的問題:
123456789101112131415161718192021222324252627282930313233343536void Main(){ var items = new List<int> { 1, 2, 3 }; var wrappers = CreateWrapper2<int>(items); var store = new List<Wrapper<int ...
Untitled
在資料綁定 (Model Binding) 過程沒有收到資料時,會將結構型別 (struct type) 使用初始值當作預設值,參考型別 (reference type) 的話則會顯示 null。
一般常見的 結構型別如 int、double、float、DateTime 等。參考型別則如 string 及一般的 Class。
但 ASP.Net Core 有一個新玩意兒可以解決 - [BindRequired],設定方法只要把它原封不動掛上去可以了。
12345678910111213public class Book{ [BindRequired] public int Id { get; set; } [Required] public string Title{ get; set; } public DateTime PublishDate { get; set; }}
首先在 API Controller 中預設都會套用 [ApiControll ...
Untitled
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556public static async Task TaskStatusTest(){ var cts = new CancellationTokenSource(); var token = cts.Token; System.Console.WriteLine("Please Choose a Status : A : Completed, B : Fault : C : Cancel"); try { var result = await Task.Run(async () => { var inputTask = Task.Run(() => System.Console.ReadKey()); // 讓他跑, 不 await ...
Untitled
🌀 快取踐踏 (Cache Stampede)
當某個熱門資料的快取過期時,瞬間湧入大量請求,導致所有請求同時打到原始資料來源(如資料庫或第三方 API),形成類似「踩踏」的效應。這些請求原本應E2該從快取中直接取得結果,卻因快取剛好失效,全部穿透防線、直接進攻後端資源,造成伺服器短暫過載。
📦 實際案例:假設你有一個商品頁,每次顯示都包含了價格、樣式、庫存狀態等資訊。這些資料通常是快取的理想對象。但當電商促銷活動一開始,流量暴增,而快取又在這個時候剛好過期,所有用戶的請求就會「同時」觸發重新生成快取,導致伺服器一時間被壓垮。
🔒 解法:為了防止這種現象,系統會採用「資源鎖定(Lock)」機制,讓第一個進入的請求負責重建快取,其餘的請求等待結果完成後再讀取,這樣就能避免所有請求同時打進後端。
這也是一個絕佳的壓力測試案例!可以刻意設計快取在高流量時過期,觀察系統是否有妥善應對。
🌀 雷鳴群聚 (Thundering Herd)
在短時間內大量請求同時湧入,對快取系統或後端資源造成瞬間衝擊。不同於「快取踐踏」是因為某個快取過期才導致的,雷鳴群聚是主動湧現的洪流,常見於以下場 ...
Untitled
HA(High Availability,高可用性)
HA 之前,先搞懂 Stateful vs Stateless✅ Stateless component 是什麼?像是:Application Server(AS)/ Nginx
特性是:不會保存任何「狀態」(state),也就是沒有 session、使用者資料、執行進度這些。
所以它可以橫向擴充(scale out)非常容易,想加幾台就加幾台,反正大家都是 stateless。
如何維持 HA(高可用)?
靠 heartbeat(心跳)機制判斷哪台死掉。
有問題就換台 server 接手即可。
✅ Stateful component 是什麼?像是:PostgreSQL / Kafka / RabbitMQ
這類會保存狀態資料,例如資料庫內的使用者資料、訊息佇列的訊息等。
所以要維持 HA,比起 stateless 難很多,因為 state 不能亂丟、不能亂同步。
二、Redis 是什麼?Stateless 嗎?如果 Redis 只是做 caching(快取),就可以當作 stateless 看待( ...
Concurrency-safe
情境切入AtomicityIsolation方法一:鎖住 A方法二:Conditional UPDATE方法三:SerializableRDBMSDynamoDB 的差異總覽
.pg{
display:block;
font-family:'Segoe UI',-apple-system,BlinkMacSystemFont,'PingFang TC','Microsoft JhengHei',sans-serif;
background:
radial-gradient(700px 400px at 94% -6%, rgba(51,103,145,.10), transparent 60%),
radial-gradient(900px 500px at -6% 106%, rgba(28,28,28,.06), transparent 55%),
#fdfdfd;
color:#1c1f22!important;
line-height:1.75;
border-radius:20px;
padding:1px 0 28px;
margin:0 0 20px;
overflow: ...
Durability
總覽代價與取捨PostgreSQLMySQLSQL ServerMongoDBDynamoDBRedis
.hl{
display:block;
font-family:'Segoe UI',-apple-system,BlinkMacSystemFont,'PingFang TC','Microsoft JhengHei',sans-serif;
background:
radial-gradient(700px 400px at 92% -8%, rgba(190,38,35,.10), transparent 60%),
radial-gradient(900px 500px at -8% 108%, rgba(14,55,70,.10), transparent 55%),
#eae8dc;
color:#182228!important;
line-height:1.75;
border-radius:14px;
padding:1px 0 28px;
margin:0 0 20px;
overflow:hidden ...
商品
三層關係Listing與Selling時間欄位SalePageGiftProductStock庫存商品怎麼寫進購物車組合商品Bundle
.hl-hero{position:relative;overflow:hidden;border-radius:18px;padding:36px 40px;margin:0 0 30px;background:linear-gradient(160deg,#f4f2ec 0%,#eae8dc 65%,#e3dfcd 100%);border:1.5px solid #d7cfba;}
.hl-hero::after{content:"";position:absolute;top:-30px;right:-30px;width:120px;height:120px;border-radius:50%;background:radial-gradient(circle at 35% 35%,#c9403c,#8f1c1a);opacity:.16;}
.hl-hero .hh-tag{display:inline-block;font-size:. ...
Postgres - 1
起源與歷史設計思想趨勢Vector Database
.pg{
display:block;
font-family:'Segoe UI',-apple-system,BlinkMacSystemFont,'PingFang TC','Microsoft JhengHei',sans-serif;
background:
radial-gradient(700px 400px at 94% -6%, rgba(51,103,145,.10), transparent 60%),
radial-gradient(900px 500px at -6% 106%, rgba(28,28,28,.06), transparent 55%),
#fdfdfd;
color:#1c1f22!important;
line-height:1.75;
border-radius:20px;
padding:1px 0 28px;
margin:0 0 20px;
overflow:hidden;
--ink:#1c1f22; --sub: ...






