七天玩转Redis实战营
第一天 走进Redis
01. Redis系统架构
1. Redis特性
内存NoSQL数据库
- 支持key-value类型的数据
- 支持GET/PUT/DELETE形式访问操作
高性能
- 百纳秒、微秒级别响应延迟
丰富的数据类型
- Key: String
- Value: String、List、Set、Hash、Sorted Set
可持久化保存数据
- 支持对数据库做内存快照
- 支持日志记录写操作
- 对比memcached
高可用
- 支持主从集群
- 读写分离、故障切换
高扩展
- 支持切片集群,例如Redis Cluster,Codis等
2. Redis系统架构
客户端 ---- 网络通信 ---- Redis实例(数据结构、内存管理、RDB、AOF 内部管理)---- 主从复制/哨兵机制 ---- 从实例/切片实例
02. Redis主要数据结构
基本数据类型
- key: Value 键值对形式
- Value多样性
1. 常见Value类型 - String
- 二进制安全的字符串、最大512 MB
- 使用广泛,数值、字符串、图片等
2. 常见Value类型 - List
- 双向链表,支持POP和PUSH
- 排行榜、关注列表
3. 常见Value类型 - Hash
- 字典,一个key对应多个value
- 结构化数据
4. 常见Value类型 - Set
- 无序集合、支持元素去重和集合操作
- 社交应用中共同关注、共同好友
5. 常见Value类型 - Sorted Set
- 有序集合
- 排行榜
6. 常见Value类型 - BitMap
- 位图,一个bit位表示一个状态
- 用户签到,状态统计
7. 常见Value类型 - HyperLogLog
- 基础统计,一个集合中不重复的元素个数
- 用户日活、月活统计
不同的Value类型使用不同底层数据结构
- 兼顾性能和空间开销
- 有序集合和无序集合的设计选择
- 哈希表的使用注意:rehash影响
03. Redis高性能关键技术
内存访问
- 数据直接存放在内存,从内存访问
- 内存访问延迟:百ns; 磁盘访问:ms级
单线程运行模型
- 主要工作由单线程完成
- 请求解析、键值对操作、结果返回、AOF日志
- 优势:开发简单,避免同步开销
高效通信机制
- 基于epoll实现IO复用
- 支持高并发客户端连接
影响性能的关键因素
典型操作 | 潜在风险 |
---|---|
键值对操作 | O(N)操作 集合操作 bigkey |
持久化操作 | AOF日志同步写 RDB fork |
网络IO | bigkey |
主从复制 | 过大的RDB文件 过高的并发新写入量 |
应用混布 | 性能干扰 |
04. Redis高可用关键技术
高可用扩展方法
- Scale-up: 扩展单个实例的容量
- Scale-out: 增加多个实例,共同分担压力
Scale-up的不足
- 单实例物理容量有限
- 主从复制压力大
- 持久化压力大
Redis主从集群
- 主从复制
- 全量复制 + 增量复制
故障切换
- 哨兵机制负责故障切换
- 监听主从实例的心跳
- 依据心跳信息判断主实例是否下线:主观下线 + 客观下线
- 执行主从切换:基于投票机制确定切换的leader + 选主 + 切换
05. Redis高扩展性关键技术
Redis Cluster
- 去中心化集群技术:没有中心化转发点,避免单点故障
- 客户端需要支持Cluster相关命令
数据切片
- 16384个哈希槽
- CRC16(key)%16384
- 支持平均分配哈希槽或手动分配
客户端请求转发
- 基于Gossip的哈希槽分配信息传递
- 客户端缓存哈希槽信息
- MOVED重定向机制
Codis
- Redis Cluster方案前的业界常用方案
Codis proxy
- 请求转发
- 支持RESP协议,兼容现有客户端
Codis server
- 二次开发实例
- 支持额外数据结构
- 支持数据迁移操作
Codis dashborad/fe
- 集群管理及Web界面
- 增删codis server、进行数据迁移
Zookeeper集群
- 保存集群云数据信息,例如数据位置
Redis Cluster 和 Codis的区别
- 成熟度:Codis应用广泛,Redis Cluster也有一定使用
- 客户端兼容性:Codis proxy 直接兼容面向单实例的客户端,Redis Cluster需要二次开发客户端
- 数据迁移:Codis支持异步迁移,性能影响小
- 新增命令和特性:Codis基于Redis3.2.8开发,并不支持所有命令
06. 总结
- Redis借助于内存数据库、单线程+异步子线程/线程模型、epoll网络IO复用实现高性能访问
- Redis充分利用不同的数据结构和空间特点,支持丰富的Value类型
- Redis性能至关重要,抓住Redis关键机制,避免操作阻塞,内存溢出
07. 答疑
1. Redis如何做到单线程支持高并发的?
并发 并行的概念
并发 同一时间接受很多请求 epoll I/O多路复用
并行 同一时间执行多个请求