> # 数据一致性
- 强一致性: 任何时刻,所有节点看到的数据都是相同的,读操作能立即看到最新写入的数据
- 有序执行(线性一致性)
- 无序执行 (顺序一致性)
- (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
- 技术扩展阅读