面试官:既然聊了这么多Redis,还没有说到Redis线程模型:
派大星:因为Redis基于reactor模式开发了网络事件处理器,这个事件处理器叫做:文件事件处理器(File Event Handler
),这个文件事件处理器是单线程的,从而Redis才叫做单线程的模型。采用IO多路复用机制同时监听多个socket,根据socket上的事件来选择对应的事件处理器来处理这个事件。
面试官:不错,那如何保证 Redis 高并发、高可用?Redis 的主从复制原理能介绍一下么?Redis 的哨兵原理能介绍一下么?
面试官心里剖析:其实问这个问题,主要是考考你,redis 单机能承载多高并发?如果单机扛不住如何扩容扛更多的并发?redis 会不会挂?既然 redis 会挂那怎么保证 redis 是高可用的?
派大星:如果你用 Redis 缓存技术的话,肯定要考虑如何用 Redis 来加多台机器,保证 redis 是高并发的,还有就是如何让 Redis 保证自己不是挂掉以后就直接死掉了,即 Redis 高可用。
派大星:这部分可以主要从两方面:
Redis主从架构,
Redis实现高并发主要依靠主从架构,一主多从,一般来说,很多项目其实已经足够了,,单住用来写入数据,单机几万QPS,多从用来查询数据,,多个实例可以提供每秒近上万(10w)的QPS。
当然如果想要在实现高并发的同时,容纳大量的数据,那么就需要Redis集群,使用Redis集群之后,可以提供每秒近几十万的读写并发也是可以的。
Redis基于哨兵实现高可用。
Redis高可用,如果是做主从架构部署,那么加上哨兵即可,就i可以实现,任何一个实例宕机,可以进行主备切换。或者还有Redis官方的Cluster 集群模式,Redis Cluster是一种服务器 Sharding 技术,3.0版本开始正式提供
面试官:什么是Redis主从架构
主要从核心机制和工作流程两个方面来回答
派大星:Redis replication的核心机制:
Redis采用异步方式复制数据到slave node上,不过从Redis2.8开始,slave node会周期性的确认自己每次复制的数据量;
一个master node是可以配置多个slave node的。
slave node也可以连接其它的slave node。
slave node做复制的时候,不会block master node的正常工作。
slave node做复制的时候,也不会block自己的查询操作,它会用旧数据来提供服务,但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了。
slave node主要用来进行横向扩容,做读写分离,扩容的slave node也可以提高读的吞吐量。
派大星:Redis 主从复制的核心原理(面试问题最多的问题,也可理解为工作流程):
当启动一个slave node的时候,它会发送一个PSYNC
命令个master node,如果这是slave node初次连接到master node,那么会触发一次full resynchronization
全量复制。此时master会启动一个后台线程,开始生成一份RDB
快照文件,同时还会将从客户端新收到的所有写命令缓存在内存中。RDB
文件生成完毕后,,master会将这个RDB
发送给slave,,slave会先写入磁盘,然后再从本地磁盘加载到内存中,接着master会将内存中缓存的写命令发送到slave,slave也会同步这些数据。slave node如果跟master node有网络故障,断开了连接,会自动重连,连接之后master node仅会复制给slave部分缺少的数据。从Redis2.8开始,支持了主从复制的断点续传,

同时我们如果像开启无磁盘化复制:也就是master在内存中直接创建RDB,然后发送给slave,不会落盘,只需要在配置文件中repl-diskless-sync yes
即可。
repl-diskless-sync yes
# 等待 5s 后再开始复制,因为要等更多 slave 重新连接过来
repl-diskless-sync-delay 5面试官:那主从复制的时候如何处理的过期key的呢?
派大星:slave不会过期key,只会等待master过期key,如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一个del命令发送给slave node
面试官:刚刚有提到断点续传,可以聊一聊主从复制断点续传的原理:
派大星:好的,首先master node会在内存中维护一个back log,master 和 slave都会保存一个replica offset还有一个master run id,offset就是保存在backlog中的。如果master 和slave网络连接断掉了,slave会让master从上次replica offset开始继续复制,如果没有找到对应的offset,会执行一次resynchronization
面试官:不错,那我们继续聊一了Redis 高可用这个问题吧。
派大星:下次吧,这次有点累啦,嘿嘿。





