面试:Redis如何保证高可用

Redis如何保证高可用

1. Redis本身决定的

1.1. 基于单线程的IO多路复用~

解释:快的原因主要是IO多路复用

面试:Redis如何保证高可用_第1张图片

什么是IO多路?简单说,redis就是我们的一个"用户线程",在读写操作等待用户输入或输出都是阻塞的,一直等待肯定是不合理的。

我们就在“用户线程”在于操作系统层面请求数据的时候,只需要监听一个Select事件就行。

一定周期,我们就去问一次“select”:“有没有数据来啊?”当用户线程被告知“有”的时候。才回想操作系统内核读取数据。

如此,我们在其他时间里,就可以干自己的事情~不用一直等待数据输入。

1.2. 数据持久化

AOF、RDB

RDB:一定时间,就刷新一次,二进制存一次快照dump.rdb文件。

AOF:文件叫appendonly.aof,类似日志形式追加

比较:RDB 具备更快速的数据重启恢复能力,并且占用更小的磁盘空间,但有数据丢失的风险;而 AOF 文件的可读性更高,但却占用了更大的空间,且重启之后的恢复速度更慢

1.3.架构

主从结构:

面试:Redis如何保证高可用_第2张图片

哨兵模式:

面试:Redis如何保证高可用_第3张图片

集群模式:

面试:Redis如何保证高可用_第4张图片

拓展:Redis有什么缺点?

1、redis是基于内存的单线程,在操作不当的情况(比如删除大key)容易发送阻塞现象

2、单线程,无法充分利用多核服务器的cpu。

3、基于内存,可以存取的空间远没有数据库多


解决方法:

1、删除大key问题,4.0点redis有了unlink命令,就是开一个后台线程慢慢删除,或者list结构可以采用迭代器scan命令。

2、可以在单机上开多个redis 主从、哨兵、集群都可。

3、.过期策略与淘汰策略可以解决一部分,更重要是正确的操作,比如key合理设置时间、 合理搭建redis结构

 

补充说一下redis为什么要设计成单线程吧~

官方给出的说法是:

Redis的瓶颈不是cpu的运行速度,而往往是网络带宽和机器的内存大小。

这也是一方面,因为redis想要更好,重要的不是CPU处理速度问题,而是受到网络、磁盘读取速度等的影响;另外,IO多路模型的存在能解决一部分问题,与此同时,单线程开销小,因此也就顺理成章使用单线程了~

你可能感兴趣的:(redis)