Redis持久化-RDB

news2024/9/20 22:55:21

Redis持久化-RDB

1.官方资料

在线文档 : https://redis.io/topics/persistence

2.Redis持久化方案

1.RDB(Redis DataBase)

2.AOF(Append Of File)

3.RDB是什么

在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就 Snapshot 快照,恢复时
将快照文件读到内存

4.RDB持久化流程

  • 流程图

image-20230124092624538

  • 上图说明

具体流程如下:

  1. redis 客户端执行 bgsave 命令或者自动触发 bgsave 命令;
  2. 主进程判断当前是否已经存在正在执行的子进程,如果存在,那么主进程直接返回;
  3. 如果不存在正在执行的子进程,那么就 fork 一个新的子进程进行持久化数据,fork 过程
    是阻塞的,fork 操作完成后主进程即可执行其他操作;
  4. 子进程先将数据写入到临时的 rdb 文件中,待快照数据写入完成后再原子替换旧的 rdb文件;
  5. 同时发送信号给主进程,通知主进程 rdb 持久化完成,主进程更新相关的统计信息
  • 小结
  1. 整个过程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能
  2. 如果需要进行大规模数据的恢复, 且对于数据恢复的完整性不是非常敏感,那 RDB 方式
    要比 AOF 方式更加的高效
  3. RDB 的缺点是最后一次持久化后的数据可能丢失
    -如果你是正常关闭 Redis , 仍然会进行持久化, 不会造成数据丢失
    -如果是 Redis 异常终止/宕机, 就可能造成数据丢失
    -后面在讲解快照配置 , 还会举例说明
  • Fork&Copy-On-Write(写时复制技术)

1、Fork 的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、
程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程
2、在 Linux 程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会
exec 系统调用,出于效率考虑,Linux 中引入了"写时复制技术 即: copy-on-write" ,

参考: https://blog.csdn.net/Code_beeps/article/details/92838520

3、一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生
变化时,才会将父进程的内容复制一份给子进程。

5.RDB 配置

5.1dump.rdb 文件

1.dump.rdb 文件介绍

在 redis.conf 中配置文件名称, 默认为 dump.rdb

image-20230124093334361

2.dump.rdb 文件指定保存目录配置

1、默认为 Redis 启动时命令行所在的目录下

image-20230124093414478

ps:进入到/usr/local/bin 目录下, 启动 Redis, 这个 ./ 就是 /usr/local/bin , 如果你在
/root/ 目录下启动 Redis , 那么 ./ 就是 /root/ 下了

# 这里我们先在root目录对redis进行启动,可以看到我之前操作的数据
[root@localhost ~]# pwd
/root
[root@localhost ~]# redis-server /etc/redis.conf 
[root@localhost ~]# ll
-rw-r--r--. 1 root root 123 122 09:38 dump.rdb
-rw-r--r--. 1 root root  18 326 2018 go
[root@localhost ~]# redis-server /etc/redis.conf 
[root@localhost ~]# redis-cli 
127.0.0.1:6379> keys *
1) "k6"
2) "k8"
3) "k5"

#首先需要关闭redis,新建一个llp目录,在该目录下执行启动,再次查看数据,可以看到数据时空的,
#并在该目录下重新生成了一个新的dump.rdb文件,此时该文件中是没有数据的
#当然如果我们在里面进行数据存储下次在这个目录下启动还是可以看到数据的
[root@localhost ~] mkdir llp
[root@localhost llp]# redis-server /etc/redis.conf 
[root@localhost llp]# redis-cli 
127.0.0.1:6379> keys *
(empty array)
#shutdown nosave 关闭redis不保存, shutdown save变比并保存,默认是save的
127.0.0.1:6379> shutdown 
not connected> 
[root@localhost llp]# ll
总用量 4
-rw-r--r--. 1 root root 92 124 09:43 dump.rdb

2、rdb 文件的保存路径, 也可以修改, 比如: dir “/root/”

redis默认生成dump.rdb的目录,dir ./是相对路径,如果在不同的目录启动会生成不同的dump.rdb

那么如何解决这个问题呢?

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
#默认
#dir ./     
#不论在那个目录启动redis,dump.rdb文件都在在root目录下生成
dir /root/ 

5.2相关配置&参数&操作

5.2.1 redis默认快照配置

1、配置图

image-20230124100027886

redis默认持久化机制:正常关闭redis(shutdown) 就会对数据进行持久化到dump.rbd文件

2、注意理解这个时间段的概念.

#在20秒内,有3个key变化,就进行RDB备份
save 20 3

image-20230124100225514

3、如果我们没有开启 save 的注释, 那么在退出 Redis 时, 也会进行备份, 更新 dump.db

5.2.2 save VS bsave

1、save :save 时只管保存,其它不管,全部阻塞。手动保存, 不建议。
2、bgsave:Redis 会在后台异步进行快照操作, 快照同时还可以响应客户端请求。
3、可以通过 lastsave 命令获取最后一次成功执行快照的时间(unix 时间戳) , 可以使用工
具转换https://tool.lu/timestamp/

127.0.0.1:6379> lastsave
(integer) 1674529866

5.2.3 flushall

1、执行 flushall 命令,也会产生 dump.rdb 文件, 数据为空.

2、Redis Flushall 命令用于清空整个 Redis 服务器的数据(删除所有数据库的所有 key)

127.0.0.1:6379> flushall
OK

[root@localhost ~]# ll
总用量 8
#flushall清空数据,也会对dump.rdb进行清理,使用时需要慎重一点
#dump.rdb 初始大小 92
-rw-r--r--. 1 root root 92 124 11:12 dump.rdb

5.2.4 save

1、格式:save 秒钟 写操作次数

save <seconds> <changes>

2、RDB 是整个内存的压缩过的 Snapshot,RDB 的数据结构,可以配置复合的快照触发条
件,

3、禁用: 给 save 传入空字符串, 可以看文档

# Snapshotting can be completely disabled with a single empty string argument
# as in following example:
#
# save ""

5.2.5 stop-writes-on-bgsave-error

当Redis无法写入磁盘(比如:磁盘被占满)的话,直接关掉Redis的写操作。推荐yes.

# However if you have setup your proper monitoring of the Redis server
# and persistence, you may want to disable this feature so that Redis will
# continue to work as usual even if there are problems with disk,
# permissions, and so forth.
stop-writes-on-bgsave-error yes

5.2.6 rdbcompression

# Compress string objects using LZF when dump .rdb databases?
# By default compression is enabled as it's almost always a win.
# If you want to save some CPU in the saving child set it to 'no' but
# the dataset will likely be bigger if you have compressible values or keys.
rdbcompression yes

1、对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis 会采用
LZF 算法进行压缩。
2、如果你不想消耗 CPU 来进行压缩的话,可以设置为关闭此功能, 默认 yes

5.2.7 rdbchecksum

# RDB files created with checksum disabled have a checksum of zero that will
# tell the loading code to skip the check.
#开启快照完整性检查
rdbchecksum yes

1、在存储快照后, 还可以让 redis 使用 CRC64 算法来进行数据校验,保证文件是完整的
2、但是这样做会增加大约 10%的性能消耗,如果希望获取到最大的性能提升,可以关闭
此功能, 推荐 yes

5.2.8 动态停止 RDB

1、动态停止 RDB:redis-cli config set save “”,这种方式是临时生效,redis重启之后会更具配置文件的配置来

[root@localhost ~]# redis-cli 
127.0.0.1:6379> config get dir
1) "dir"

2、说明: save 后给空值,表示禁用保存策略

5.3实例演示

1、需求: 如果 Redis 的 key 在 30 秒内, 有 5 个 key 变化, 就自动进行 RDB 备份.

编辑redis.config配置文件

save 30 5

image-20230124112455536

image-20230124112530434

image-20230124112614729

image-20230124112658821

6.RDB 备份&恢复

  • 关于 RDB 备份&恢复
  1. 说明:Redis 可以充当缓存, 对项目进行优化, 因此重要/敏感的数据建议在 Mysql
    要保存一份
  2. 从设计层面来说, Redis 的内存数据, 都是可以重新获取的(可能来自程序, 也可能来自
    Mysql)
  3. Redis 启动时, 初始化数据是从dump.rdb 来的, 这个机制.
  • 操作演示
  1. config get dir 查询 rdb 文件的目录
127.0.0.1:6379> config get dir
1) "dir"
2) "/root"
  1. 将 dump.rdb 进行备份, 如果有必要可以写 shell 脚本来定时备份,并将备份文件推送至其他服务器,这样的话会更安全一些。
[root@localhost ~]# cp dump.rdb dump.rdb.bak
[root@localhost ~]# ll
总用量 12
-rw-r--r--. 1 root root 122 124 11:23 dump.rdb
-rw-r--r--. 1 root root 122 124 11:30 dump.rdb.bak
-rw-r--r--. 1 root root  18 326 2018 go
drwxr-xr-x. 2 root root  22 124 09:43 llp
  1. 执行删库操作,或者删除备份文件
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty array)
  1. 恢复备份文件
[root@localhost ~]# mv dump.rdb.bak dump.rdb
mv:是否覆盖"dump.rdb"? y
  1. 重启redis,再次查看数据,可以看到数据又回来了
[root@localhost ~]# redis-server /etc/redis.conf 
[root@localhost ~]# redis-cli 
127.0.0.1:6379> keys *
1) "k2"
2) "k1"

7.RDB 持久化小结

1.优势

1、适合大规模的数据恢复
2、对数据完整性和一致性要求不高更适合使用
3、节省磁盘空间
4、恢复速度快

image-20230124113758293

2.劣势

1、虽然 Redis 在 fork 时使用了写时拷贝技术(Copy-On-Write), 但是如果数据庞大时还是比
较消耗性能。
2、在备份周期在一定间隔时间做一次备份,所以如果 Redis 意外 down 掉的话(如果正常
关闭 Redis, 仍然会进行 RDB 备份, 不会丢失数据), 就会丢失最后一次快照后的所有修改

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

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

相关文章

尚医通-手机登录-判断用户登录状态-用户网关整合(三十)

目录&#xff1a; &#xff08;1&#xff09;前台用户系统-手机登录-前端整合 &#xff08;2&#xff09;全局的登录事件-判断登录状态 &#xff08;3&#xff09;登录注册-用户认证和网关整合 &#xff08;1&#xff09;前台用户系统-手机登录-前端整合 service-user模块的配…

图论(入门版)

目录 1 向、权 2 最小生成树 2.1 Prim算法 2.2 Kruskal算法 3 最大流问题 3.1 Naive算法 3.2 Ford—Fulkerson算法 3.3 Edmonds—Karp算法 3.4 Dinic算法 4 最小割问题 5 二部图 5.1 判断是否是二部图的方法 5.2 匈牙利算法&#xff08;最小匹配问题&a…

跳跃表,也称跳表

跳表是Redis五种数据结构中有序集合Zset的底层实现 可以看成多个有序链表 链表相较于数组删除和插入的效率要高很多&#xff08;改变指针指向就行&#xff09; 但是在查找的时候跟数组比起来&#xff0c;速度就比较慢了&#xff0c;因为链表需要从头开始遍历 为了改变这个查找…

索宝蛋白冲刺A股上市:计划募资5.5亿元,复星等为其股东

近日&#xff0c;宁波索宝蛋白科技股份有限公司&#xff08;下称“索宝蛋白”&#xff09;预披露更新招股书&#xff0c;准备在上海证券交易所主板上市。据贝多财经了解&#xff0c;索宝蛋白曾于2022年7月1日提交招股书&#xff0c;此次招股书更新了截至2022年6月30日的财务数据…

Java判断结构练习

目录 1.倍数 2.零食 3.区间 4.三角形 5.游戏时间 6.加薪 7.动物 8.选择练习1 9.DDD 10.点的坐标 11.三角形类型 12.游戏时间2 13.税 14.简单排序 15.一元二次方程公式 16.平均数3 1.倍数 读取两个正整数值 A 和 B。 如果其中一个是另一个的整数倍&#xff0c…

树状数组(代码模板和原理详解)

树状数组代码模板 普通数组&#xff1a;求前缀和&#xff1a; O(n)O(n)O(n)&#xff0c;修改&#xff1a;O(1)O(1)O(1) 前缀和数组&#xff1a;求前缀和&#xff1a;O(1)O(1)O(1)&#xff0c;修改&#xff1a;O(n)O(n)O(n) 鱼和熊掌不可兼得&#xff0c;当我们同时需要对一个…

NEZUKO: 1——202201152003

NEZUKO: 1——202201152003 About Release Back to the Top Name: nezuko: 1Date release: 21 Aug 2019Author: yunaranyancatSeries: nezuko Download Back to the Top Please remember that VulnHub is a free community resource so we are unable to check the machin…

在Java中使用堆排序求解TopK问题

在Java中使用堆排序求解TopK问题 1. 问题描述 给定一个很大的数组&#xff0c;长度100w&#xff0c;求第k大的数是多少&#xff1f; 这个问题是一个很经典的问题&#xff0c;如果采用传统方式&#xff0c;即现排序&#xff0c;然后找到第k个数&#xff0c;对于数据量很大的时…

Knowledge-based-BERT(一)

多种预训练任务解决NLP处理SMILES的多种弊端&#xff0c;代码&#xff1a;Knowledge-based-BERT&#xff0c;原文&#xff1a;Knowledge-based BERT: a method to extract molecular features like computational chemists&#xff0c;代码解析从K_BERT_pretrain开始。模型框架…

Tkinter的Listbox控件

Tkinter的Listbox控件是个选项框&#xff0c;主要是用来在给定的选项中选择一个 使用方法 创建选项框Listbox 和其他控件的创建方法一样&#xff0c;直接创建即可&#xff0c;命名为Lb Lbtk.Listbox(root) Lb.pack() 在选项框中加入选项 可以边创建边添加&#xff0c;即利…

【C#】WPF实现经典纸牌游戏,适合新手入门

文章目录1 纸牌类2 布局3 初始化4 事件点击牌堆拖动牌的去留源代码1 纸牌类 之所以产生这个无聊至极的念头&#xff0c;是因为发现Unicode中竟然有这种字符。。。 黑桃&#x1f0a1; &#x1f0a2; &#x1f0a3; &#x1f0a4; &#x1f0a5; &#x1f0a6; &#x1f0a7; &…

【设计模式】结构型模式·外观模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01;> 学习汇总入口 一.概述 外观&#xff08;Facade&#xff09;模式是七大设计原则“迪米特法则…

谷粒商城-高级篇-Day12-性能压测和缓存

文章目录性能优化nginx动静分离优化三级分类的获取&#xff08;优化业务&#xff09;分布式缓存整合redis高并发下的缓存失效问题缓存穿透缓存雪崩缓存击穿解决这些问题分布式锁Redisson可重入锁&#xff08;Reentrant Lock&#xff09;指定过期时间读写锁闭锁信号量使用Redssi…

Python实现一个简易的CLI翻译程序

Python实现一个简易的CLI翻译程序Python百度翻译API实现一个简易的CLI翻译程序获取百度翻译API编写一个简单的Python程序Python百度翻译API实现一个简易的CLI翻译程序 之前翻译用的linux上的golddict,每次翻译都很慢。。。 所以想写一个简单快速的翻译命令行翻译软件 获取百度…

Allegro如何自动高亮不等长的网络操作指导

Allegro如何自动高亮不等长的网络操作指导 在做PCB设计的时候,时常需要要做等长,Allegro可以自动高亮一组内不等长的网络,可以直观的看到哪些网络长度是不满足的,类似下图 绿色的是通过的,红色是长度不足的,粉色是超长的 具体操作如下 选择Route-Timing Vision出现optio…

Springboot359的医院病历管理系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 2 第3章 系统分析 3 3.1 需求分析 3 3.2 系统可行性分析 4 3.2.1技术可行性&#xff1a;技术背景 4 3.2.2经济…

Ubiquiti MAC Address Changer 3.0 Crack

Ubiquiti MAC Address Changer&#xff0c;目前mac address changer的版本有很多&#xff0c;本次发布的是V3版本&#xff0c;这是一款功能非常强大的修改网卡mac地址软件&#xff0c;基本上所有的网卡MAC地址都支持修改&#xff0c;包括虚拟机和TeamViewer软件都是支持的。 Ea…

5、基本数据类型

目录 一、整数类型 二、浮点类型 三、字符类型 四、布尔类型 一、整数类型 整数类型用来存储整数数值&#xff0c;即没有小数部分的数值。可以是正数&#xff0c;也可以是负数。整 型数据在Java程序中有3种表示形式&#xff0c;分别为十进制、八进制和十六进制。 1.十进…

2.4.4 数值类型的转换

文章目录1.运算时的自转2.运算时的强转3.强转时的精度丢失问题1.运算时的自转 不同数字类型之间的大小关系如下&#xff1a;double > float > long > int > char, short,byte 自转&#xff1a;小类型的数据可以直接赋值给大类型的变量&#xff1b; byte short c…

Linux(五)创建一个miniShell

前情提要&#xff1a;掌握进程控制中的进程创建、进程终止、进程等待、进程替换。可以参考下方博文 LInux&#xff08;四&#xff09;进程控制&#xff08;创建、终止、等待、替换&#xff09; 了解strtok函数的使用 正文&#xff1a; 目录 Shell是什么&#xff1f; 如何…