📍1. Gzip壓縮技術詳解
Gzip是一種流行的無損數據壓縮格式,它使用DEFLATE算法來減少文件大小,廣泛應用于網絡傳輸和文件存儲中以提高效率。
🚀 使用場景:
? 網站優化:通過壓縮HTML、CSS、JavaScript文件來加速頁面加載,提升用戶體驗。
? 數據備份與歸檔:壓縮大型數據集,減少存儲空間和傳輸帶寬。
? API數據傳輸:壓縮API響應,降低網絡傳輸成本,尤其是在移動網絡環境下。
? 大數據處理:在Hadoop、Spark等大數據框架中壓縮中間結果,提高處理效率。
🔧 Golang使用示例:
import ("bytes""compress/gzip"
)func GzipEncode(data []byte) ([]byte, error) {var buf bytes.Buffergw := gzip.NewWriter(&buf)defer gw.Close()_, err := gw.Write(data)if err!= nil {return nil, err}return buf.Bytes(), nil
}
📍2. MySQL慢查詢處理四部曲
? 開啟慢查詢日志:配置my.cnf
文件,設置slow_query_log=1
和long_query_time
閾值,記錄執行時間超過閾值的SQL語句。
? 使用分析工具:利用mysqldumpslow
、pt-query-digest
等工具分析慢查詢日志,識別頻繁執行的慢SQL。
? 優化索引:根據慢查詢分析結果,為頻繁查詢的列創建索引,優化復合索引順序,遵循最左前綴原則。
? SQL優化:重構SQL語句,避免使用SELECT *,減少JOIN操作,使用LIMIT限制結果集大小,優化子查詢和關聯查詢。
📍3. Binlog日志格式對比
格式 | 特點 | 適用場景 |
---|---|---|
STATEMENT | 記錄SQL語句,日志量小,性能高 | 簡單DML操作,不涉及復雜事務 |
ROW | 記錄行級變更,數據一致性高,可精確恢復 | 復雜事務,需要高數據安全性 |
MIXED | 自動切換STATEMENT和ROW格式 | 混合業務場景,兼顧性能和安全性 |
📍4. MySQL索引優化指南
? B+樹索引:理解B+樹結構,合理設計索引,支持快速查找和范圍查詢。
? 最左前綴原則:復合索引按查詢頻率高的列在前,確保索引高效利用。
? 覆蓋索引:優化查詢列與索引列,避免回表操作,提高查詢效率。
? 索引優化案例:分析查詢性能瓶頸,為頻繁查詢的列添加索引,減少IO操作,提升查詢速度。
📍5. 強一致性定義
強一致性(也稱為線性一致性或原子一致性)要求分布式系統中所有節點在同一時刻看到的數據完全一致,確保數據的實時性和準確性。
典型實現:兩階段提交(2PC)、Paxos、Raft等分布式一致性算法。
應用場景:金融交易、庫存管理、訂單處理等對數據一致性要求極高的業務場景。
📍6. Kafka業務場景
? 日志收集與分析:實時采集用戶行為日志、系統日志,支持大數據量處理和實時分析。
? 事件驅動架構:實現服務間解耦,通過發布/訂閱模式實現異步消息傳遞,提高系統可擴展性和靈活性。
? 數據管道:作為數據流平臺,連接數據源和目標系統,實現數據集成和ETL流程。
? 實時數據流處理:結合Flink、Spark Streaming等流處理框架,實現實時數據分析和決策支持。
📍7. RocketMQ事務消息流程
- 發送半消息(prepare消息):生產者發送消息到RocketMQ,消息狀態為半消息。
- 執行本地事務:生產者執行本地事務操作,如數據庫更新、文件寫入等。
- 根據本地事務結果,提交或回滾消息:生產者根據本地事務執行結果,向RocketMQ發送提交或回滾消息。
🛡? 確保消息發送與本地事務執行結果一致,常用于分布式事務場景,如訂單支付、庫存扣減等。
📍8. 消息隊列選型指南
? Kafka:適合大數據量、高吞吐量的場景,如日志收集、實時數據處理、數據流平臺等。
? RocketMQ:提供事務消息、順序消息、消息過濾等高級特性,適合金融、電商等對消息可靠性要求極高的場景。
? 選型考慮:根據業務需求、性能要求、可靠性、功能特性、生態系統支持等因素選擇合適的消息隊列。
📍9. 消息冪等保障方案
? 唯一消息ID:為每條消息生成唯一ID,消費者在處理消息前檢查是否已處理過。
? 數據庫去重表:使用數據庫表記錄已處理消息ID,消費前查詢去重表判斷消息是否已處理。
? 狀態機控制:根據業務狀態判斷消息是否已處理,確保消息處理邏輯冪等。
? 分布式鎖:在高并發場景下,使用分布式鎖確保同一時刻只有一個消費者處理消息。
📍10. 死信隊列實現
? 設置消息消費超時或重試次數:配置消息隊列的消費超時時間和重試次數。
? 消費失敗的消息被投遞到死信隊列(DLQ):消息消費失敗后,被自動投遞到死信隊列。
? 監控DLQ,定期處理失敗消息:通過監控工具或定時任務檢查DLQ,處理失敗消息,如人工干預、自動重試或記錄日志。
📍11. Redis分布式鎖實現
func RedisDistributedLock(conn redis.Conn, lockKey string, lockValue string, expire int) bool {script := redis.NewScript(1, `if redis.call("setnx", KEYS[1], ARGV[1]) == 1 thenredis.call("expire", KEYS[1], ARGV[2])return 1elsereturn 0end`)result, err := script.Run(conn, []string{lockKey}, []string{lockValue, expire}).Result()if err!= nil {return false}return result.(int) == 1
}
?? 注意鎖的過期時間設置,避免死鎖,同時考慮鎖的續期問題,防止業務執行時間過長導致鎖提前釋放。
📍12. RedLock解決的問題
RedLock通過多節點分布式鎖機制,解決單點Redis故障導致的鎖失效問題,確保分布式環境下鎖的高可用性和安全性。
主要解決以下問題:
? 單點故障:避免單點Redis宕機導致鎖不可用。
? 鎖過期釋放:在鎖過期時間內,如果業務未執行完,防止其他節點獲取到鎖。
? 腦裂問題:在Redis集群中,避免因網絡分區導致多個節點同時持有鎖。
📍13. Redis消息隊列方案
? List結構:使用LPUSH
和RPOP
實現簡單隊列,適用于低并發、輕量級消息場景。
? Streams:Redis 5.0引入的新特性,支持消息持久化、消費者組、消息確認、消息ID生成等高級功能,提供更強大的消息隊列能力。
應用場景:適用于輕量級、低延遲的消息場景,如實時通知、任務隊列等,但需注意消息持久化和數據一致性,確保消息不丟失。
📍14. ES+MySQL架構實踐
? MySQL存儲事務性數據:作為主數據庫,存儲訂單、用戶、交易等事務性數據,保證數據完整性和一致性。
? ES存儲非事務性數據:用于全文搜索、數據分析、實時查詢等場景,提供快速查詢和數據分析能力。
? 數據同步:使用Canal、Logstash等工具實現MySQL到ES的數據同步,保持數據一致性。
? 業務場景:商品信息存儲在MySQL,ES提供商品搜索功能,提升用戶體驗;同時,利用ES進行數據分析,支持業務決策。
? 架構優化:考慮數據一致性、實時性、性能等因素,優化數據同步策略,如增量同步、異步同步等,確保系統穩定高效運行。
📍15. 分庫分表策略
? 垂直分庫:按業務模塊劃分數據庫,如訂單庫、用戶庫等,降低單庫壓力,提高業務隔離性。
? 水平分表:按某個字段(如用戶ID、時間)將大表拆分為多個小表,分散數據存儲,提高查詢性能。
? 分片鍵選擇:選擇均勻分布的字段作為分片鍵,避免數據傾斜,如使用哈希函數或范圍分區。
? 中間件支持:使用ShardingSphere、MyCat等分庫分表中間件,簡化分庫分表操作,提供透明化訪問。
📍16. 算法題:二叉樹重建及后序遍歷
type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode
}func buildTree(preorder []int, inorder []int) *TreeNode {if len(preorder) == 0 || len(inorder) == 0 {return nil}root := &TreeNode{Val: preorder[0]}index := findIndex(inorder, preorder[0])root.Left = buildTree(preorder[1:index+1], inorder[:index])root.Right = buildTree(preorder[index+1:], inorder[index+1:])return root
}func findIndex(arr []int, target int) int {for i, v := range arr {if v == target {return i}}return -1
}func postorderTraversal(root *TreeNode) []int {if root == nil {return []int{}}left := postorderTraversal(root.Left)right := postorderTraversal(root.Right)return append(append(left, right...), root.Val)
}
歡迎關注我的小紅書一起來討論。