目录
1、Redis是什么?
Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库。与传统数据库不同的是,Redis 的数据是存在内存中的,所以读写速度非常快,被广泛应用于缓存方向。Redis可以将数据写入磁盘中,保证了数据的安全不丢失,而且Redis的操作是原子性的。
2、Redis有哪些应用场景?
- 缓存热点数据,缓解数据库的压力。
- 利用 Redis 原子性的自增操作,可以实现计数器的功能,比如统计用户点赞数、用户访问数等。
- 简单的消息队列,可以使用Redis自身的发布/订阅模式或者List来实现简单的消息队列,实现异步操作。
- 限速器,可用于限制某个用户访问某个接口的频率,比如秒杀场景用于防止用户快速点击带来不必要的压力。
- 好友关系,利用集合的一些命令,比如交集、并集、差集等,实现共同好友、共同爱好之类的功能。
3、Redis有什么优势?
- 基于内存操作,内存读写速度快。
- Redis是单线程的,避免线程切换开销及多线程的竞争问题。单线程是指网络请求使用一个线程来处理,即一个线程处理所有网络请求,Redis 运行时不止有一个线程,比如数据持久化的过程会另起线程。
- 支持多种数据类型,包括String、Hash、List、Set、ZSet等。
- 支持持久化。Redis支持RDB和AOF两种持久化机制,持久化功能可以有效地避免数据丢失问题。
- 支持事务。Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
- 支持主从复制。主节点会自动将数据同步到从节点,可以进行读写分离。
4、Redis为什么这么快?
- 基于内存:Redis是使用内存存储,没有磁盘IO上的开销。数据存在内存中,读写速度快。
- 单线程实现( Redis 6.0以前):Redis使用单个线程处理请求,避免了多个线程之间线程切换和锁资源争用的开销。
- IO多路复用模型:Redis 采用 IO 多路复用技术。Redis 使用单线程来轮询描述符,将数据库的操作都转换成了事件,不在网络I/O上浪费过多的时间。
- 高效的数据结构:Redis 每种数据类型底层都做了优化,目的就是为了追求更快的速度。
5、Redis主要消耗什么物理资源?
Redis是内存数据库,所以主要消耗的肯定是内存。
6、Redis为什么把所有数据放到内存中?
因为Redis的定位就是一个内存数据库。
内存的读取速度是最快的,如果放到硬盘,磁盘I0的速度势必会严重影响Redis的性能,那就和般的关系数据库相比没什么优势可言,而且随着现在内存硬件成本的降低,内存已经不是问题,性能才是关键,现在硬盘只是成为了一种持久化方案而已。
7、Redis命令是原子性的吗?
Redis命令是原子性的,因为Redis 是单线程的,一个操作要么执行,要么不执行,不会被其他线程打断。
8、Redis磁盘快照操作是原子的吗?
是的,Redis 任何命令在内存中是原子操作的,在磁盘快照里同样也是原子的。
9、Redis怎么测试连通性?
先连接上Redis,再使用ping指令。
如:
10、Redis到底是单线程还是多线程?
大家注意审题: Redis是多线程还是单线程?
这个问题你要从多个方面回答,如果你仅仅只回答“单线程”肯定是说不过去的,为什么呢?我们需要和面试官有所可聊
1、Redis单线程到底指什么?
没错,大家所熟知的Redis确实是单线程模型,指的是执行Redis命令的核心模块是单线程的,
而不是整个Redis实例就一个线程 ,Redis 其他模块还有各自模块的线程的。
下面这个解释比较好:
Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的
组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。
因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。
参考
https://www.jianshu.com/p/6264fa82ac33
2、Redis不仅仅是单线程
一般来说Redis的瓶颈并不在CPU,而在内存和网络。如果要使用CPU多核,可以搭建多个
Redis实例来解决。
其实,Redis 4.0开始就有多线程的概念了,比如Redis通过多线程方式在后台删除对象、以及通过Redis模块实现的阻塞命令等。
来源官方的解释:
如果你能说到这里,对Redis单/多线程的理解也有你自己更多的认识了。
另外,2020 年 5 月 2日Redis 6正式发布了,其中有一个是被说了很久的多线程IO
这个Theaded IO指的是在网络10处理方面上了多线程,如网络数据的读写和协议解析等,需要注意的是,执行命令的核心模块还是单线程的。
所以,你要是再把Redis 6.0网络处理多线程这块回答上了,你也不至于“请回”了。
注意:对于新技术的发展和学习不就是我们和面试官的谈资吗?所以你可以去了解redis新出的版本
3、为什么网络处理要引入多线程?
之前的段落说了,Redis 的瓶颈并不在CPU,而在内存和网络。
内存不够的话,可以加内存或者做数据结构优化和其他优化等,但网络的性能优化才是大头,网络IO的读写在Redis整个执行期间占用了大部分的CPU时间,如果把网络处理这部分做成多线程处理方式,那对整个Redis的性能会有很大的提升
网上也有对Redis单/多线程情况下的get/set 操作性能做了对比:
从上面的性能测试图来看,多线程的性能几乎是单线程的两倍了,从该文章来看,这个只是简单的针对多线程性能的验证,并没有做很多严谨的测试,不能作为线上指标参考。
但可以知道的是,Redis 在网络处理方面,上了多线程确实会让Redis性能上一个新台阶,不过还需要一些验证与优化。
最后,6.0版本中,IO多线程处理模式默认是不开启的,需要去配置文件中开启并配置线程数,有兴趣的研究下吧。
总结
这篇文章只是对Redis单线程/多线程有个基本的认识和总结,吊打面试官可能还说不上,但是在面对面试官提问的时候,不要只是单纯的说单线程,你要回答的还要比这个更多。