> # 數據一致性
- 強一致性: 任何時刻,所有節點看到的數據都是相同的,讀操作能立即看到最新寫入的數據
- 有序執行(線性一致性)
- 無序執行 (順序一致性)
- (XA)
- 弱一致性: 讀操作可能看到舊數據,并不能保證所有節點的數據完全同步
- 有序執行 (因果一致性)
- 無序執行(最終一致性)
- Kafka
> # 秒殺系統
- 用Redis 緩存數量, 每次請求讀取商品庫存,
- 庫存>0, 庫存-1, 返回成功, (需要原子性處理)
- 庫存<=0, 返回失敗
> # 多個數據修改的時候怎么確保一致
- 強一致性還是最終一致性?
- 是不是同一個庫, 同一個服務, 同一個事務
- 強一致性: 實時一致,適合對數據準確性要求高的場景,通過數據庫事務、鎖機制實現
- 最終一致性:允許短暫不一致,適合高并發但對實時性要求不高的場景,依賴異步消息或副本同步
- 扣余額 → 減庫存 → 創建訂單(全部在一個事務) 強一致性, 但是鎖的時間比較長
- Saga 是一種分布式事務模式,通過**本地事務 + 補償事務**實現最終一致性
- Seata四種事務模式AT、TCC、SAGA、XA詳解: https://baijiahao.baidu.com/s?id=1777717003459842931&wfr=spider&for=pc
| **模式** | **一致性** | **性能** | **實現復雜度** | **業務侵入性** | **適用場景** |
| --- | --- | --- | --- | --- | --- |
| AT | 最終一致性 | 高 | 低 | 無 | 單數據庫分庫分表 |
| TCC | 強一致性 | 高 | 高 | 高 | 金融交易、高并發場景 |
| SAGA | 最終一致性 | 高 | 中 | 中 | 跨服務復雜業務流程 |
| XA | 強一致性 | 低 | 低 | 無 | 跨數據庫強一致性場景 |
> # Redis 單線程為什么這么快
- 內存操作
- Redis 使用 I/O 多路復用技術(如`select`、`epoll`、`kqueue`),單線程可以同時處理多個連接請求,避免了阻塞等待
- 高效的數據結構: 跳躍鏈表, 壓縮列表, 緊湊列表
> # Redis 哨兵模式和集群模式
- redis 持久化的時候會 會`fork`一個子進程
- Redis 哨兵模式: 從復制(Master-Slave)+ 自動故障轉移
- Redis Redis Cluster(集群模式) : 采用 **分片(Sharding)**,每個節點負責一定范圍的槽位
~~~
root@winnie:/usr/local# /usr/local/redis-5.0.4/src/redis-cli --cluster create 192.168.1.170:8001 192.168.1.171:8003 192.168.1.172:8005 192.168.1.170:8002 192.168.1.172:8006 192.168.1.171:8004 --cluster-replicas 1c
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
~~~
- slot : Redis Cluster 采用 **CRC16(key) % 16384** 計算 key 對應的 slot:
- 使用 **哈希標簽 `{}`**,如 `user:{id}`,所有 `{id}` 相同的 key 都會落在同一個 slot
> # list 怎么確保輸出有序
```
LPush demo1 key1 key2 key3 key4 key5 key6 key7 key8 key9 key10
LRANGE demo1 0 4 // 輸出 key10 key9 key8 key7 key6
LRANGE demo1 5 9 //輸出 key5 key4 key3 key2 key1
LPUSH demo1 key11
LRANGE demo1 5 9 //輸出 key6 key5 key4 key3 key2 (如果有新數據插入和刪除,會導致數據重復或丟失)
```
```
LPush demo1 key1 key2 key3 key4 key5 key6 key7 key8 key9 key10
LRANGE demo1 0 4 // 輸出 key10 key9 key8 key7 key6
LPUSH demo1 key11
LPOS demo1 key6 //獲取最后一個元素的游標
LRANGE demo1 6 10 //下一頁游標加一開始 (兩個命令需要原子性)
```
> # Kafka
- Kafka 怎么確保消息有序
- 同一分區內是有序的, 不同分區間順序無法保證
- **指定 Partition**:直接控制消息進入哪個 Partition
- **使用 Key**:相同 Key 的消息進入同一個 Partition
- 自定義分區邏輯
- **單 Partition 的吞吐量有限**,
- 當 Kafka 消費速度突然變慢,導致消息堆積時,可能的原因有很多。以下是一些常見的原因及其排查方
- 生產消息變多
- 消費者因某些原因執行時間長
- Rebalance 新消費者數據發生變化, 需要重新分配(某些加到因消費時間長被提出)
- 節點負載過高
- 目錄
- 第一例 gRPC使用例子
- 第二例 基于go-micro做服務注冊和服務發現
- 第三例 留言板項目源碼
- 第四例 聊天室
- 第五例 工具庫
- dao
- common
- common.go
- config
- config.go
- gorm
- grom.go
- sqlx
- sqlx.go
- kafka
- kafka.go
- log
- log.go
- log2.go
- redis
- redis.go
- zookeeper
- zookeeper.go
- init
- main.go
- 工具庫
- cache
- cfg.go
- redis
- 示例
- database
- cfg.go
- gorm.go
- sql.go
- 示例
- mq
- cfg.go
- kafka_consumer.go
- kafka_producter.go
- 示例
- time
- time.go
- 第六例 原生sql操作
- 第七例 sqlx操作
- 第八例 Redis數據庫(gomodule/redigo)
- 第九例 Redis消息隊列
- 第十例 Redis集群連接
- 十一例 Zookeeper操作
- 十二例 Kafka操作
- 十三例 NSQ操作
- 十四例 二分查找
- 十五例 交換排序 - 冒泡排序
- 十六例 插入排序 - 直接插入排序
- 十七例 插入排序 - 希爾排序
- 十八例 交換排序 - 快速排序
- 十九例 算法求解應用
- 二十例 pprof性能分析
- 二一例 CPU信息采集
- 二二例 Heap信息采集
- 二三例 Http信息采集
- 二四例 單元測試(功能測試)
- 二五例 基準測試(壓力測試/性能測試)
- 二六例 gdb調試
- 二七例 json序列化和反序列化
- 二八例 protobuf序列化和反序列化
- 二九例 包管理工具 go vendor
- 三十例 包管理工具 go mod
- 三一例 zip壓縮
- 三二例 交叉編譯
- 三三例 線上環境部署
- 三四例 業務:實現固定周期維護
- 三五例 聊天室(精簡版)
- 三六例 并發安全字典
- 三七例 導出Excel表格
- 三八例 導出CSV表格
- 三九例 聊天室(高并發)
- 四十例 JWT (Json Web Token)
- 四一例 雪花算法生成 Id
- 四二例 對稱加密 AES
- 四三例 非對稱加密 RSA
- 四四例 簽名算法 SHA1
- 四五例 數據庫操作 gorm
- gorm V2
- 四六例 數據庫操作 gorm 集合
- 數據庫連接和創建表
- 查詢 - 分頁
- 查詢所有數據
- 查詢單條數據
- 插入一條或多條數據
- 更新一條或多條數據
- 更新一條或多條數據(有零值)
- 四七例 RSA(MD5WithRSA 算法)簽名和驗簽方式
- 四八例 線上部署腳本
- 四九例 Elasticsearch
- 五十例 對象池
- 五一例 中間庫(github.com/wong-winnie/library)
- 五二例 二維碼(生成和解析)
- 五三例 回調用例
- 五四例 文件服務器(MINIO)
- 五五例 chm文檔轉json
- 提取內容頁Json
- 將目錄索引和內容頁混合生成Json
- 目錄層級小案例
- 五六例 部署 gogs 代碼管理工具
- 五七例 通過命令行操作SVN
- 五八例 根據數據庫表生產模型
- 五九例 Trie樹
- 六十例 二進制排序
- 六一例 遞歸+迭代實現無限級分類
- 六二例 Arrow 數據結構
- 簡單介紹
- Go 用Arrow數據格式與其它語言交互
- 六三例 LMDB 內存映射型數據庫
- 獲取指定Key位置
- 六四例 切片數據按字段分類
- 六五例 Xorm 批量插入數據
- 六六例 FlatBuffers 序列化和反序列化
- FlatBuffers 步驟1
- FlatBuffers 步驟2
- 六七例 數據同步
- 增量同步v1
- 全量同步v1
- 定時器
- 六八例 Http請求
- 六九例 Gin + 數據庫操作
- 七十例 ClickHouse 列式數據庫
- 七一例 用圖表展示數據庫數據
- 七二例 go:linkname
- 七三例 四舍五入、保留3小數位
- 七四例 判斷兩個時間戳是否同一天
- 七五例 Gin Http請求
- 七六例 過濾器
- 七七例 Excel 導入導出
- 七八例 小程序向公眾號推消息
- 七九列 解析二進制數據
- 例子一
- 例子二
- 八十例 路由轉發
- 八一例 協程池(安全執行任務,捕獲異常)
- 八二例 切片 slice
- 八三例 集合 map
- 八四例 Redis 六種數據類型
- 八五例 Zstd壓縮
- 八六例 提高接口并發量
- 八七例 協程 goroutine 和 通道 channel
- 八七例 Mysql 事務和索引等
- 編寫中
- 數據交互
- mysql 索引和事務
- 發請求
- defer
- 其它
- linux
- OAuth2.0 和 JWT
- 其它2
- 其他
- Web3.0 智能合約
- 多人貪吃蛇
- V1
- 客戶端
- 服務端
- V2
- 同步方式
- 游戲框架
- deepseek
- k8s
- TRPC
- Kafka
- 加密
- mm
- 技術擴展閱讀