Redis 持久化方式

Stella981
• 阅读 512

针对Redis的话题估计有些读者已经开始反感了,昨天还是有一些读者困惑,这就具体讲述下Redis持久化方式-RDB的实现方式~

01

 触发时机

手动触发:

  • save: 阻塞当前 Redis 服务器, 直到 RDB 过程完成为止, 对于内存比较大的实例会造成长时间阻塞, 线上环境不建议使用

  • bgsave: Redis 进程执行 fork 操作创建子进程, RDB 持久化过程由子进程负责, 完成后自动结束。阻塞只发生在 fork 阶段, 一般时间很短

自动触发 RDB 的持久化机制, 例如以下场景:

  • 使用 save 相关配置, 如 “save m n”。表示 m 秒内数据集存在 n 次修改时, 自动触发 bgsave。

  • 如果从节点执行全量复制操作, 主节点自动执行 bgsave 生成RDB文件并发送给从节点, 更多细节见6.3节介绍的复制原理。

  • 执行 debug reload 命令重新加载 Redis 时, 也会自动触发 save 操作。(不清楚是 save 还是 bgsave)

  • 默认情况下执行 shutdown 命令时, 如果没有开启 AOF 持久化功能则自动执行 bgsave。

02

 流程说明

Redis 持久化方式

03

 RDB的文件处理

保存: RDB 文件保存在 dir 配置指定的目录下, 文件名通过 dbfilename 配置指定。可以通过执行 config set dir {newDir}config set dbfilename {newFileName} 运行期动态执行, 当下次运行时 RDB 文件会保存到新目录。

压缩: Redis 默认采用 LZF 算法对生成的 RDB 文件做压缩处理, 压缩后的文件远远小于内存大小, 默认开启, 可以通过参数 config set rdbcompression {yes|no} 动态修改。

校验: 如果 Redis 加载损坏 的RDB 文件时拒绝启动, 并打印如下日志:

# Short read or OOM loading DB. Unrecoverable error, aborting now.

这时可以使用 Redis 提供的 redis-check-dump 工具检测 RDB 文件并获取对应的错误报告。

04

 RDB的优缺点

优点:

  • RDB 是一个紧凑压缩的二进制文件, 代表 Redis 在某个时间点上的数据快照。非常适用于备份, 全量复制等场景

  • Redis 加载 RDB 恢复数据远远快于 AOF 的方式

缺点:

  • RDB 方式数据没办法做到实时持久化/秒级持久化。因为 bgsave 每次运行都要执行 fork 操作创建子进程, 属于重量级操作, 频繁执行成本过高

  • RDB 文件使用特定二进制格式保存, Redis 版本演进过程中有多个格式的 RDB 版本, 存在老版本 Redis 服务无法兼容新版 RDB 格式的问题

- END -

针对Redis的持久化方式原先有整理过一期视频

往期推荐

[

如何提高你的代码设计能力?

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3OTc1MDM1Mg%3D%3D%26mid%3D2247493387%26idx%3D1%26sn%3D2e0793e9333fef0b083cb31424b71df7%26chksm%3Dfd63f7b4ca147ea272ef73b8766068282acd1849c7ca1c43e2bffd74c1c42d38bb6759cc925d%26scene%3D21%23wechat_redirect)

[

什么是存储过程,在实际项目中用得多么?

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3OTc1MDM1Mg%3D%3D%26mid%3D2247493138%26idx%3D1%26sn%3Ddb8ad5e787ef93be7ba4304c51928891%26chksm%3Dfd63f6adca147fbb522b00f7fcd661d5051fe1c35f7c43d94c75b59d4a07360e6082a0751f9a%26scene%3D21%23wechat_redirect)

[

Redis主从同步与故障切换,有哪些坑?

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3OTc1MDM1Mg%3D%3D%26mid%3D2247493021%26idx%3D1%26sn%3D162ff38221f54424e39a9b28a2434991%26chksm%3Dfd63f522ca147c34bfacaaf3a51cacfd246b7268d4c1fe7304cb3dde4d2bdbee971fc220bb46%26scene%3D21%23wechat_redirect)

[

怎么能避免写出慢SQL?

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3OTc1MDM1Mg%3D%3D%26mid%3D2247492933%26idx%3D1%26sn%3D23f3519f6041f12b900b490c7b0bbf34%26chksm%3Dfd63f5faca147cec8dff49cfde512083f2e451771159e59a49db8c27c9d2974814804102462b%26scene%3D21%23wechat_redirect)

[

如何防止Redis脑裂导致数据丢失?

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3OTc1MDM1Mg%3D%3D%26mid%3D2247492793%26idx%3D1%26sn%3D2dcc268eb5ede00699a4a2fe99b705e4%26chksm%3Dfd63f406ca147d104b9c6a806c9c1242acbdbadd3d5028a0b268aac83aeadbc731d65653bee7%26scene%3D21%23wechat_redirect)

[

一个几乎每个系统必踩的坑儿:访问数据库超时

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3OTc1MDM1Mg%3D%3D%26mid%3D2247492745%26idx%3D1%26sn%3Dc9caa6056d282c6ce9796f9c33c3189b%26chksm%3Dfd63f436ca147d209474bcbb5570235f18f405174af8f02df76762508dd2b61f1d0aa5a8b3a5%26scene%3D21%23wechat_redirect)

Redis 持久化方式

本文分享自微信公众号 - 码农架构(iByteCoding)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
2年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
2年前
Redis——持久化数据
Redis被称为是内存数据库,那是因为它会将其所有数据存储在内存里,因此Redis具有强劲的速度性能,但是,也正因为数据存储在内存中,当Redis重启后,所有存储在内存的数据就会丢失。为了使得数据持久化,Redis提供了两种方式:RDB方式和AOF方式。一、RDB方式RDB方式的持久化是通过快照(snapshotting)完成的,
Stella981 Stella981
2年前
Redis持久化问题定位与优化技巧
今天主要分享继Redis持久化方式RDB、AOF之后的一些常用的Redis问题定位于优化方式。Redis持久化方式RDB(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3OTc1MDM1Mg%3D%3D%
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
子非鱼 子非鱼
1年前
Redis高级
第一章Redis的持久化由于redis是一个内存数据库,所有的数据都是保存在内存当中的,内存当中的数据极易丢失,所以redis的数据持久化就显得尤为重要,在redis当中,提供了两种数据持久化的方式,分别为RDB以及AOF,且Redis默认开启的数据持久化方式为RDB方式。1、RDB持久化方案Redis会定期保存数据快照至一个rbd文件中,并在启动时自动
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这