redis 开发与运维
🚕 redis 介绍
1. 特性
速度快
- 单线程
- 内存执行
kv 形式
功能丰富
- 事物
- 支持 Lua 脚本
- 发布订阅模式
- 流水线
- 过期策略
客户端语言多
持久化
- RDB
- AOF
主从复制
高可用和分布式
- sentinel
- cluster
2. 使用场景
- 缓存
- 排行榜
- 计数器
- 社交网络
- 消息队列
- 地理位置
- 点击签到
3. 用好建议
- 阅读源码
- 多使用且规模大的redis
4. 安装 redis
- wget http://download.redis.io/releases/redis-x.tar.gz (注:x 为版本号)
- tar xzf redis-x.tar.gz
- ln -s redis-x redis
- cd redis
- make
- make install
🐰 API 的理解和使用
1. string
内部编码
- int
- embstr
- raw
使用场景
- 缓存
- 计数
- 共享session
- 限速
2. hash
内部编码
- ziplist
- hashtable
使用场景
- 一对多
3. list
内部编码
- ziplist
- linkedlist
使用场景
- 文章列表
- 消息队列
4. set
内部编码
- intset
- hashtable
使用场景
- 社交
- 推荐
5. zset
内部编码
- ziplist
- skiplist
使用场景
- 排行榜
🗽 小功能
1. 慢查询
2. redis shell
3. pipline
4. 事务
5. 发布订阅
6. 高级数据结构
- bitmaps
- HyperLogLog
- GEO
🍄 客户端连接
1. Jedis
2. redis-py
3. 客户端案例分析
- redis 内存陡增
- 周期性连接超时
🐡 持久化
1. RDB
- 二进制文件保存在硬盘
优缺点
优点
- 用于灾难恢复
- 恢复速度比 AOF 快
缺点
- 持久化需要 fork 子线程、频繁执行成本高
- 多 redis 版本中,格式没有统一,导致不能兼容其他版本redis的恢复
2. AOF
- 文本格式的独立日志记录命令
优缺点
优点
- 可以实时更新至最新
- 具有可读性
- 同个格式只会追加,避免二次开销
缺点
- 占空间大
- 追加命令记录是阻塞的
3. 问题定位与优化
子线程的监控
- CPU 监控
- 内存监控
硬盘监控
🐯 复制
1. 拓扑
- 一主一从
- 一主多从
- 树状主从
2. 复制原理
- 保存主节点 master
- 定时任务维护复制相关逻辑
- 发送 ping 命令,确认可用
- 如果设置了主节点的密码权限校验,则会进行这一步
同步数据集
- 加载 RDB 文件
3. 数据同步
全量复制
- sync
部分复制
- psync
4. 可能出现的问题
- 数据延迟
- 读到过期键
- 从节点故障
- 主从配置不一致
- 全量复制
复制风暴
- 单节点复制风暴
- 单机器复制风暴
🐹 阻塞问题
1. API 或数据结构使用不恰当
- 使用 keys
- 大对象放到一个数据结构里
2. CPU 饱和
- 使用了高时间复杂度的命令
- 内存过度优化
3. 持久化阻塞
- fork 阻塞
- AOF 刷盘阻塞
4. CPU 竞争
- 多个密集型 CPU 应用部署到一台上面
5. 内存交换
- 内存数据被系统移到硬盘读写
6. 网络问题
- 连接拒绝
- 网络闪断
- 网络延迟
- 连接溢出
🗻 内存管理
1. 内存消耗地方
- 对象内存消耗
- 缓冲内存消耗
- 子进程内存小孩
- 内存碎片
2. 内存管理
设置内存上限
- 超过内存上限则触发 LRU 删除策略释放内存
动态调整内存
设置回收策略
- TTL
3. 内存优化
- 理解 redisObject 对象
- 缩减 key 长度
- 二禁止放入 value
- 共享内存池
- 编码优化
- 控制键的数量
🍮 哨兵模式
1. 过程
- sentinel 监控节点
- 循环定时任务发送 ping 确认是否故障
节点下线
- 主观下线
客观下线
- 所有 sentinel 同意下线
sentinel 选举 leader
- sentinel leader 负责故障转移
sentinel leader 重新选择 master
- 选择复制偏移量最大的
- 选择优先级别最大的
🎉 集群模式
1. 分区
- 取模 16383 成为分区
2. 节点通信
- 每个节点会向特定的节点发送ping
- 接受到 ping 则返回 pong