likes
comments
collection
share

揭秘Redis速度之谜:一探究竟为何其性能表现如此卓越!

作者站长头像
站长
· 阅读数 28
引子

在当今数字化时代,数据的存储与检索速度成为了技术领域的一大挑战。在这个领域里,Redis犹如一颗闪电般的明星,以其惊人的速度和高效的性能,成为了许多开发者和企业的首选。但究竟是什么让Redis如此之快?是其内存存储方式?还是其优秀的数据结构设计?或许是其高度优化的底层实现?让我们一起深入探索,解开Redis背后的神秘面纱,探寻它之所以能如此快速的奥秘。

五大原因

在大多数人的认知中,Redis之所以快速,通常归因于其基于内存、单线程以及多路复用的特性。然而,这些只是Redis速度之快的表面原因,其背后有更深层次的机制支撑着它的高效性。Redis之所以如此迅速,真正的原因可以归结为五个方面:

1.完全基于内存,相比于传统的磁盘存储,内存的读写速度要快得多。

2.采用单线程模型,不仅保证了每条指令的原子性,同时摒弃了多程中昂贵的上下文切换开销与潜在的竞争风险。

3.高效的数据结构,不仅优化了存储和操作效率,还提升了内存使用。

4.采用I/O多路复用技术,结合了epoll事件驱动模型,将读写请求、连接的建立与关闭等关键环节转化为可监听的事件,进而高效管理。

5.全局Hash,渐进式rehash,保证Redis不阻塞。

接下来,我们将逐一解析这四个原因,探究它们如何共同促使Redis表现出卓越的性能。

①完全基于内存

快速的读写速度:内存相比磁盘具有更快的读写速度。内存的数据访问速度通常在纳秒级别,而磁盘则在毫秒级别。因此,将数据存储在内存中可以大大提高读写操作的速度,使得数据能够更快地被检索和处理。

避免了磁盘I/O的瓶颈:传统数据库通常需要将数据从磁盘读入内存进行处理,再写回磁盘。而Redis完全基于内存,避免了这一过程,可以直接在内存中进行数据的读写和计算,从而避免了磁盘I/O的瓶颈,提高了数据处理的效率。

简化了数据结构和算法:由于Redis不需要考虑磁盘存储的复杂性,可以采用更简单、更高效的数据结构和算法。这些数据结构和算法在内存中的操作效率非常高,能够快速地进行查找、插入和删除等操作,进一步提高了数据处理的速度。

②单线程模型

避免了多线程的上下文切换开销:多线程模型在并发处理时需要频繁进行线程的切换,这涉及到保存和恢复线程上下文的开销,尤其在高并发场景下,这种开销会变得非常显著。而Redis采用单线程模型,避免了这种上下文切换的开销,从而提高了系统的性能和吞吐量。

保证了每条指令的原子性:在多线程模型中,如果不加锁或者使用不当可能会导致数据竞争和并发安全性问题。而Redis的单线程模型可以确保每条指令的原子性,不会出现并发安全性问题,简化了并发编程的复杂度。

减少了竞争风险:在多线程模型中,不同线程之间可能会竞争共享资源,导致竞态条件的发生。而Redis的单线程模型只有一个执行线程,避免了多线程之间的竞争,从而减少了竞争风险,提高了系统的稳定性和可靠性。

更容易实现优化和调试:单线程模型相对于多线程模型来说,实现起来更加简单,调试和优化也更容易。因为只有一个执行线程,所以不需要考虑线程之间的同步和通信,降低了系统的复杂度,提高了开发效率。

③高效数据结构

优化存储和操作效率:Redis选择了特定的数据结构,如哈希表、链表、有序集合等,这些数据结构在内存中的存储和操作效率非常高。例如,哈希表可以实现快速的键值查找,链表可以实现快速的插入和删除,有序集合可以实现快速的范围查询等。通过选择合适的数据结构,Redis能够最大程度地优化存储和操作效率,从而提高数据处理的速度。

提升内存使用效率:Redis的数据结构设计非常精巧,可以最大程度地提升内存的使用效率。例如,Redis的列表数据结构可以实现压缩列表和双向链表两种形式,根据实际情况选择合适的存储方式,节省内存空间。而有序集合数据结构可以实现跳表和压缩列表两种形式,根据实际需求选择合适的数据结构,进一步提高内存的使用效率。

降低数据操作的复杂度:Redis的数据结构设计非常灵活和简洁,能够有效降低数据操作的复杂度。例如,Redis的集合数据结构可以实现并集、交集、差集等集合运算,而不需要开发者手动编写复杂的算法。这样可以减少开发工作量,提高开发效率,同时也能够降低数据操作的时间复杂度,进一步提高速度。

数据结构

揭秘Redis速度之谜:一探究竟为何其性能表现如此卓越!

基础数据结构:

Ⅰ.String字符串: 用于存储字符串值。

Ⅱ.List列表: 内部是一个链表,可存储有序的字符串列表。

Ⅲ.Hash表: 内部是一个哈希表,用于存储字段-值对。

Ⅳ.Set集合: 内部是一个哈希表,存储唯一的字符串值,无序。

Ⅴ.ZSet或Sorted Set有序集合: 内部是一个跳表和哈希表结合,存储带有分数的字符串成员,按分数排序。

底层数据结构:

Ⅰ. String字符串:底层数据结构是简单动态字符串(SDS),支持高效的字符串操作。

Ⅱ. List列表:底层数据结构是双端列表和压缩列表,可以快速地在两端进行插入和删除操作。

Ⅲ. Hash表:底层数据结构是压缩列表和哈希表,使用拉链法解决哈希冲突,支持快速的字段-值对存取。

Ⅳ. Set集合:底层数据结构是哈希表和整数数组,存储唯一的字符串值,支持快速的添加、删除和查找操作。

Ⅴ. ZSet或Sorted Set有序集合:底层数据结构是跳表和压缩表,通过跳表实现有序性,通过压缩表实现快速的成员查找。

④I/O多路复用

揭秘Redis速度之谜:一探究竟为何其性能表现如此卓越!

高效地管理多个客户端连接:I/O多路复用技术允许Redis在单个线程中同时监听多个客户端连接上的事件,如读取、写入等。通过这种方式,Redis能够高效地管理大量的客户端连接,而不需要为每个连接创建一个线程,从而节省了线程管理的开销。

减少系统资源的占用:相比于为每个客户端连接创建一个线程,采用I/O多路复用技术能够大幅减少系统资源的占用。线程的创建和销毁都需要消耗额外的系统资源,而使用单线程加上I/O多路复用技术可以避免这种资源浪费,从而提高系统的整体性能。

降低上下文切换的开销:多线程模型中,线程之间的切换需要保存和恢复线程的上下文,这涉及到CPU寄存器的保存和恢复、内存的切换等操作,而这些操作会带来较大的开销。而Redis使用单线程加上I/O多路复用技术,可以避免这种上下文切换的开销,提高系统的运行效率。

简化代码的编写和维护:使用I/O多路复用技术可以大大简化代码的编写和维护。相比于多线程模型,单线程加上I/O多路复用技术的代码更加简洁清晰,不需要考虑线程同步、线程间通信等复杂的并发问题,降低了开发和维护的难度。

总结:

Redis客户端与服务端的交互流程通常涉及以下步骤:

1.命令打包与传输 - 客户端(如Redis客户端库)会将命令按照Redis协议格式化成字符串序列,通过Socket发送至服务端。

2.非阻塞式I/O多路用 - - 客端利用epoll等技术,非塞式I/O多路用,监控多个Socket事件。每个Socket事件(读写、连接请求、响应就绪),而不是主动轮询每个连接。

3.事件回调关联 - 每个Socket关联** 事件都会配对一个回调函数,当Socket准备好读或写时执行该回调,处理逻辑。

4.单程模型处理 服务端 - Redis服务端采用单程模型,线程处理命令,确保指令顺序执行,简化并发控制,处理完后返回结果。

5.响应与多路复用 - 客端使用多路用技术,如epoll,非塞式监控多个Socket事件,能同时处理多个连接事件,每个连接的请求,提高并发处理效率。

归纳:Redis客户端利用多路复用技术,通过Socket与服务端高效交互,实现高并发操作。客户端将指令序列化后通过非阻塞式I/O(如epoll模型)技术,每个Socket事件(指令关联特定的回调函数,当Socket就绪时执行,如读取指令或响应)。服务端单程模型按序处理每条指令,保证操作原子性,完成后通过Socket将响应结果返回客户端。服务端的多路用(epoll)能同时监控处理多个Socket事件,即使在单程中,有效管理多个连接的并发,大幅提升Redis处理请求并发性能,支持大量请求,确保系统在高并发场景下的响应速度和稳定性。

⑤全局Hash

Redis整体都是使用一个全局哈希表来存储所有键值对数据,时间复杂度为O(1),只需要计算每个Key的Hash值就找到对应的Hash位置,定位桶里面的Entry数据就行,这也是Redis之所以快的原因之一。

针对于Hash冲突,Redis采用的是链式Hash来解决。对于扩容,Redis准备了另一个Hash表,分配更大的空间,再使用rehash重新映射旧Hash表上的数据到新Hash表上,这里需要注意的是,映射过程不是一次性的(一次性会造成Redis阻塞,无法对外提供服务),而是渐进式的,即渐进式rehash

原因总结:

1.完全基于内存,避免和磁盘的I/O交互。

2.单线程处理所有客户端发来的指令,避免线程间切换开销和竞争。

3.使用高效的数据结构,能够优化提高Redis的存储、操作、使用等效率。

4.利用多线程模型解决(从客户端读取数据、回写数据给客户端)之间的网络I/0慢的问题,服务端处理指令仍旧是单线程处理。

5.全局Hash表结构,,等值查询时间复杂度常数级别。

参考文章

levelup.gitconnected.com/4-reasons-w…

Redis高手心法——码哥字节原创

blog.csdn.net/shuo_Java/a…

cloud.tencent.com/developer/a…

转载自:https://juejin.cn/post/7373490819884335156
评论
请登录