Redis 是将数据存储在内存中的,如果出现断电或系统故障的时候数据就会存在丢失的现象,Redis通过将数据持久化到硬盘中来避免这个问题的出现,我们今天就来学习下 Redis 持久化。

Redis 持久化触发条件

  • 手动触发

    • save
    • bgsave
  • 自动触发
    • 配置策略
  • 系统命令
    • flushdb
    • exit

save 和 bgsave 的区别

Redis 是单线程操作的,当执行 save 命令时会阻塞住线程,阻塞时长根据数据量变化,这样就会造成 Redis 无法响应其他命令。而调用 bgsave 命令 Redis 会调用 fork 来创建一个子进程,然后子进程负责进行持久化操作,而主进程继续处理命令。

配置策略

Redis 在配置文件中设置了几个策略:

save 900 1  	 # 900秒内(15分钟),更改了1个以上的键
save 300 10 # 30秒内(5分钟)改变了10个以上的键
save 60 10000 # 60秒内改变了10000个以上的键

当满足以上任意条件时就能触发。

Redis 持久化选项

Redis 提供了两种持久化方式将数据存储到硬盘中。

一种方式叫做 RDB(Redis DataBase),在指定的时间间隔内,执行指定次数的写操作,就会触发将内存中的数据写入到硬盘中(即在指定目录下生成一个 dump.rdb 文件)。它是 Redis 默认的持久化方式。

另一种方式叫做 AOF(Append Only File),在指定的时间间隔内,执行指定次数的写操作,就会触发将写指令命令追加到硬盘中的日志文件里。

简单来说,前者是将所有数据都保存起来,在之后全量恢复。而后者是将指令以日志形式存储,在之后通过重新执行指令来还原数据。

RDB

RDB 持久化配置

以文本形式打开 redis.conf 文件,搜索关键字 SNAPSHOTTING查找,我们看依次看看 RDB 的配置:

  1. Reids 默认配置了三个保存策略,即:
save 900 1  	 # 900秒内(15分钟),更改了1个以上的键
save 300 10 # 30秒内(5分钟)改变了10个以上的键
save 60 10000 # 60秒内改变了10000个以上的键
  1. 设置保存快照操作出现错误时是否停止后续数据写入硬盘,默认为 yes。
stop-writes-on-bgsave-error yes
  1. 指定存储至本地数据库时是否压缩数据,默认是yes,redis 采用 LZF 压缩,如果为了节省 CPU 时间可以关闭该选项,但会导致数据库文件扁的巨大。
rdbcompression yes
  1. rdb 文件的校验,如果校验将避免文件格式坏掉,如果不校验将在每次操作文件时要付出校验过程的资源新能,将此参数设置为 no,将跳过校验
rdbchecksum yes
  1. 持久化文件名称
dbfilename dump.rdb
  1. 持久化文件存储路径
dir ./

实践

1)增加如下保存策略

save 1 5 # 1分钟至少更改了5个键

2)将 redis 目录下的 dump.rdb 文件删除

3)关闭 Redis 服务 ,并指定 配置文件的形式启动 Redis 服务

redis-server --service-stop
redis-server.exe redis.windows.conf
  1. 批量设置十个值,触发我们刚刚添加的策略
MSET a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 a 10

5)查询 Redis 的key

127.0.0.1:6379> keys *
1) "a"

可以看到有数据

  1. 观察 Redis 目录,发现重新生成了 dump.rdb 文件

  1. dump.rdb 文件 拷贝走,然后清除 Redis 所有数据
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty list or set)
  1. 关闭 redis 服务,可以看到 Redis 目录又生成了 dump.rdb 文件,所以可以证明 redis 正常关闭的时候也会保存dump.rdb文件。

  2. 将之前拷贝的 dump.rdb 文件覆盖到 Redis 目录下,然后重启 redis 服务,执行查询指令

127.0.0.1:6379> keys *
1) "a"

可以发现之前的删除的数据恢复成功了。

注:flushdb 命令会直接触发RDB快照,所以要在执行前先备份好 dump.rdb 文件。

AOF

Redis 默认是使用 RDB 持久化的,而 AOF 是处于禁用状态,我们也先来看看配置。

AOF 持久化配置

以文本形式打开 redis.conf 文件,搜索关键字 APPEND ONLY MODE查找,我们看依次看看 Redis 的配置:

  1. aof 默认禁用
appendonly no
  1. 文件名称
appendfilename "appendonly.aof"
  1. 保存策略
# appendfsync always
appendfsync everysec
# appendfsync no
  • always:同步持久化,每次发生数据变化会立刻写入到磁盘中。性能较差。但数据完整性比较好(慢,安全)
  • everysec:出厂默认推荐,每秒异步记录一次(默认值)
  • no:不同步
  1. AOF 策略设置为 always 或者 everysec 时,后台处理进程(后台保存或者 AOF 日志重写)会执行大量的 I/O 操作在某些 Linux 配置中会阻止过长的 fsync() 请求。注意现在没有任何修复,即使fsync 在另外一个线程进行处理。为了减缓这个问题,可以设置下面这个参数 no-appendfsync-on-rewrite 为 no
no-appendfsync-on-rewrite no
  1. 重写触发机制
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

当 AOF 文件大小是上次 rewrite 后大小的一倍且文件大于64M时触发。会自动合并指令以减少日志文件体积。

  1. Redis 启动加载 aof 文件,如果发现末尾命令不完整则自动截掉,成功加载前面正确的数据。如果设置为no,遇到此类情况,Redis启动失败,用 redis-check-aof 工具手工修复。
aof-load-truncated yes

实践

  1. 启用 aof 配置
appendonly yes
  1. 清除之前实践的数据,将 dump.rdbappendonly.aof 文件删除,然后重启服务
redis-server --service-stop
redis-server.exe redis.windows.conf

3) 输入如下命令,观察 Redis 目录是否生成 dump.rdbappendonly.aof 文件

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> MSET a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 a 10
OK

4)将生成的 dump.rdbappendonly.aof 拷贝走后,清除数据并关闭 Redis 服务

127.0.0.1:6379> flushdb
OK
  1. 将之前拷贝的 appendonly.aof 文件覆盖 Redis 目录,重启服务
127.0.0.1:6379> keys *
1) "a"

可以看到数据也恢复了。

RDB 和 AOF 的优缺点

持久化方式 优点 缺点
RDB 适合大规模的数据恢复。 1.数据的完整性和一致性不高
2.备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍哦),最后再将临时文件替换之前的备份文件。
AOF 数据的完整性和一致性更高 因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。

Redis学习总结(三)--Redis持久化的更多相关文章

  1. redis学习笔记(三)——redis的命令大全总结

    总结了一些redis五种存储类型的常用命令以及一些通用操作命令,不是很全,是在学习的时候将学到的做了个汇总,使用的时候可以查一下. 笔记写在表格里面了,不好粘贴.......后面的直接截图了..... ...

  2. redis学习教程三《发送订阅、事务、连接》

    redis学习教程三<发送订阅.事务.连接>  一:发送订阅      Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.Redi ...

  3. Redis学习笔记六:持久化实验(AOF,RDB)

    作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...

  4. 分布式缓存技术redis学习(三)——redis高级应用(主从、事务与锁、持久化)

    上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性.目录如下: 安全性设置 设置客户端操作秘密 客户 ...

  5. redis学习(三)redis持久化

    redis持久化 1.redis持久化介绍 我们知道redis性能之所以强悍,是因为redis在运行时将数据都存放在了访问效率远高于硬盘的内存之中.可是这带来了新的问题:在redis或者外部系统重启时 ...

  6. Redis学习总结(1)——数据持久化

    以前研究Redis的时候,很多东西都不太明白,理解得也不太深,现在有时间重新拾起来看看,将一些心得记录下来,希望和大家一起探讨. 一.简介 Redis是一个单线程高可用的Key-Value存储系统,和 ...

  7. 【Redis学习之七】Redis持久化

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-2.8.18 什么是持久化? 将数据从掉电易失的 ...

  8. C# Redis学习系列三:Redis配置主从

    Redis配置主从 主IP :端口      192.168.0.103 6666 从IP:端口       192.168.0.108 3333 配置从库 (1)安装服务: redis-server ...

  9. Redis学习——详解Redis配置文件(三)

    一.Redis脚本简介 在我们介绍Redis的配置文件之前,我们先来说一下Redis安装完成后生成的几个可执行文件: redis-server .redis-cli .redis-benchmark ...

随机推荐

  1. c++ 动态规划(数塔)

    c++ 动态规划(dp) 题目描述 观察下面的数塔.写一个程序查找从最高点到底部任意位置结束的路径,使路径经过数字的和最大. 每一步可以从当前点走到左下角的点,也可以到达右下角的点. 输入 5 13 ...

  2. IIS应用程序池标识(程序池账户)ApplicationPoolIdentify

    IIS中应用程序池的运行账户(标识)有以下4个选项 LocalService 本地服务 LocalSystem 本地系统 NetWorkService 网络服务 ApplicationPoolIden ...

  3. mongodb数据库常用操作的整理

    这是个人在项目中抽取的代码,自己写的utils的通用模块,使用的框架是tronado,包括了数据库的认证,以及增删改查排序,如有特别需要可以联系我或者自己扩展,刚学python不久,仅供参考,例子如下 ...

  4. Redis(五)--- Redis的持久化RDB与AOF

    一.Redis数据库 我们都知道Redis是基于内存的数据库,数据是以key-value键值对的方式存储的,那么key-value键值对是随意放在内存中的么,其实Redis的服务会创建很多的数据库空间 ...

  5. 【Unity游戏开发】不接SDK也能在游戏内拉起加QQ群操作?

    一.引子 一般在游戏进行对外测试的时候都会有一个玩家QQ群,方便玩家反馈问题.交流游戏心得等.那么为了增加玩家加QQ群的欲望,可能会在游戏里面设计一个小功能,点击一下可以直接拉起手Q加群的操作,加了Q ...

  6. java实用类总结

    1.什么是枚举类? 访问修饰符 Enum 枚举名称{}其应用上可以看做一个类去定义,如果枚举里有方法,定义的枚举常量要以':'结尾 2.应用枚举的好处? 枚举限制了范围,更加安全,如果要大量定义常量用 ...

  7. 关于STM32F103+ESP8266+阿里云过程之修改SDK支持UART和SmartConfig(四)

    设备上报状态到阿里云成功之后,还要接受来至云端下发的命令,如APP.在ESP8266接受到数据之后可将数据先进行解析,再通过自定义协议与STM32进行串口通讯,也可以将接收到的数据中的信息直接传输到U ...

  8. 前端笔记之React(五)Redux深入浅出

    一.Redux整体感知 Redux是JavaScript状态管理容器,提供了可被预测状态的状态管理容器.来自于Flux思想,Facebook基于Flux思想,在2015年推出Redux库. 中文网站: ...

  9. python 实现爬取网站下所有URL

    python3 实现爬取网站下所有URL 获取首页元素信息: 首页的URL链接获取: 遍历第一次返回的结果: 递归循环遍历: 全部代码如下: 小结: python3.6 requests && ...

  10. restapi(3)- MongoDBEngine : MongoDB Scala编程工具库

    最近刚好有同事在学习MongoDB,我们讨论过MongoDB应该置于服务器端然后通过web-service为客户端提供数据的上传下载服务.我们可以用上节讨论的respapi框架来实现针对MongoDB ...