这个题,一般是在你介绍完你的项目或者方案之后,因为你用到了 Redis,面试官就会问你,Redis挂了怎么办?
他不是想问你如何去恢复 Redis,这是运维干的事儿。那作为开发,如果 Redis 挂了,我们能怎么办呢?
首先,我们就是可以想办法减少 Redis 挂了的概率,以及降低挂了可能带来的影响,这主要就是哨兵模式、集群模式的一些东西了,这不展开了。
如果就是真的挂了,怎么办?
首先我们需要有机制可以发现 Redis 挂了,最常见的就是加监控了,一般对于 Redis 自己可以做监控,我们在业务中也可以基于 Redis 调用的成功率做一些监控,当发现长时间不可用,或者超时之后,就可以认为是 Redis 挂了,就需要考虑应急机制了。
当Redis 挂了,并且我们已经发现了,之后就需要考虑这个使用 Redis场景的降级问题了,就是说 Redis 不能用了,我需要切换到其他的方案上了,比如说订单的秒杀库存扣减场景,一般是先在 Redis 中做预扣减。如果Redis 挂了,那我们就得把 Redis 给他降级掉,那就是不要再调 Redis 了,而是直接去调数据库。
但是你加 Redis 的原因是因为数据库扛不住那么高并发, 咋办呢、
这时候就需要限流了,通过限流的手段,让请求不要这么多的都打到数据库中,在前面给他拦住一些流量,虽然对用户来说体验不一定好,但是至少我的数据库没有被打垮,至少我还能对一部分用户提供服务的。
但是这些都是需要你提前就做好设计的,你要是一点设计都没做,等 Redis 挂了之后在做这些,那肯定来不及了。
所以,如果你的场景严重依赖 Redis,那你就需要提前做好这个降级方案,甚至需要配置一个开关,在 Redis 挂了之后,一键切换成不调Redis,并且开启限流。。。这个玩意在大厂中叫做预案。
一般来说预案和故障是关联的,当线上出现了某个故障,可以直接触发预案执行。
Redis挂了,如果有一个备用的能顶上,那也是可以的。所以,很多 Redis 的部署都是主备形式的,备份实例平时不对外提供服务,只和朱主实例做数据同步,保证数据的准确性。
然后在主实例挂了之后,我们就可以快速的切换到备份实例上面来。这就是因为提前做好了热备的方案,就可以在出现故障的时候做故障转移。
其实这背后就是一种冗余的思想,在很多大厂中,冗余非常常见,就是为了应对这种突发状况的。
甚至有的备份是不同的架构的备份,比如备份到 Mangodb中。。。
Redis 主要是用来做做缓存的, 提升性能的,如果 Redis 挂了,说明缓存就没了,那么还可以考虑降级到使用本地缓存来抗并发。
当然,本地缓存存在不一致的问题,这时候就根据你的业务来看了,能不能接受不一致,或者说是不是宁可系统挂了,也不能接受不一致。。。