redis持久化的方案其实是很多人接触的比较少的 , 因为相对应的数据故障不会很多 , 一次初始化的设置就能保证后续故障的全部顺利解决 。本文讲述一下该机制的主要设置方法和持久化方案的对比 , 同时也会讲述一些持久化的原理 。如果对于Redis持久化比较熟悉的希望能够给到你帮助 , 如果不熟悉的 , 你大可参考本文对你的Redis进行设置 。什么是Redis的持久化?可能很多人很少接触这个词 , 总觉的我们Redis的所有数据都是全部能够永久存储的 。然而你可能不知道的是 , Redis的数据都是在内存当中的 , 如果没有持久化策略 , 你关闭Redis或者之后 , 你的数据有可能全部都丢失了 。我们每再一次登录Redis访问上一次数据的时候 , 我们都看到了原来的数据 , 就是得益于Redis的持久化 。Redis的持久化简单说就是 , 将Redis存在内存中的值存储到可以永久存储的地方(磁盘等)
Redis的持久化方案
- RDB Redis DataBase
- AOF Append Only File
文章插图
RDB是怎么实现持久化的RDB是按照规则来触发持久化存储的 , 在我们的redis.conf中我们可以看到如下的几个配置:
save 900 1 # 900 秒内至少有一个 key 被修改(包括添加)save 300 10 # 300 秒内至少有 10 个 key 被修改save 60 10000 # 60 秒内至少有 10000 个 key 被修改
文章插图
这几个配置是不冲突的 , 只要满足任意一个都会触发 。
- RDB方式的优点
- RDB 是一个紧凑的单一文件,很方便传送到另一个远端数据中心 , 非常适用于灾难恢复 。
- 与AOF相比,在恢复大的数据集的时候 , RDB 方式会更快一些 。
- RDB方式的缺点
- RDB 方式数据没办法做到实时持久化/秒级持久化 。因为 bgsave 每次运行都要
执行 fork 操作创建子进程 , 频繁执行成本过高 。 - 在一定间隔时间做一次备份 , 所以如果 redis 意外 down 掉的话 , 就会丢失最后
一次快照之后的所有修改(数据有丢失) 。如果数据相对来说比较重要 , 希望将损失降到最小 , 则可以使用 AOF 方式进行持久化 。
如果我们都按照正常程序走的话 , 我们是很难看到没有持久化 , 或者出现持久化问题的故障现场的 。所以我们要学会持久化操作 , 或者只管看到持久化就需要手动触发持久化问题 。这里主要演示两种情况 , 一种是数据正常备份 , 一种是数据丢失 , 我们恢复备份数据 。注意这两个操作都算是危险操作 , 我们需要在操作之前进行一下设置一下Redis快照 , Redis
提供了两条命令:
- save: 在生成快照的时候会阻塞当前 Redis 服务器 , Redis 不能处理其他命令 。如果
内存中的数据比较多 , 会造成Redis长时间的阻塞 。生产环境不建议使用这个命令 。为了解决这个问题 , Redis 提供了第二种方式 。 - bgsave:执行 bgsave 时 , Redis 会在后台异步进行快照操作 , 快照同时还可以响应客户端请
求 。具体操作是 Redis 进程执行fork操作创建子进程(copy-on-write) , RDB持久化过程由子进程负责 , 完成后自动结束 。它不会记录fork之后后续的命令 。阻塞只发生在fork阶段 , 一般时间很短 。用 lastsave 命令可以查看最近一次成功生成快照的时间 。
set k1 1set k2 2set k3 3set k4 4set k5 5# 操作完成上面的步骤之后我们停止服务器 , 触发RDB的自动保存saveshutdown# 然后再次启动Redis服务redis-server redis.conf# 启动完成 , 查看我们那些刚刚保存的数据是否被持久化了keys *
执行完上面的步骤之后 , 我们可以看到我们的数据都在 , 就说明我们的触发备份是成功的 。
推荐阅读
- Redis响应严重延迟,如何解决?
- 使用Redis轻松实现秒杀系统
- 一分钟解决Github连接慢或者无法连接,亲测有效
- 一般公司或者团队是怎么进行代码开发并且部署到服务器上的?
- mongodb,redis,hbase,三者都是nosql数据库,他们的最大区别和不同定位是什么?
- Redis、传统数据库、HBase以及Hive的区别
- 聊聊Mysql索引和redis跳表
- 家里无线网络每天不定时段出现网速很慢或者直接无连接,这是怎么回事?
- Redis:缓存被我写满了,该怎么办?
- Redis底层数据结构解密