Redis面试题

        为什么redis是单线程?这里的单线程指什么?为什么这么快?

  • Redis是不是单线程?

        我们通过gdb调试Redis源码,查看线程:

        上图中我们发现,Redis服务器内部有5个线程(在其它版本的Redis可能还会有io_xxx线程,主要用来进行命令的解码和编码的),并不是单线程。

        其实Redis服务器主要的工作是处理命令,所以Redis说的单线程指的是处理客户端的命令是单线程的。 

  • 为什么不使用多线程?
  1. Redis服务器并不是一个IO密集型和CPU密集型,因为是内存数据库。
  2. 如果采用多线程:
    1. 加锁会很复杂,并且锁的密度不好控制。因为支持多个数据对象类型,而每个对象类型在不同条件下会采用不同数据结构实现。比如:list可以由quicklist或ziplist实现,hash可以由ziplist或者dict来实现等。
    2. 一个服务器可能连接多个客户端,有的客户端可能请求很频繁。使用多线程,可能会导致CPU中频繁的进行线程切换,导致效率下降。
  • 使用单线程的缺点

        不能有耗时操作,体现在响应性能。比如现在有多个客户端连接一个Redis服务器。当一个客户端发送请求给服务器时,如果响应很慢,第二个客户端发送请求给服务器,必须等上一个请求处理完才被处理。

  • 为什么这么快?
  1. 采用了什么机制
    1. 由于Redis是内存数据库,不需要进行IO,效率高。
    2. 数据结构高效。
    3. 采用高效的reactor模型。即使用IO多路复用(检测事件是否就绪)。非阻塞IO(针对于read和write函数,只有在可以写和读的时候才会进行写和读)。
  2. 进行了什么优化
    1. 耗时阻塞操作,另外起线程处理。比如上面的:异步关闭大文件,异步释放大块内存,异步aof刷新到磁盘,异步请求和响应的加密解密,异步分配内存。
    2. 对象类型在不同条件下,使用不同数据类型来实现,主要是为了提高效率。
    3. 分治思想。将阻塞的操作。进行拆分,拆分成小的非阻塞操作。比如:dict的rehash。

        

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值