1、为什么redis这么快
1.redis位于内存之中;与硬盘与时钟周期相差几千或者是几万倍的速度相比,内存的速度更快。
2.redis使用了单线程的操作;次性只执行一个命令,避免了线程切换和锁竞争带来的消耗。
3.redis采用多路复用的方式;使用了linux中的select和epoll的概念 ,同意内核中有多个监听套接字和已连接套接字,内核会一直监听这些套接字上的连接请求和消息请求,一旦有请求达到,就会交给redis执行,一个线程处理多个io读写操作。
3.高效的数据结构;redis提高了很多数据结构,他们都有被自定义,得到了优化
2、说一下IO复用
使用了linux中的select和epoll的概念 ,同意内核中有多个监听套接字和已连接套接字,内核会一直监听这些套接字上的连接请求和消息请求,一旦有请求达到,就会交给redis执行,一个线程处理多个io读写操作。
在整个操作中只有select、poll、epoll调用的时候会进行阻塞,收发客户端的消息则不会。
3、redis为什么早期选择单线程
因为redis位于内存中,其cpu不太可能会成为redis的瓶颈,redis很受限于内存的大小和网络的速度。
4.Redis6使用了多线程是怎么回事
他的多线程主要用于读写数据和解析协议,在执行命令上还是单线程。
原因是因为,redis的瓶颈主要是网络速度上,我多线程解析协议,加快速度。
5redis持久化分为哪些方式,有什么区别
1.RDB:是二进制压缩包文件,用于保存当前进程的数据生成快照存储在硬盘之中,触发RDB分为自动触发和手动触发。
RBD可以用来还原某一个时刻的操作,由于存在于硬盘之中,即使redis突然崩溃,仍然可以通过rdb恢复某一个时刻的状态,
rdb分为save和bdsave;
save:阻塞当前redis服务,知道rdb完成位置,对内存比较大的实例会造成较长的邮箱,在线上环境上不推荐使用
bgsave:redis进程执行fork操作创建子进程,在子进程种执行,完成后自动结束,阻塞只发成fork阶段,速度很快
触发场景:
(1)执行save操作如 save n m ,自动触发bgsave
(2) 从节点执行全量复制操作,主节点会自动执行bgsave,然后发送给从节点
(3) 执行debug load,主节点会自动执行save
(4) 执行shutdown命令时,没有开启aof操作则会执行bgsave
2.AOF:独立日志存储命令,重新启动的时候执行aof文件,aof的优点是实时性操作,是主流操作
AOF的执行流程是:命令写入、文件同步,文件重写,重启加载
流程是这样子的:
所有的命令都写入缓存区种
缓存区跟着对应的策略向硬盘进行同步操作
随着AOf增大,定期重写,减少大小。
重启redis的时候,可以使用aof进行数据恢复。