问题:为什么Redis能这么快?
---》
1、完全基于内存,绝大部分请求是纯粹的内存操作,执行效率高
2、数据结构简单,对数据操作也简单
3、采用单线程,单线程也能处理高并发请求,想多核也可启动多实例
(为什么redis要采用单线程这个设计呢?)
---》准确来说,redis的单线程结构是指主线程是单线程的,主线的处理包括IO事件处理,IO对应业务请求的处理,除外还负责过期键的处理,父子协调,集群协调等。这些任务都会被封装成周期性任务,由主线程周期性地处理。正因为采用了单线程的设计,对于客户端的所有请求,都由一个主线程串行地执行,因此多个客户端对同一个键进行些操作的时候呢,就不会有并发的问题,避免了频繁的上下文的切换,和锁竞争。所有redis的执行效率高。
4、使用多路I/O复用模型,非阻塞IO
问题:单线程的可以处理高并发的请求吗?
-----》
CPU并不是制约redis的性能瓶颈,而是网络传输会影响redis的性能
可以在多核的机器上启动多个redis实例,充分利用多核特性
如何配置redis主从,如何配置redis哨兵。如何配置redis集群。
问题:redis的主从同步机制?
----》
为了实现弱一致性,就是说保证最终一致性(过一段时间,所有的节点数据都是一致的),也就是说不需要保证master和slave是事时同步的。
(简洁版)redis可以使用主从同步,也可以使用从从同步,第一次同步时,master会做一次bg save,并将后续的操作记录到后续的buffer中,完成之后,将master的rdb文件发送到从节点上,从节点接受完成后呢,就将rdb的镜像加载到内存中,加载完成后,再通知master将期间的操作(则增量数据)同步到slave中。这样就完成整个主从同步的过程!!!
(简单来说,master 先把自己的所有数据拷贝一次,发给slave节点,slave加载完这部分之后,叫master把增量数据也发过来,这样把增量数据补上了)
(详细版)有全同步过程
1、Slave发送sync命令到Master
2、Master会启动一个后台进程,将Redis中的数据快照保存到文件中(bg save)
3、master 将保存数据快照期间接受到的写命令缓存起来
4、master完成写文件操作后,将该文件发送给slave
5、使用新的RDB文件替换掉旧的RDB文件
6、master将这期间收集的增量写命令发送给slave端
增量同步过程
1、master接收到用户的操作指令,判断是否需要传播到slave
2、将操作纪律追加到AOF文件
3、将操作传播到其他slave:1、对齐主从库;2、往响应缓存写入指令
4、将缓存中的数据发送给slave
主从模式的弊端是什么呢?
---》这个架构不是高可用性,当master挂了之后,就不能对外服务。
所以有了redis sentinel 哨兵机制
问题:解决主从同步master宕机后额主从切换问题:
redis sentinel 有以下几点功能:
1、监控:检查主从服务器是否运行正常
2、提醒:通过API向管理员或者其他应用程序发送故障通知
3、自动故障迁移:主从切换
哨兵机制是怎样做到的呢?
---》是一个分布式系统,可以在一个架构中运行多个sentinel,这些进程是使用流言协议,来接受master是否下线的信息 ,并使用投票协议来决定是否执行自动故障迁移,以及确定用哪个从服务器作为主服务器,这个类似zookeeper
流言协议 Gossip
在杂乱无章中寻求一致
1、每个节点都随机地与对方通信,最终所有节点的状态达成一致
2、种子节点定期随机向其他节点发送节点列表以及需要传播的消息
3、不保证信息一定会传递给所有节点,但是最终会趋于一致