一、数据结构
常用的若干种
- string 最基础的类型,二进制字符串,可存放任何对象
- list 链表 博文评论区
- set 集合 用户IP地址
- zset 有序集合,score排序,复杂度logn 粉丝量排行榜
- hashset 哈希表,存放键值对
- hyperloglog 基数统计,返回近似结果 论坛访问ip
二、持久化
2.1 RDB
某个时间点数据集的快照
2.2 AOF
保存 写命令
- 命令追加 写入aof_buf
- 文件写入 写入内存aof文件
- 文件同步 写入磁盘aof文件
- 设置appendsync字段
- always 立即同步磁盘
- no 由操作系统决定同步时机
- everysecond 子线程每秒刷磁盘
- 设置appendsync字段
重写 aof文件过大
- 开子进程,去掉冗余命令,写入新的aof文件
- 期间新的写操作 存入 重写缓冲区,上一步完成后,缓冲区命令添加至aof文件尾部,原子性操作替换原aof文件
三、高可用
3.1 主从复制
master可读可写,slave只可读
同步基本流程
- 复制初始化 建立连接、身份验证
- 文件同步
- 全量复制
- 主 生成rdb文件,发送给 从
- 期间 新写入命令,传输 给 从
- 增量复制
- 通信 offset,判断 主 缓存 中 是否 有命令,有则增量,无则全量
- 基于 offset 开始发送命令
- 全量复制
- 命令传播
- 主从 通信 复制偏移量 offset
- 主 基于 offset 发送 命令,从 执行
3.2 集群
key进行分片,片内主从复制
共16384个slot,key会映射到不同slot,不同的节点覆盖不同slot,需确保集群能覆盖到所有slot
数据丢失原因
- 异步复制
- 原master 写命令 未 传播至 slave,网络延迟导致选择 新的master,写操作丢失
- 脑裂
四、清内存
4.1 淘汰
内存不够,需淘汰key
- 不删除
- lru 分过期、不分过期
- 随机 分过期、不分过期
- ttl 过期中最短
4.2 过期
4.2.1 基本策略
惰性 + 定时
- 惰性 当key被访问且过期,删除
- 定时 定期清理过期key
4.2.2 特殊处理
- aof
- 写入aof文件 key被删除则追加del命令
- aof重写,检查过期
- rdb
- 生成rbd文件,检查
- 载入rdb
- 主 检查
- 从 不检查
- 主从复制
- 主 发生 过期删除,发送del命令到从
- 从 收到 访问 过期key的命令,不执行删除