【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

相关文章

Java如何从Redis中批量读取数据

《Java如何从Redis中批量读取数据》:本文主要介绍Java如何从Redis中批量读取数据的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一.背景概述二.分析与实现三.发现问题与屡次改进3.1.QPS过高而且波动很大3.2.程序中断,抛异常3.3.内存消

Redis中的Lettuce使用详解

《Redis中的Lettuce使用详解》Lettuce是一个高级的、线程安全的Redis客户端,用于与Redis数据库交互,Lettuce是一个功能强大、使用方便的Redis客户端,适用于各种规模的J... 目录简介特点连接池连接池特点连接池管理连接池优势连接池配置参数监控常用监控工具通过JMX监控通过Pr

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

python操作redis基础

《python操作redis基础》Redis(RemoteDictionaryServer)是一个开源的、基于内存的键值对(Key-Value)存储系统,它通常用作数据库、缓存和消息代理,这篇文章... 目录1. Redis 简介2. 前提条件3. 安装 python Redis 客户端库4. 连接到 Re

Redis迷你版微信抢红包实战

《Redis迷你版微信抢红包实战》本文主要介绍了Redis迷你版微信抢红包实战... 目录1 思路分析1.1hCckRX 流程1.2 注意点①拆红包:二倍均值算法②发红包:list③抢红包&记录:hset2 代码实现2.1 拆红包splitRedPacket2.2 发红包sendRedPacket2.3 抢

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red