一、Redis为什么那么快
1)完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
2)数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的
3)采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
4)使用多路I/O复用模型,非阻塞IO
5)使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求
二、Redis的多路I/O复用模型,非阻塞IO简介
Redis基于Reactor模式开发了网络事件处理器,这个处理器叫做文件事件处理器 file event handler。 这个文件事件处理器,它是单线程的,所以 Redis 才叫做单线程的模型,它采用IO多路复用机制来同时 监听多个Socket,根据Socket上的事件类型来选择对应的事件处理器来处理这个事件。可以实现高性能 的网络通信模型,又可以跟内部其他单线程的模块进行对接,保证了 Redis 内部的线程模型的简单性。
文件事件处理器的结构包含4个部分:多个Socket、IO多路复用程序、文件事件分派器以及事件处理器 (命令请求处理器、命令回复处理器、连接应答处理器等)。 多个 Socket 可能并发的产生不同的操作,每个操作对应不同的文件事件,但是IO多路复用程序会监听 多个 Socket,会将 Socket 放入一个队列中排队,每次从队列中取出一个 Socket 给事件分派器,事件 分派器把 Socket 给对应的事件处理器。 然后一个 Socket 的事件处理完之后,IO多路复用程序才会将队列中的下一个 Socket 给事件分派器。文 件事件分派器会根据每个 Socket 当前产生的事件,来选择对应的事件处理器来处理。
Redis采用epoll作为I/O多路复用技术的实现,并使用非阻塞I/O来执行读、写和连接等操作。通过这种方式,Redis可以快速地处理大量的客户端连接和数据读写操作,而不会因为过多的I/O操作导致性能下降或线程阻塞。
三、Redis的VM机制简介
Redis的VM(Virtual Memory)机制是一种将不经常访问的数据(冷数据)从内存交换到磁盘上的技术,从而腾出宝贵的内存空间用于其他需要频繁访问的数据(热数据)。通过VM机制,可以实现冷热数据分离,使热数据仍然在内存中,而冷数据被保存在磁盘上。这样可以避免因为内存不足而导致访问速度下降的问题。
Redis的VM机制通过两种方式实现:一种是使用Lazy-Loading技术,将内存划分为“活跃集合”(Active Set)和“过期集合”(Expired Set)。所有的写操作都只写入活跃集合,当活跃集合占满时,Redis会将最少使用的键值对写入磁盘并从内存中删除,以释放内存。另一种方式是通过配置参数进行数据在内存和磁盘之间的换入和换出操作。
在Redis中,可以通过设置VM参数来启用VM机制。这些参数包括vm-enabled、vm-max-memory、vm-page-size、vm-pages等。其中,vm-enabled参数用于启用或禁用VM机制,vm-max-memory参数用于设置当内存消耗达到上限时开始将值交换出来,vm-page-size参数用于设置单个页面的大小,vm-pages参数用于设置最多能交换保存多少个页到磁盘。
需要注意的是,虽然VM机制可以提高数据库的容量和处理能力,但是它需要进行磁盘和内存之间的频繁的I/O操作,可能会给Redis带来一些性能问题。此外,由于VM需要进行磁盘写操作,会产生与存储介质相关的成本和风险,因此需要根据具体的应用场景进行权衡和选择。
四、多路I/O复用模型简介
多路I/O复用模型是一种用于处理多个I/O请求的技术,它允许多个进程或线程同时访问一个I/O设备。这种技术可以提高I/O设备的利用率并减少等待时间。多路I/O复用模型的核心思想是使用一个单独的线程或进程来监视多个文件描述符的状态,以便在它们准备好进行I/O操作时立即执行。
多路I/O复用模型主要包括以下几种:
select模型:select模型是一种最早的多路I/O复用技术,它允许程序监视多个文件描述符的状态,以便在它们准备好进行I/O操作时进行通知。select模型的主要优点是它能够处理大量文件描述符,但是它的缺点是对于每个文件描述符都需要轮询,因此效率较低。
poll模型:poll模型是select模型的改进版本,它与select模型类似,但是它没有限制可以监视的文件描述符的最大数量。poll模型在内部使用一个循环来监视所有注册的文件描述符,并当它们准备好进行I/O操作时返回。poll模型的效率比select模型更高,因为它只需要一次循环就可以检查所有文件描述符的状态。
epoll模型:epoll模型是多路I/O复用技术的最新版本,它在Linux系统中得到了广泛的应用。epoll模型使用事件驱动的方式来实现多路I/O复用,它通过维护一个事件表来监视多个文件描述符的状态。当一个文件描述符准备好进行I/O操作时,epoll模型会自动将该文件描述符添加到事件表中,以便进程可以进行处理。与select和poll模型相比,epoll模型更加高效,因为它只需要处理已经准备好的文件描述符,而不需要轮询所有文件描述符。
总的来说,多路I/O复用模型是一种非常有用的技术,它可以提高I/O设备的利用率并减少等待时间。不同的多路I/O复用模型各有优缺点,应根据具体的应用场景选择合适的多路I/O复用模型。
五、非阻塞IO技术简介
非阻塞I/O(Non-blocking I/O)是一种处理I/O操作的方式,它允许程序在等待I/O操作完成时执行其他任务,而不是简单地等待I/O操作完成。非阻塞I/O技术可以提高程序的效率和响应性,特别是在处理大量并发请求时。
非阻塞I/O的核心思想是在进行I/O操作时,不阻塞调用线程或进程,而是让系统通知应用程序异步地处理数据。具体实现方式通常涉及使用特定的系统调用或API,例如在Unix系统中的select()或poll()系统调用。这些系统调用允许应用程序同时监视多个文件描述符的状态,以便在它们中的任何一个准备好进行读或写操作时进行通知。
在非阻塞I/O中,应用程序可以不断地检查文件描述符的状态,以确定是否可以进行读或写操作。如果文件描述符未准备好进行读或写操作,应用程序可以继续执行其他任务,而不是浪费时间等待。当文件描述符准备好进行读或写操作时,应用程序可以立即进行操作,并继续执行其他任务。
非阻塞I/O的主要优势在于可以提高程序的效率和响应性。通过减少不必要的等待时间,应用程序可以在进行I/O操作的同时执行其他任务,从而提高整体性能。此外,非阻塞I/O还可以减少线程或进程的上下文切换开销,进一步提高了效率。
需要注意的是,非阻塞I/O技术并不适用于所有情况。在某些情况下,阻塞I/O可能更适合,例如在需要确保数据完整性的情况下。因此,在选择使用非阻塞I/O技术时,需要根据具体的应用场景和需求进行评估。