【Redis底层原理】之数据结构与持久化机制

2024-03-24 09:12

本文主要是介绍【Redis底层原理】之数据结构与持久化机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Redis 是一个开源的、基于内存的高性能键值存储数据库,它支持多种类型的数据结构。Redis 的数据结构类型和它们的底层实现是 Redis 强大功能和高效性能的基础。以下是 Redis 支持的主要数据结构类型以及其底层数据结构和原理:

基础数据结构

1. 字符串(String)

  • 底层数据结构:简单动态字符串(Simple Dynamic String, SDS)。SDS 是 Redis 的默认字符串表示形式,它在 C 语言的字符串表示(以 null 结尾的字符数组)之上提供了更多的元信息,如字符串长度和缓冲区剩余空间,从而使字符串操作更加高效。
  • 应用场景:存储文本或二进制数据,如缓存用户信息、会话、计数器等。

2. 列表(List)

  • 底层数据结构:双向链表(linked list)或压缩列表(ziplist)。Redis 会根据列表的大小和操作的性质选择最合适的底层数据结构。小列表使用压缩列表可以节省空间,而大列表则使用双向链表以优化插入和删除操作。
  • 应用场景:消息队列、最近使用页面(LRU)缓存等。

3. 集合(Set)

  • 底层数据结构:哈希表(hashtable)或整数集合(intset)。整数集合用于存储小的整数集合,而当集合中的元素或元素的数量超过一定阈值时,Redis 会使用哈希表来存储集合元素。
  • 应用场景:存储不重复元素的集合,如标签、投票、社交网络中的好友关系等。

4. 有序集合(Sorted Set)

  • 底层数据结构:跳跃表(Skip List)和哈希表的组合。跳跃表用于维护元素的顺序,而哈希表则用于快速查找元素。
  • 应用场景:排行榜、时间线、按分数排序的数据项等。

5. 哈希(Hash)

  • 底层数据结构:压缩列表(ziplist)或哈希表(hashtable)。当哈希中存储的字段和值都比较小且数量不多时,使用压缩列表更加内存高效。当哈希结构变大时,会自动转换为哈希表。
  • 应用场景:存储对象的属性和值,如用户的各种信息等。

6. 位图(Bitmap)

  • 底层数据结构:实际上是字符串(SDS)的一种特殊应用,通过位操作命令来处理。
  • 应用场景:统计、特征标志、实现简单的布尔过滤器等。

7. HyperLogLog

  • 底层数据结构:基于概率算法的数据结构,用于进行基数估算。
  • 应用场景:大数据量的去重计数,如统计网站访客数等。

8. 地理空间索引(Geo)

  • 底层数据结构:有序集合。利用有序集合来存储地理位置信息,并通过有序集合提供的范围查询功能来实现位置查询和范围查询。
  • 应用场景:地理位置服务,如查找附近的商店、服务等。

高级数据结构

  • 流(Streams):Redis Streams 是一个消息队列数据结构,类似于 Apache Kafka。它提供了持久化消息队列的能力,非常适合构建事件驱动的应用程序。底层实现基于一个排序的哈希表,支持复杂的消费者组功能。

Redis持久化机制

Redis 提供了两种主要的持久化机制:RDB(Redis 数据库快照)和 AOF(追加文件)。这两种机制可以单独使用,也可以同时使用,以满足不同的数据持久化需求。

1. RDB 持久化

RDB 持久化会在指定的时间间隔内生成内存数据的快照,并将其保存到磁盘上的一个二进制文件中(通常是 dump.rdb)。

过程
  • 触发:RDB 快照可以通过配置来自动触发,比如每隔一定时间或达到一定数量的写操作后。也可以手动触发,如执行 SAVEBGSAVE 命令。
  • SAVE 命令:执行 RDB 快照操作,会阻塞所有客户端请求直到快照完成。
  • BGSAVE 命令:启动一个子进程来创建快照,主进程会继续处理客户端请求。
注意事项
  • 性能:使用 BGSAVE 时,虽然主进程不会被阻塞,但是在快照过程中会增加一定的内存和 CPU 使用,因为需要复制整个数据集到子进程。
  • 数据恢复:RDB 适合需要快速恢复整个数据集的场景。但在故障发生后,自上次快照以来的所有数据变更都会丢失。

2. AOF 持久化

AOF 持久化通过记录数据库状态变更的命令来持久化数据。这些命令会被追加到 AOF 文件的末尾,以确保数据的持久化。

过程
  • 记录:每个写命令在执行后都会被追加到 AOF 文件中。
  • 重写:随着时间的推移,AOF 文件可能会变得非常大。Redis 提供了 AOF 重写机制,来创建一个新的 AOF 文件,其中只包含达到当前数据库状态所需的最少命令。这可以通过 BGREWRITEAOF 命令手动触发,也可以配置自动触发。
  • 加载:Redis 重启时,会读取 AOF 文件来重建原始数据库的状态。
注意事项
  • 数据安全:AOF 持久化提供了更好的数据安全性,因为它可以配置为每个写命令后立即同步到磁盘,或者每秒同步一次。
  • 性能:相比 RDB,AOF 可能会因为频繁的磁盘写操作而导致性能下降。AOF 重写是解决 AOF 文件过大问题的关键。

RDB 与 AOF 的区别和选择

  • 数据安全:AOF 可以提供更高级别的数据安全性,因为它支持更频繁的同步选项。

  • 性能:对于大多数读取密集型的应用,RDB 可以提供更好的性能,因为它对磁盘 IO 的需求通常比 AOF 小。

  • 恢复速度:RDB 允许更快的数据恢复,因为只需要加载单个快照文件。而 AOF 文件可能非常大,加载时间更长。

  • 持久化策略:可以根据需求选择不同的持久化策略。对于需要最小数据丢失的系统,推荐使用 AOF。如果是更关心性能和快速恢复,RDB 可能是更好的选择。

  • 结合使用:在许多场景下,结合使用 RDB 和 AOF 可以提供既

  • 优秀的数据安全性又能维持良好性能的解决方案。通过配置 Redis 同时使用 RDB 和 AOF 持久化,可以利用各自的优点来达到最佳的效果:

    • 在大多数情况下,Redis 可以通过 AOF 文件来恢复数据,确保了数据的高安全性,因为 AOF 会尽可能频繁地记录每个写操作。
    • 在 AOF 重写或者性能敏感的情况下,可以依赖 RDB 快照来提供一个更快速的数据恢复点,同时减轻因 AOF 重写可能带来的性能影响。

结合使用时的注意事项

  • 数据恢复顺序:当 Redis 同时启用了 RDB 和 AOF 持久化,且都存在有效文件时,Redis 在启动时会优先使用 AOF 文件来恢复数据,因为 AOF 文件通常包含更完整的数据历史。
  • 配置冲突:确保理解 RDB 和 AOF 的配置选项,并正确配置以避免不必要的性能开销。例如,不需要太频繁的 RDB 快照,如果 AOF 以较高的频率进行同步。
  • 监控和维护:定期监控 RDB 快照和 AOF 文件的大小,以及 AOF 重写的性能影响。根据需要调整配置,比如调整 AOF 重写的触发条件,或是调整 RDB 快照的频率。

高级配置

  • AOF 重写缓冲区:在 AOF 重写过程中,Redis 会使用一个专用的缓冲区来存储重写期间发生的所有写操作。这确保了即使在重写过程中,新的写操作也不会丢失。
  • 混合持久化:从 Redis 4.0 开始,引入了一种混合持久化模式(AOF 和 RDB 混合),它会在 AOF 文件中嵌入一个 RDB 格式的数据快照。这种方式旨在结合 AOF 持久化的数据安全性和 RDB 持久化的快速加载能力。
  • AOF 重写调度:通过合理安排 AOF 重写的执行时间,可以最小化对生产环境的影响。考虑在系统负载较低的时间段执行 AOF 重写操作。

这篇关于【Redis底层原理】之数据结构与持久化机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/841126

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

哈希表的底层实现(1)---C++版

目录 哈希表的基本原理 哈希表的优点 哈希表的缺点 应用场景 闭散列法 开散列法 开放定值法Open Addressing——线性探测的模拟实现 超大重点部分评析 链地址法Separate Chaining——哈希桶的模拟实现 哈希表(Hash Table)是一种数据结构,它通过将键(Key)映射到值(Value)的方式来实现快速的数据存储与查找。哈希表的核心概念是哈希