很多人都知道Redis很快,但很多人不知道Redis快在哪?
一 基本原理
Redis“快”很大一部分原因在于它的基本原理。
- 因为Redis是建立在内存数据库中,所以它的操作都是在内存上面进行。
- 得益于Redis的键值对是由优秀的数据结构组成的。
二 底层数据结构
其实Redis底层数据结构有五种,分别是整数数组、双向链表、哈希表、压缩列表和跳表。
前面三种大家应该都知道,在这里就不一一讲解了,我们注重讲一下压缩列表和跳表
压缩列表
压缩列表是 Redis 数据结构之一,它是一种特殊的数据结构,可以同时支持列表和字典两种数据结构的操作。压缩列表可以看作是一种紧凑型的数组,它可以在内存中高效地存储一系列数据。
在压缩列表中,每个节点可以保存一个字节数组或整数值。节点之间通过特定的编码方式进行压缩和解压,以尽可能地减少内存占用。
压缩列表的表头包含三个字段,分别是 zlbytes、zltail 和 zllen。其中,zlbytes 表示整个压缩列表占用的字节数,zltail 表示压缩列表尾节点的偏移量,zllen 表示压缩列表中节点的数量。这些字段的存在使得在查找定位第一个元素和最后一个元素时,可以通过表头三个字段的长度直接定位,复杂度是 O(1)。
在压缩列表中,如果我们要删除一个元素,只需要将该节点的前一个节点的 next 指针指向该节点的下一个节点即可。如果要插入一个元素,我们可以先创建一个新的节点,然后将新节点的 next 指针指向原来的下一个节点,再将前一个节点的 next 指针指向新节点。这些操作的时间复杂度都是 O(1)
压缩列表虽然可以高效地支持列表和字典两种数据结构的操作,但它也有一些局限性。例如,压缩列表只能支持单个节点的插入和删除操作,无法支持批量操作;另外,由于节点大小的限制,压缩列表对于大型数据集的支持并不理想。
跳表
由于有序链表只能逐一查找元素,导致操作起来非常缓慢,于是就出现了跳表。具体来说,跳表其实在链表的基础上,增加了多级索引,通过索引位置的几个跳转,实现数据的快速定位,它可以支持快速的查找、插入和删除操作,时间复杂度为 O(log n)。跳表通过在链表中增加多级索引的方式,减少了查找元素的时间复杂度。如下图所示:
跳表是一种非常实用的数据结构,在 Redis、LevelDB 等多个流行的软件中得到广泛应用。
通过使用不同的数据结构,Redis 可以更好地适应不同类型的数据,并提供高效的数据操作,使得 Redis 在处理大量数据时具有非常高的性能,所以Redis为什么快?很大程度在数据结构上面。