一 目前主流应用的架构实现草图
该应用架构是最常见的应用架构,一般为了提升性能,都会在中间添加一个缓存层,当客户端查询数据的时候都会先去缓存中去查,如果有直接返回,没有则进行穿透查询;
二 主流缓存中间件的对比
MemCache
优点 : 简单易用与Hash非常类似;
缺点 : 不支持数据持久化存储;
不支持主从模式也不支持分片操作;
Redis
优点 : 数据类型丰富;
支持持久化;
支持主从以及分片操作;
三 Redis为什么这么快?
指标 : 100000 + QPS;
- 完全基于内存的,绝大部分的请求是纯粹的内存操作,执行效率高;
- 数据结构简单,对数据操作也简单;
- 采用单线程,单线程也能处理高并发请求,想要多核也可启动多实例;
- 使用多路I/O复用模型,非阻塞IO;
问题1 : Redis为什么是单线程的?
单线程的意思是指主线程是单线程的(主线程包括IO请求的处理,过期键的处理,集群协调等,这些操作会周期性的执行),正式因为是单线程的所以在并发环境下避免了多线程的上下文切换以及锁竞争;
问题2 : 单线程可以处理高并发的请求吗?
当然是可以的,首先并发并不是并行;
并发是一个服务器可以同时执行几个事情;
并行是一个服务器可以同时处理来自多个客户端的流请求;
问题3 : 多路I/O复用模型.
FD(文件描述符) : 在操作系统中一个打开的文件通过唯一的描述符进行引用,该描述符是打开文件的元数据到文件本身的映射;传统IO阻塞模型
当使用Read/write对一个文件描述符进行操作,如果当前FD不可读/不可写,整个Redis服务就不会对其他的操作做出响应从而导致整个服务都不可用;IO多路复用模型
在IO多路复用模型中最核心的调用是Select系统调用,这个操作可以监控系统中的文件描述符的情况,当其中的文件描述符可操作时,这个方法就会返回可操作的文件描述符个数;也就是说Select的主要工作是监听;当把监听的工作移交至Select以后线程就可以做别的事情了;同时还有其他的操作函数: epoll/kqueue/evport/select;Redis会根据不同的操作系统采用不同的函数,兜底是select;
四 Redis数据类型
- String : 最基本的数据类型,二进制安全;
- Hash : String元素组成的字典,适合用于存储对象;
- List : 列表,按照String元素插入顺序排序;
- Set : String元素组成的无序集合,通过哈希表实现,不允许重复;
- Sorted Set : 通过分数来为集合中的成员进行从小到大的排序;
五 从海量数据中查询某一固定前缀的key
要点 : 根据数据规模来采用合适的方式;
keys : 如果数据量过大会使服务卡顿;
scan : 无阻塞返回key列表,每次返回少量的数据不会阻塞;
六 实现分布式锁
1. 分布式锁需要解决的问题
互斥性, 安全性, 死锁, 容错;
2. 分布式锁
这个破坏原子性的实现方式
SETNX : 这个指令会长期有效,这个问题需要解决;
EXPIRE : 设置过期时间;
更好的实现方式
SET : 原子操作;
七 大量的key同时过期
在key上加上随机值;
八 使用Redis做异步队列
使用List作为队列,RPUSH生产消息,LPOP消费消息;
缺点 : 没有等待队列里有值就直接消费;
方法 : 采用sleep或者使用BLPOP;
pub/sub : 主题订阅者模式;
缺点 : 不保证消息可达;
九 持久化
1 RDB : 保存全量数据快照;
save : 会阻塞
bgsave : 会创建子线程进行Fork;2 自动化触发RDB的场景;
- 根据配置触发;
- 主从复制时,主节点触发;
- 执行debug reload触发;
- 执行Shutdown且没有开启AOF时触发;
3 BGSAVE原理
1.先判断是否有正在执行的BGSAVE,如果有直接返回错误;为了防止子进程的竞争;
2.如果没有则调用redis源码中的rdbSaveBackground执行操作;
3.调用系统的fork操作,linux中fork操作实现了Copy-on-write;4. RDB的缺点 :
- 数据量大会影响性能;
- 可能会因为Redis挂掉而丢失一部分数据;
十 AOF持久化
AOF : 保存写状态,备份除了查询以外的所有写操作指令;以append的方式进行追加;默认是关闭的需要在配置文件中开启;
1. 解决AOF文件不断增加的问题
1 调用fork(),创建子进程;
2 子进程把新的AOF写到一个临时文件里,不依赖原来的AOF文件;
3 主进程持续将新的变动同时写到内存和原来的AOF中;
4 主进程获取子进程重写AOF的完成信号,往新AOF同步增量变动;
5 使用新的AOF文件替换掉旧的AOF文件;2. 两种模式共存的数据恢复流程
redis在恢复的时候会先检查是否有AOF文件,如果有直接加载,如果没有则加载RDB;
3. RDB与AOF的优缺点
RDB优点 : 全量数据快照,文件小,恢复快;
RDB缺点 : 无法保存最近一次快照之后的数据;
AOF优点 : 可读性高,适合保存增量数据,数据不易丢失;
AOF缺点 : 文件体积大,恢复时间长;4. 混合模式保证持久化
十一 Pipeline及主从同步
1 使用Pipeline的好处
- Pipeline和linux管道符相似;
- Redis基于请求/响应模型,单个请求处理需要一一应答;
- Pipeline批量执行指令,节省多次IO往返的时间;
- 有顺序依赖的指令建议分批发送;
十二 Redis的同步机制
1. 原理
2. 全同步过程
- Salve发送sync命令道Master;
- Master启动一个后台进程,将Redis中的数据快照保存到文件中;
- Master将保存数据快照期间接收到的写命令缓存起来;
- Master完成写文件操作后,将该文件发送给Salve;
- 使用新的AOF文件替换掉旧的AOF文件;
- Master将这期间收集的增量写命令发送给Salve端;
3. 增量同步过程
- Master接收到用户的操作指令,判断是否需要传播到Slave;
- 将操作记录追加到AOF文件中;
- 将操作传播到其他Slave;
- 将缓存中的数据发送给Slave;
十三 哨兵模式
解决主从同步Master宕机后的主从切换问题;
主要有监控集群状态,提醒故障信息,自动投票迁移故障;
十四 集群原理
1. 如何从海量数据中快速找到数据?
分片 : 对服务器的数量进行取模计算;
2. 一致性Hash算法
- 对2^32进行取模,将哈希值空间组成虚拟的圆环;
- 将数据的key使用相同的函数进行Hash,然后计算出哈希值;
3. Hash环的数据倾斜问题
通过虚拟节点来解决倾斜问题;