exam markdown 06-缓存与分布式系统
MD 更新:未知
分布式系统中的权衡问题(CAP)
概念
- C(Consistency):所有节点看到的数据一致性
- A(Availability):每次请求都能及时得到回应
- P(Partiton Tolerance):网络可能断联、分区,但系统不能崩溃
缓存与数据库协作
flowchart TD
A[应用服务器] --写--> B[Redis]
B --写-->A
C[数据库] --读--> A
数据读取
根据 Key 从缓存中读取;如果缓存中没有,则根据 Key 在数据库中查找;读取到 value 后,更新缓存
数据写入
根据 Key 值写数据库;根据 Key 更新缓存
Redis集群切片方式
| 切片方式 | 特点 |
|---|
| 客户端切片 | 在客户端通过 key 的 hash 值对应到不同的服务器 |
| 中间件切片 | 在应用软件和 Redis 中间,如Codis 等,有中间件实现路由分配 |
| 客户端服务端协作分片 | Redis Cluster 模式,客户端可采用一致性哈希,服务端提供节点的重定向到 slot 上,不同的 slot 对应不同的服务器 |
Redis 分布存储方案
| 存储方案 | 特点 |
|---|
| 主从模式 | 一主多从,故障时手动切换 |
| 哨兵模式 | 有哨兵的主从模式,自动切换 |
| 集群模式 | 分节点对等集群,分 slots |
Redis分片方案
| 分片方案 | 分片方式 | 说明 |
|---|
| 范围分片 | 按数据范围来做分片 | 例:按用户编号分片 |
| 哈希分片 | 通过对 key 进行 hash 运算分片 | 可以把数据分配到不同实例,类似于取余操作,余数相同一个实例 |
| 一致性哈希分片 | 哈希分片的改进 | 可以有效解决重新分配节点带来的无法命中问题 |
Redis 数据类型
| 类型 | 特点 | 示例 |
|---|
| String | 二进制,最大 512MB | 缓存,计数,共享 Session |
| Hash | 无序字典,数组+链表,key 对应一个 HashMap | 存储、读取、修改用户属性 |
| List | Linked List,Array List | 消息队列,文章列表 |
| Set | 键值对无序,唯一 | 独立 IP,共同爱好,标签 |
| Sorted Set | 有序键值对,唯一 | 排行榜 |
Redis持久化
RDB
传统数据库中快照是思想。指定时间间隔将数据进行快照存储
AOF
传统数据库中日志的思想,把每条改变数据的命令追加到 AOF 文件末尾。
| 对比 | RDB | AOF |
|---|
| 备份量 | 全量备份,整个数据库 | 增量备份,只保存修改命令 |
| 保存间隔时间 | 长 | 短,默认 1 秒 |
| 还原速度 | 快 | 慢 |
| 堵塞情况 | save 会堵塞,bgsave 不会 | 不会 |
| 体积 | 小 | 大 |
| 安全性 | 低,容易丢数据 | 高 |
淘汰机制
| 淘汰范围 | 机制名 | 策略 |
|---|
| 不淘汰 | noeviction | 禁止驱逐数据,内存不足时写入报错。系统默认 |
| 过时淘汰的键空间 | volatile-random | 随机移除某个 key |
| volatile-lru | 优先移除 近期未使用的key【局部性原理】 |
| volatile-ttl | ttl 值小的key 优先淘汰 |
| 全键空间 | allkeys-random | 随机移除某个 key |
| allkeys-lru | 优先移除近期未使用的 key |