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 会造成性能问题。

最新文章

  1. Listview的使用
  2. oracle导入导出小记
  3. [LeetCode] Best Meeting Point
  4. redis的主从复制部署和使用
  5. openwrt的路由器重置root密码
  6. Nginx 下无法读取session 导致 thinkphp验证码错误
  7. Java Day 10
  8. PHP 获取网页301|302真实地址
  9. switch vpn 配置
  10. webstorm 如何配置git
  11. window.location.href("url") 无法在chrome和Firefoxz中使用
  12. 如何让局域网内的其他电脑访问本机的mysql
  13. MongoDB数据库文档操作
  14. Java栈与堆 (转)
  15. Mybatis与Ibatis比较
  16. 如何在自定义组件中使用v-model
  17. cURL error 60: SSL certificate problem: unable to get local issuer
  18. vue环境搭建+vscode
  19. mybatis多数据源报错
  20. 十行代码--用python写一个USB病毒 (知乎 DeepWeaver)

热门文章

  1. 微信小程序-【转发好友】以及中文标题乱码问题解决
  2. Solon v2.1.4 发布。支持 java、kotlin、groovy!
  3. LG P3768 简单的数学题
  4. 单例 Bean 的线程安全问题
  5. [EULAR文摘] 超声对已获临床低活动度RA患者病情复发的预测
  6. 解决.Net Core3.0 修改cshtml代码之后必须重新生成才可以看到效果
  7. 解决veture和eslint冲突的问题
  8. PostgresSQL用returning实现mysql的last_insert_id
  9. cowtransfer(奶牛快传)自动上传文件脚本—流程分析
  10. 如何设置QGraphicsItem线宽不随QGraphicsView缩放而变小或变大