在回答今天的问题之前,我们先简单介绍一下关系型数据库、非关系型数据库以及redis。
什么是关系型数据库和非关系型数据库?各有什么优缺点?
众所周知,从 20 世纪 80 年代开始,数据库技术就进入了关系数据库时代。而数据库经历了网状数据库、 层次数据库 和关系数据库三个时代。
但是关系型数据库存在着很多的不足,如以下几个方面:
NoSQL(Not Only SQL)
NoSQL(Not Only SQL)泛指一切非关系型的数据库,它是为了解决大规模数据集合以 及多种数据类型带来的问题,尤其是大数据应用难题(NoSQL 数据库并没有一个统一的 架构而是各有所长)。
NoSQL 数据库的三大优势
关系数据库 VS NoSQL 数据库
Reids是什么?有什么特点?
Redis 是一种基于键值对(key-value) 的 NoSQL 数据库,是当前比较热门的 NoSql 数据库产品之一,是一个开源的、使用 C 语言编写的、支持网络交互的、可基于内存也可持久化的高性能键值对 Key-Value 数据库。
特点:
简单介绍了关系型数据库和非关系数据库后,接下来我们回到今天的问题,Redis处理速度为什么快呢?下面介绍几个主要的原因。
Redis为何快?
Redis 使用单进程单线程架构和 I/O 多路复用模型来实现高性能的内存数据库服务。
- 纯内存访问
Redis 将所有的数据存放在内存中,内存的响应时间大约为100ns, 这是 redis 达到每秒万级别访问的基础;
- 非阻塞 I/O
Redis 使用 epoll 作为 I/O 多路复用技术的实现,再加上 redis 自身的时间处理模型将 epoll 中的连接、读写、关闭都转换为时间,不在网络 I/O 上浪费过多的时间;
- 单线程模式
单线程避免了线程切换和资源竞争,这样服务端也就没有了线程同步和竞争锁问题。
Redis正是具备了如此多的优点使得其在项目开发中得以广泛使用,上面提到了其采用单线程模式极大的提高了其性能,那为何要在版本6/7之后,开始支持多线程呢?是不是就没有以前的优势了呢?
Redis6/7版本为何要开始支持多线程?
随着Redis的应用场景越来越广泛,数据量和并发量越来越大,单线程模型已经无法满足需求。因此,Redis6.0之后引入了多线程模型,以提高Redis的性能和并发能力。多线程模型可以充分利用多核CPU的优势,提高Redis的处理能力和吞吐量。同时,Redis6.0中的多线程模型采用了无锁设计,避免了锁竞争和线程切换等开销,从而保证了Redis的高性能和高并发能力。
首先说一下多线程的优势,多线程模型可以在处理阻塞操作时提供更好的性能,例如慢查询、持久化操作等。此外,多线程还能够更好地应对高并发的情况,减少请求的排队等待时间,提高系统的响应能力。
另外,Redis的性能瓶颈并不在CPU,而在内存和网络。网络IO在执行期间大量占用了CPU,所以如果网络IO时引入多线程,对性能提升很大。
需要注意的是,虽然Redis6.0之后引入了多线程模型,但是命令的处理仍然是单线程的。多线程主要用于处理网络数据的读写和协议解析,而命令执行仍然是单一工作线程。这样可以避免多线程下并发访问带来的种种问题。