1。如何保证Redis的高可用和高并发?Redis主从架构,一主多从,可以满足高可用和高并发。实例宕机时,自动进行主备倒换,并配置读写分离,缓解Master的读写压力。2、如何实现Redis高可用方案?可以使用官方推荐的sentinel机制来实现。当主节点出现故障时,Sentinel会自动完成故障发现和转移,并通知应用端实现高可用。它主要有四个功能:集群监控,负责监控redis主从进程是否正常工作。消息通知,如果某个redis实例出现故障,sentinel负责发送消息作为告警通知给管理员。Failover,如果master节点挂了,会自动转移到slave节点。配置中心,如果发生故障转移,通知客户端新的主地址。3、能不能讲讲Redis哨兵机制的原理?Redis以sentinel模式启动后,会自动监控master/slave的运行状态。基本原理是:心跳机制+投票裁决。每个哨兵都会定时给其他哨兵、主从发送消息,确认对方是否还活着。如果发现对方在规定时间内没有回应,则暂时认为对方宕机。如果哨兵组中大部分哨兵报告某个master没有响应,则系统认为master真正宕机了。通过Raft投票算法,选择剩下的一个slave节点提升为master,然后自动修改相关配置。4、部署RedisSentry需要注意哪些问题?Sentry至少需要3个实例来保证其健壮性。关于Sentinel以及如何与SpringBoot集成的详细教程请关注公众号Java技术栈。5、Redis主从架构数据会不会丢失?为什么?数据丢失有两种情况:1)异步复制导致的数据丢失:因为master->slave的复制是异步的,可能有一些数据没有复制到slave,master宕机了。这时候,刚刚丢失了一些数据。2)脑裂导致的数据丢失:master所在的一台机器突然与正常网络断开连接,无法连接到其他slave机器,但实际上master还在运行。这个时候sentinel可能会认为master挂了,然后开始Election,把其他的slave切换成master。这时集群中会出现两个master,也就是所谓的脑裂。这时候虽然有一个slave切换成了master,但是client可能来不及切换到新的master,继续往旧master写入的数据也可能会丢失。因此,当旧的master再次恢复时,它会作为slave附着在新的master上,自己的数据会被清空,重新从新的master上复制数据。6、Redis主从复制是如何工作的?1)一个Slave实例,不管是第一次连接还是重连Master,都会发出SYNC命令;2)Master收到SYNC命令后,会做两件事:(a)Master执行BGSAVE,即在后台将数据保存到磁盘(rdb快照文件);(b)Master还将新接收到的写入和修改数据集的命令存储到缓冲区中(非查询);3)当Master在后台将数据保存到snapshot文件完成后,Master会将snapshot文件传给Slave,Slave清空内存后将文件加载到内存中;4)并且Master也会将之前收集到的命令通过Reids命令协议形式转发给Slave传递到buffer中,Slave执行这些命令实现与Master的同步;5)Master/Slave会不断异步同步命令,实现数据的最终同步;7、由于主从延迟,读到过期数据如何处理?1)使用scan命令扫描库:当扫描到Redis中的key时,相当于访问了key,同时也会进行过期检测,充分发挥Redis的懒删除策略。这种方式可以大大降低脏数据读取的概率,但其缺点也很明显。会对数据库造成一定的压力,否则会影响线上业务的效率。2)Redis新增了解决主从不一致导致读取过时数据问题的特性,增加了key是否过期和判断主从库。如果key已经过期,当前访问的master会返回null;当前访问的是从库,执行只读命令也返回null。8、RedisKey的过期策略是什么?1)惰性删除:当读写过期键时,会触发惰性删除策略,直接删除过期键。显然,这是被动的。2)周期性删除:由于惰性删除策略不能保证及时删除冷数据,Redis会定期主动剔除一批过期键。3)主动删除:当当前使用的内存超过maxMemory限制时,触发主动清理策略。active设置的前提是设置maxMemory的值。
