Redis数据持久化:RDB与AOF详解及数据恢复应用

Redis究竟支持哪些数据结构

Redis支持多种数据结构,这些数据结构各有特点,适用于不同的应用场景。以下是Redis支持的主要数据结构及其特点:

1. 字符串(String)

  • 特点:字符串是Redis最基本的数据结构,可以存储文本或二进制数据。
  • 应用场景:缓存、计数器、存储序列化的对象等。
  • 常用命令:SET、GET、INCR、DECR等。

2. 列表(List)

  • 特点:列表是一个有序的字符串集合,允许重复值。
  • 应用场景:消息队列、操作日志等。
  • 常用命令:LPUSH、RPUSH、LPOP、RPOP等。

3. 集合(Set)

  • 特点:集合是一个无序的字符串集合,不允许重复值。
  • 应用场景:标签系统、社交网络关系等。
  • 常用命令:SADD、SREM、SISMEMBER、SMEMBERS等。

4. 有序集合(Sorted Set)

  • 特点:有序集合类似于集合,但每个元素都关联一个分数(score),用于排序。
  • 应用场景:排行榜、时间轴等。
  • 常用命令:ZADD、ZREM、ZRANGE、ZSCORE等。

5. 散列(Hash)

  • 特点:散列是一个键值对集合,其中每个键都映射到一个值。
  • 应用场景:存储对象,每个对象包含多个字段和对应的值。
  • 常用命令:HSET、HGET、HDEL、HGETALL等。

6. 位图(Bitmap)

  • 特点:位图是一种特殊的字符串,每个位都可以设置为0或1,用于处理二进制数据。
  • 应用场景:在线状态标记、用户签到等。
  • 常用命令:SETBIT、GETBIT、BITOP、BITCOUNT等。

7. 基数统计(HyperLogLog)

  • 特点:用于基数估计,可以估算集合中的不重复元素数量。
  • 应用场景:UV统计、广告点击率统计等。
  • 常用命令:PFADD、PFCOUNT、PFMERGE等。

8. 地理位置(Geospatial)

  • 特点:支持存储地理位置信息,支持距离计算和范围查询。
  • 应用场景:位置服务、物流跟踪等。
  • 常用命令:GEOADD、GEODIST、GEORADIUS、GEOHASH等。

9. 流(Stream)

  • 特点:Redis 5.0版本新增,用于消息队列等场景,支持消费者组等高级特性。
  • 应用场景:消息发布/订阅、事件溯源等。

10. 底层数据结构

除了上述对外提供的数据结构外,Redis内部还使用了一系列底层数据结构来高效实现这些功能,如:

  • int:用于存储整数。
  • raw:用于存储可变长的字符串。
  • embstr:用于存储短字符串,是raw的一种优化形式。
  • ziplist:压缩列表,用于节省内存。
  • linkedlistquicklist:链表结构,用于实现列表等数据结构。
  • hashtable:哈希表,用于实现散列、集合、有序集合等数据结构。
  • skiplist:跳表,用于实现有序集合的排序功能。

这些底层数据结构的选择和优化,使得Redis在处理各种数据类型时都能保持高效和灵活。当然,我可以结合Redis支持的数据结构,给出一些具体的示例讲解。

示例演示

1. 字符串(String)

应用场景:缓存用户信息

示例

假设我们需要缓存用户的用户名,可以使用Redis的字符串数据结构。

# 设置用户名为"John Doe"
SET username "John Doe"# 获取用户名
GET username
# 输出:"John Doe"

此外,字符串还可以用于计数器,比如记录网页访问次数。

# 初始化访问次数为0
SET page_views 0# 每次访问时增加访问次数
INCR page_views# 获取当前访问次数
GET page_views

2. 列表(List)

应用场景:消息队列

示例

使用Redis的列表实现一个简单的消息队列,生产者将消息推入列表,消费者从列表弹出消息。

# 生产者推入消息
LPUSH message_queue "Hello, Redis!"# 消费者弹出消息
RPOP message_queue
# 输出:"Hello, Redis!"

3. 集合(Set)

应用场景:用户标签系统

示例

假设我们需要为每个用户分配一个或多个标签,可以使用Redis的集合数据结构。

# 为用户1添加标签
SADD user:1:tags "tech" "gamer"# 检查用户1是否有"tech"标签
SISMEMBER user:1:tags "tech"
# 输出:(integer) 1,表示存在# 获取用户1的所有标签
SMEMBERS user:1:tags
# 输出可能是:"1) "tech" 2) "gamer""

4. 有序集合(Sorted Set)

应用场景:排行榜

示例

使用Redis的有序集合实现一个用户分数排行榜,根据分数进行排序。

# 添加用户分数
ZADD leaderboard 100 "Alice"
ZADD leaderboard 200 "Bob"# 获取排行榜前三名
ZREVRANGE leaderboard 0 2 WITHSCORES
# 输出可能是:"1) "Bob" 2) "200" 3) "Alice" 4) "100""

5. 散列(Hash)

应用场景:存储对象信息

示例

使用Redis的散列结构存储用户信息,每个用户包## Redis内存数据保存到磁盘

Redis 是一种支持多种数据结构的开源内存键值数据库,它提供了将数据保存在磁盘上的功能,以此来保证数据的持久性。

Redis 主要提供了两种数据持久化方式:RDB(Redis Database)和 AOF(Append Only File)。

  1. RDB 持久化

    • RDB 是一种将 Redis 在某一时刻的内存快照(snapshot)保存到磁盘上的方式。
    • 可以通过配置文件来设置 Redis 定时自动保存数据,也可以手动执行 SAVEBGSAVE 命令来触发保存操作。
    • SAVE 命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕为止。
    • BGSAVE 命令会派生出一个子进程来创建 RDB 文件,父进程继续处理命令请求。
  2. AOF 持久化

    • AOF 持久化是通过保存 Redis 服务器所执行的写操作命令来记录数据库状态。
    • 开启 AOF 持久化后,Redis 会将每一个收到的写命令通过追加的方式写入到 AOF 文件的末尾。
    • 在重启 Redis 时,通过重新执行 AOF 文件中的命令来恢复数据。
    • AOF 持久化可以配置不同的同步策略,比如每秒同步、每写入一个命令就同步等,以此来平衡性能和数据安全性。

选择哪种持久化方式?

  • 如果你希望获得更好的性能,并且可以接受一定程度的数据丢失,那么可以只使用 RDB 持久化。
  • 如果你希望数据的安全性更高,那么可以同时开启 RDB 和 AOF 持久化,或者单独使用 AOF 持久化。

在实际使用中,可以根据应用的具体需求和 Redis 的运行环境来灵活选择和使用这两种持久化方式。为了更具体地讲解Redis内存数据如何保存到磁盘,我将分别通过RDB和AOF两种持久化方式的示例来进行说明。

1. RDB持久化

RDB持久化是将Redis在某一时刻的内存数据快照保存到磁盘上。以下是RDB持久化的一个示例过程:

触发方式

RDB持久化可以通过两种方式触发:

  • 自动触发:通过Redis配置文件(通常是redis.conf)中的save指令来设置。例如,save 60 10000表示在60秒内如果有10000个键发生变化,则自动触发BGSAVE命令生成RDB文件。
  • 手动触发:通过执行SAVEBGSAVE命令来手动触发。SAVE命令会阻塞Redis服务器,直到RDB文件创建完毕;而BGSAVE命令则会在后台异步执行,不会阻塞服务器。
示例步骤

假设我们配置了save 60 1(即60秒内有一个键发生变化就触发持久化),并且Redis服务器正在运行。

  1. 数据变化:在Redis中执行一些写操作,比如SET key1 value1
  2. 触发条件满足:60秒内,如果有至少一个键发生了变化(在这个例子中是key1),Redis会自动触发BGSAVE命令。
  3. BGSAVE执行:Redis会fork一个子进程来执行RDB文件的创建工作。父进程继续处理客户端请求,而子进程则负责将内存中的数据写入到临时RDB文件中。
  4. 文件替换:当子进程完成RDB文件的创建后,它会通知父进程。父进程会将旧的RDB文件替换为新的RDB文件(如果配置了的话)。
结果

最终,Redis的内存数据以快照的形式被保存在了磁盘上的RDB文件中。

当Redis服务器重启时,它会自动加载这个RDB文件来恢复内存数据。

2. AOF持久化

AOF持久化是通过保存Redis服务器所执行的写操作命令来记录数据库状态。以下是AOF持久化的一个示例过程:

开启AOF

首先,需要在Redis配置文件中设置appendonly yes来开启AOF持久化功能,并配置AOF文件的名称和保存路径(如果需要的话)。

示例步骤

假设AOF持久化已经开启,并且Redis服务器正在运行。

  1. 执行写操作:在Redis中执行一些写操作,比如SET key2 value2LPUSH mylist 1 2 3等。
  2. 命令追加:Redis会将这些写操作命令追加到AOF文件的末尾。如果配置了fsync策略(比如appendfsync everysec),则Redis会每秒将AOF缓冲区的内容同步到磁盘上。
  3. 文件增长:随着写操作的进行,AOF文件会逐渐增大。当AOF文件增长到一定程度时,Redis可能会触发AOF重写来压缩文件大小。
  4. AOF重写:AOF重写会创建一个新的AOF文件,其中只包含恢复当前数据库状态所必需的最小命令集合。重写过程中,Redis仍然可以继续处理客户端请求。
  5. 文件替换:当AOF重写完成后,Redis会用新的AOF文件替换旧的AOF文件。
结果

最终,Redis的执行过的写操作命令被保存在了磁盘上的AOF文件中。当Redis服务器重启时,它会通过重新执行AOF文件中的命令来恢复内存数据。

最后

通过以上示例,我们可以看到Redis如何通过RDB和AOF两种持久化方式将内存数据保存到磁盘上。含多个字段。

# 设置用户信息
HSET user:1 name "John Doe"
HSET user:1 age 30# 获取用户信息
HGETALL user:1
# 输出可能是:"1) "name" 2) "John Doe" 3) "age" 4) "30""

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/12839.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈单片机的gcc优化级别__以双音频信号发生器为例

IDE: CLion HOST: Windows 11 MinGW:x86_64-14.2.0-release-posix-seh-ucrt-rt_v12-rev0 GCC: arm-gnu-toolchain-13.3.rel1-mingw-w64-i686-arm-none-eabi 一、简介 gcc有多种优化级别,一般不选择的情况下&#x…

C++之继承多态

C之继承&多态 继承继承之形继承的作用域继承的构造与析构多继承菱形继承 多态多态之形final和override(C11)纯虚函数&抽象类多态的原理打印虚表(在vs2022中)多继承下的虚表菱形虚继承中埋的坑静态多态与动态多态我对虚函数和普通成员函数调用区别…

机器学习-36-对ML的思考之机器学习研究的初衷及科学研究的期望

文章目录 1 机器学习最初的样子1.1 知识工程诞生(专家系统)1.2 知识工程高潮期1.3 专家系统的瓶颈(知识获取)1.4 机器学习研究的初衷2 科学研究对机器学习的期望2.1 面向科学研究的机器学习轮廓2.2 机器学习及其应用研讨会2.3 智能信息处理系列研讨会2.4 机器学习对科学研究的重…

arm 汇编技巧

汇编标号:f表示forward, b表示backward: Here is an example: 1: branch 1f 2: branch 1b 1: branch 2f 2: branch 1b Which is the equivalent of: label_1: branch label_3 label_2: branch label_1 label_3: branch label_4 label_4: bra…

特色3D打印stm32迷你8轴双核心主板

我自己设计的3D打印机主板 1. 这是一块迷你的8轴主板, 主板尺寸为100mm*75mm, 使用一个8cm静音风扇散热足够了2. 这是一个带有保护的板子, 驱动上的gpio具有过压保护功能, 能够直接抗住24V的冲击, 意味着一个驱动炸了, 板子不烧, 并且其他的驱动也没事, 主板支持自动关机3. 8…

golang分布式缓存项目 Day2 单机并发缓存

注:该项目原作者:https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习。 支持并发读写 接下来我们使用 sync.Mutex 封装 LRU 的几个方法,使之支持并发的读写。在这之…

2024 年将 Swagger 导入 Postman 图文教程

2024 年将 Swagger 导入 Postman 图文教程

从入门到精通:hello-algo开源项目助你系统学习数据结构与算法

文章目录 前言1.关于hello-algo2.安装Docker和Docker compose3.本地部署hello-algo4. hello-algo本地访问5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 本文将探讨如何在本地环境中部署hello-algo这一算法学习必备项目,并利用cp…

SystemVerilog学习笔记(七):函数与任务

函数 函数的主要用途是编写一段可以随时调用n次的代码,只需调用函数名即可,不需要任何模拟时间来执行。函数是返回类型,仅返回函数声明中提到的单个值,如果未声明则返回一个位的值。 语法: initial begin functio…

地下水数值模拟、 地下水环评、Visual modflow Flex、Modflow

地下水数值模拟软件Visual modflow Flex实践技术应用 地下水数值模拟软件的应用,主要围绕的目前应用较为广泛的Visual Modflow Flex 6.1软件版本开展,结合具体应用场景,实例讲解软件的全流程应用过程,包括数据处理分析、数值模型…

丹摩征文活动|Llama3.1:从安装到熟练使用的全方位教程

0.前言 目前关于 Llama 3.1 的详细安装和使用指南在网络上较为分散,对于许多想要深入了解和应用该模型的人来说,缺乏一个系统、全面的指导资料。为了填补这一空白,本文应运而生。旨在为广大读者提供从 Llama 3.1 的安装到熟练使用的全方位指…

UI自动化测试|CSS元素定位实践

前言 自动化测试元素定位是指在自动化测试过程中,通过特定的方法或策略来准确识别和定位页面上的元素,以便对这些元素进行进一步的操作或断言。这些元素可以是文本框、按钮、链接、图片等HTML页面上的任何可见或不可见的组件。 在自动化测试中&#xf…

软件架构与模式分析

软件架构模式分析 软件架构模式和架构风格是两个相关但不同的概念。 软件架构模式(Software Architecture Patterns)是一种在软件工程领域广泛应用的规范化、可复用的架构设计方案。它是通过抽象和提炼出解决特定问题所需的结构、组件、关系和规则等&am…

npm完整发包流程(亲测可验证)

1. 准备工作 (1) 在npm官网上注册一个账号 (2) 注册成功之后,npm会发送一封邮件给你,点击邮件里面的链接,做确认关联操作(必需) 2. 创建自己的npm包 (…

无插件直播流媒体音视频播放器EasyPlayer.js播放器多分屏超过6路不能播放如何解决

EasyPlayer.js H5播放器,是一款能够同时支持HTTP、HTTP-FLV、HLS(m3u8)、WS、WEBRTC、FMP4视频直播与视频点播等多种协议,支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式,支持MSE、WASM、WebCodec等多种解码方…

从零开始使用YOLOv11——Yolo检测detect数据集自建格式转换为模型训练格式:20w+图片1w+类别代码测试成功

在之前的文章中记录了YOLO环境的配置安装和基本命令的一些使用,上一篇博文的地址快速链接:从零开始使用YOLOv8——环境配置与极简指令(CLI)操作:1篇文章解决—直接使用:模型部署 and 自建数据集&#xff1a…

【HAProxy06】企业级反向代理HAProxy调度算法之其他算法

HAProxy 调度算法 HAProxy通过固定参数 balance 指明对后端服务器的调度算法,该参数可以配置在listen或backend选项中。 HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据不同的参数实现静态和动态算法 相互转换。 官方文档&#xff1…

Leetcode 检测相邻递增子数组

3349. 检测相邻递增子数组 I 给你一个由 n 个整数组成的数组 nums &#xff0c;请你找出 k 的 最大值&#xff0c;使得存在 两个 相邻 且长度为 k 的 严格递增 子数组 。具体来说&#xff0c;需要检查是否存在从下标 a 和 b (a < b) 开始的 两个 子数组&#xff0c;并满…

【STL栈和队列】:高效数据结构的应用秘籍

前言&#xff1a; C 标准模板库&#xff08;STL&#xff09;为我们提供了多种容器&#xff0c;其中 stack&#xff08;栈&#xff09;和 queue&#xff08;队列&#xff09;是非常常用的两种容器。 根据之前C语言实现的栈和队列&#xff0c;&#xff08;如有遗忘&#xff0c;…

香江电器从A股到港股7年漫长上市路,收入后退停滞不前

《港湾商业观察》施子夫 9月29日&#xff0c;湖北香江电器股份有限公司&#xff08;以下简称&#xff0c;香江电器&#xff09;递表港交所引起外界关注&#xff0c;公司的独家保荐机构为国金证券。 回顾香江电器的IPO之旅&#xff0c;可以说是颇为坎坷&#xff0c;多次尝试A股…