Redis社区发展历程
一. Redis系统架构
1. Redis特性
1.1 内存NoSQL数据库
支持key-value类型的数据
支持GET/PUT/DELETE形式访问操作
1.2 高性能
百纳秒,微妙级别响应延迟
1.3 丰富的数据类型
Key:String
Value:多种类型(String,List,Hash,Set,Sorted Set)
1.4 可持久化保存数据
支持对数据库做内存快照
支持日志记录写操作
对比memcached
1.5 高可用
支持主从集群
读写分离,故障切换
1.6 高可扩展
支持切片集群,例如Redis Cluster,Codis等
2. Redis系统架构
RDB:Redis database 内存快照(数据保存到磁盘)
AOF:append only flie 日志记录 (操作保存到磁盘)
RDB和AOF的区别详见:https://blog.csdn.net/zhao_crystal/category_10903905.html
二. Redis 主要数据结构
1. 基本数据类型
1.1 Key:Value
1.2 Value多样化
(1) String
a) 二进制安全的字符串,最大512MB。\0并不代表字符串结束,redis会有元数据,来计算字符串的长度大小(length)。为了兼容C语言操作库函数,会主动给二进制安全字符串加上\0。
b) 使用广泛,数值,字符串,图片等
(2)List
a) 双向链表,支持POP和PUSH
b) 应用:排行榜,关注列表
(3)Hash
a) 字典,一个key可对应多个value
b) 结构化数据
(4)Set
a) 无序集合,支持元素去重和集合操作
b) 应用:社交应用中共同关注,共同好友
(5)Sorted Set
a) 有序集合
b)应用:排行榜
(6)Bitmap(可节省内存)
a) 位图,一个bit位表示一个状态
b) 应用:用户签到,状态统计
(7)HyperLogLog(可节省内存)
a) 基数统计,一个集合中不重复的元素个数
b) 应用:用户日活,月活统计
2. 不同Value类型使用不同底层数据结构
(1)兼顾性能和空间开销
(2)有序集合和无序集合的设计选择
(3)hash表的使用注意:rehash影响。
Redis静态hash扩容时,要做rehash的操作,会涉及Key-value的数据搬移。
SDS:Simple dynamic string
三. Redis高性能关键技术
1. 内存访问
Redis属于内存数据库,数据直接在内存上访问。
内存访问延迟:百ns;磁盘访问延迟:ms级
2. 单线程运行模型(redis6.0之前)
主要工作由单线程完成。
请求解析,键值对操作,结果返回,AOF日志
优势:开发简单,避免同步开销。
3. 高效网络通信机制
基于epoll实现IO复用
支持高并发客户端连接
fork 和 pthread_create 可避免单线程的冲突。
4. 影响Redis性能的关键因素
bigKey是指键值对的value特别大。
四. Redis高可用关键技术
1. Redis主从集群
主从复制
全量复制+增量复制
2. 故障切换
哨兵机制负责故障切换
监听主从实例的心跳
根据心跳信息判断主实例是否下线:主观下线(1个哨兵认为主实例没了心跳)+客观下线(指达成共识,所有哨兵都认为主实例没了心跳)
执行主从切换:基于投票机制确定切换的laeder + 选主 + 切换
五. Redis高扩展性关键技术
1. 高可扩展方法
Scale-up:扩展单个实例的容量
Scale-out:增加多个实例,共同分担压力
2. Scale-up的不足
单实例物理容量有限
主从复制压力大
持久化压力大
3. Redis Cluster
去中心化集群技术:没有中心化的转发点,避免单点故障。
客户端需支持Cluster相关命令
数据切片
16483个哈希槽
CRC16(key) % 16384
支持平均分配哈希槽或手动分配
客户端请求转发
基于Gossip的哈希槽分配信息传递
客户端缓存哈希槽信息
MOVED重定向机制
4. Codis
Redis Cluster方案前的业界常用方案(中心化)
Codis proxy(可做成集群,分担压力)
请求转发
支持RESP协议,兼容现有客户端
Codis server
二次开发的实例
支持额外数据结构
支持数据迁移操作
Codis dashboard/fe
集群管理及web界面
增删codis server,进行数据迁移
Zookeeper集群
保存集群元数据信息,例如数据位置。
5. Redis Cluster VS. Codis
成熟度:Codis应用广泛,Redis Cluster也有一定使用
客户端兼容性:Codis proxy直接兼容面向单实例的客户端,Redis Cluster需要二次开发客户端。
数据迁移:Codis支持一步迁移,性能影响较小
新增命令和特性:Codis基于Redis3.2.8开发,并且并不支持所有命令
六. Redis 总结
Redis借助于内存数据库,单线程+异步子进程/线程模型,epoll网络IO复用实现高性能访问。
Redis充分利用不同数据结构性能和空间特点,支持丰富value类型
Redis性能至关重要,抓住Redis关键机制,避免操作阻塞,内存溢出