Redis实战(二)Redis 的 RDB 配置和数据恢复
RDB 配置解释
在 redis.conf 文件中,默认有 RDB 持久化配置:
save 900 1
save 300 10
save 60 10000
复制复制失败复制成功
解释:
这些配置称为检查点。
每隔 900s,如果有至少 1 个 key发生了变更,就生成一个新的 dump.rdb 文件,这个 dump.rdb 文件就是 redis 内存中完整的数据快照,也叫做 snapshotting。
同上,每隔 300s,检查是否有 10 个key 发生了变更,或者每隔 60s,检查是否有 10000个 key 发生了变更,如果有,则生成 dump.rdb 文件。
可以配置多项检查点。
可以移除所有检查点,只需要这样配置即可:save "",或者移除所有配置项。
RDB 持久化的工作流程
(1)Redis 根据配置尝试生成 rdb 快照文件。
(2)Redis fork 一个子进程。
(3)子进程尝试将数据 dump 到一个临时的 RDB 快照文件中。
(4)完成快照后,就把临时文件替换掉之前生成的 RDB 文件。
RDB 实验
实验(1)测试 Redis 被 shutdown 时,Redis 是否会丢失数据。
首先重启 Redis,让检查点的时间窗口重置。
redis-cli shutdown
cd /etc/init.d
./redis_6379 start
ps -ef | grep redis
复制复制失败复制成功
然后往 Redis 中插入几条数据:
redis-cli
set key1 abc
set key2 222
get key1
get key2
复制复制失败复制成功
目前只设置了 2 个 key,且还没有到 900 s,所以不会触发自动生成 RDB 快照。
这个时候我们可以猜测下重启 redis 后,刚刚插入的两个 key 是否被持久化到 dump 文件中了。
我们来测试下:
重启 Redis,获取 key1 和 key2:
redis-cli shutdown
cd /etc/init.d
./redis_6379 start
ps -ef | grep redis
redis-cli
get key1
get key2
复制复制失败复制成功
会看到 Redis 重启后还是存在 key1 和 key2,并不会丢失。
另外还可以找下 dump.rdb 文件,更新时间更新为 shutdown 的时间。
结论:shutdown 时,Redis 不会丢失丢失,会将内存中的数据立即生成一份完整 RDB 快照。
实验(2)用 kill -9 直接干掉 Redis,模拟 Redis 故障
,验证数据是否会丢失。
首先插入几条新数据
redis-cli
set key3 333
set key4 444
get key3
get key4
复制复制失败复制成功
然后获取 Redis 的进程 id
ps -ef | grep redis
复制复制失败复制成功
Redis PID=1485,然后用 kill -9 干掉 Redis 进程:
kill -9 1485
复制复制失败复制成功
然后重启 Redis
cd /var/run
rm -rf redis_6379.pid
cd /etc/init.d
./redis_6379 start
复制复制失败复制成功
然后获取 key3 和 key4,发现没有这两个 key。
get key3
get key4
复制复制失败复制成功
我们也可以查看下 dump.rdb 文件的更新时间是否有改变:
如果我们想要保证减少 Redis 故障导致的数据丢失,可以通过设置一个频率更高的检查点,每 5s 检查一次,如果有至少一条数据更新,则进行 RDB 快照。如下所示的配置:
save 5 1
复制复制失败复制成功
但是如果故障正好发生在快照之前,那么变更的数据就没有生成到 RDB 文件中了。
而且生成的 RDB 的频率过高,而且变更的数据量很大的话,生成 RDB 的文件也会很大,操作 IO 的时间也会变长,长时间占用磁盘 IO 会造成性能问题。
Redis实战(二)Redis 的 RDB 配置和数据恢复的更多相关文章
- Redis实战之Redis + Jedis
用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...
- Redis实战之Redis + Jedis[转]
http://blog.csdn.net/it_man/article/details/9730605 2013-08-03 11:01 1786人阅读 评论(0) 收藏 举报 目录(?)[-] ...
- Redis系列(二):Redis的数据类型及命令操作
原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...
- C# Redis实战(二) [转]
二.Redis服务 在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下,其中redis-server.exe即为其服务端程序,双击即开始运行,如图 ...
- C# Redis实战(二)
二.Redis服务 在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下,其中redis-server.exe即为其服务端程序,双击即开始运行,如图 可以 ...
- Redis实战(二)
Redis服务 在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下,其中redis-server.exe即为其服务端程序,双击即开始运行,如图
- Redis实战总结-Redis的高可用性
在之前的博客<Redis实战总结-配置.持久化.复制>给出了一种Redis主从复制机制,简单地实现了Redis高可用.然后,如果Master服务器宕机,会导致整个Redis瘫痪,这种方式的 ...
- 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)
本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...
- 分布式缓存技术redis系列(五)——redis实战(redis与spring整合,分布式锁实现)
本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...
- Redis 实战 —— 05. Redis 其他命令简介
发布与订阅 P52 Redis 实现了发布与订阅(publish/subscribe)模式,又称 pub/sub 模式(与设计模式中的观察者模式类似).订阅者负责订阅频道,发送者负责向频道发送二进制字 ...
随机推荐
- TCP/IP协议(9): UDP(User Datagram Protocol) 协议 —— 最简单的传输层协议
TCP/IP协议(9): UDP(User Datagram Protocol) 协议 -- 最简单的传输层协议 关于用户数据报协议(User Datagram Protocol, UDP)协议 UD ...
- Connect-The-Dots
Connect-The-Dots 目录 Connect-The-Dots 1 信息收集 1.1 端口扫描 1.2 后台目录扫描 1.2.1 目录分析 2 目标服务安全检测 2.1 ftp检测 2.2 ...
- CCRD_TOC_2008年第11期
中信国健临床通讯 2008年第11期(总第24期) 目 录 脊柱关节炎 1. 一项多中心.大型.随机.双盲.对照试验证实依那西普治疗AS的疗效优于柳氮磺吡啶 Braun J, et al. ACR ...
- Apinto 网关 V0.11.1 版本发布,多协议互转,新增编码转换器,接入 Prometheus...
憋了那么久,Eolink 旗下 Apinto 开源网关再次更新啦~ 一起来看看是否有你期待的功能! 1.协议转换功能上线 之前发布的 Apinto v0.10.0 已经支持了多协议的基本功能,实现多协 ...
- asp多模块功能代码,单调用插入的case方法
function getmodule(arg) select case arg case "pinyin" aaa="123" %><!--#插入页 ...
- php连接Access数据库
最近想把一个asp的网站改成php的,无奈空间不支持mysql数据库,只好用access数据库了,但以前都是用的php+mysql,php+access数据库编程还真没有做过.感谢党,感谢cctv,感 ...
- 遗忘的pawn 创建
默认加载 pawn::staticclass; ConstructorHelpers::FClassFinder<>Pawnpath(TEXT("_C")); 然后是的 ...
- No.3.1
JavaScript是什么? JavaScript是一种运行在客户端(浏览器)的编程语言,实现人机交互效果. 作用:网页特效(监听用户的一些行为让网页作出对应的反馈) 表单验证(针对表单数据的 ...
- [GKCTF2021]RRRRSA
[GKCTF2021]RRRRSA 题目 from Crypto.Util.number import * from gmpy2 import gcd flag = b'xxxxxxxxxxxxx' ...
- shell脚本程序的撰写
一.让我们浏览一下整体步骤第一步,你要先用ll命令来列出该目录中都包含那些文件(目的是为了防止文件重名不利于查找等等).第二步 ,使用命令touch来建立一个shell脚本文件 , 后缀名为.sh : ...