針對大數據傳輸與高頻訪問,優化需從架構、緩存、數據庫設計、查詢優化四個維度系統性解決。
主庫負責寫入,從庫負責查詢,通過主從複製同步數據。C# 中使用連接字符串區分:
// 寫操作連接主庫
string writeConn = "Server=master;Database=Biz;...";
// 讀操作連接從庫(可配置多個從庫負載均衡)
string readConn = "Server=slave1;Database=Biz;...";
| 層級 | 技術 | 適用場景 | C# 實現 |
|---|---|---|---|
| 本地緩存 | MemoryCache / ConcurrentDictionary | 熱點配置、字典表、單機高頻 | MemoryCache.Default.Set(key, value, policy) |
| 分佈式緩存 | Redis / Memcached | 集群共享、Session、大對象 | StackExchange.Redis 客戶端 |
| 數據庫層 | 查詢緩存 / 物化視圖 | 複雜聚合、報表查詢 | SQL Server 索引視圖 |
public async Task<Product> GetProduct(int id) {
string key = $"product:{id}";
// 先查 Redis
var product = await _redis.GetAsync<Product>(key);
if (product != null) return product;
// 回源數據庫
product = await _db.Products.FindAsync(id);
if (product != null)
await _redis.SetAsync(key, product, TimeSpan.FromMinutes(30));
return product;
}
using (var bulkCopy = new SqlBulkCopy(writeConn)) {
bulkCopy.DestinationTableName = "Logs";
bulkCopy.WriteToServer(dataTable); // DataTable 或 IDataReader
}
-- SQL Server 2012+ 推薦
SELECT * FROM Orders
ORDER BY Id OFFSET @pageSize * (@pageNum - 1) ROWS
FETCH NEXT @pageSize ROWS ONLY;
var tasks = ids.Select(id => _repo.GetAsync(id));
var results = await Task.WhenAll(tasks); // 並行查詢
ALTER INDEX ALL ON Table REBUILD。SET STATISTICS IO, TIME ON 分析執行計劃。「讀寫分離 + 多級緩存 + 分區表 + 批量異步」組合拳,配合持續監控,可將系統吞吐量提升 10-100 倍。C# 生態下 Dapper、EntityFrameworkCore、StackExchange.Redis 是落地利器。