redis的持久化操作
2017-12-05 16:55
267 查看
配置持久化
redis的持久化的方式有两种1. 使用rdb快照的方法进行吃就好
2. 使用aof 日志追加的方式进行持久化
使用rdb快照的方法进行持久化
什么是快照:快照: 是照内存的 , 直接内存中的数据 进行快照, 数据格式照搬过来, 直接放到磁盘上
可以理解成就是直接创建了一个内存镜像, 直接写入到了硬盘. 下次断点直接把这个镜像 放回到内存中就完成了 恢复了, 恢复的速度比较快
rdb方式的持久化是通过快照完成的,当符合一定条件时redis会自动将内存中的所有数据执行快照操作并存储到硬盘上。默认存储在dump.rdb文件中。(文件名在配置文件中dbfilename)
Redis自动实现快照的过程
redis使用fork函数复制一份当前进程的副本(子进程)
父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件
当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成。
注意:
redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的.这就使得我们可以通过定时备份RDB文件来实现redis数据库的备份
RDB文件是经过压缩的二进制文件,占用的空间会小于内存中的数据,更加利于传输。
手动执行save或者bgsave命令让redis执行快照。
两个命令的区别在于,
save是由主进程进行快照操作,会阻塞其它请求。b
bgsave是由redis执行fork函数复制出一个子进程来进行快照操作。
rbd 快照的配置选项:
save 900 1 # 在900秒内,有1条写入,则产生快照 save 300 1000 # 如果300秒内有1000次写入,则产生快照 save 60 10000 # 如果60秒内有10000次写入,则产生快照 # (这3个选项都屏蔽,则rdb禁用) Rdb 的备份 会fork出一个子进程来完成数据的备份, 创建出一个新的进程去工作, 不会阻碍主进程继续接受命令执行命令 stop-writes-on-bgsave-error yes # 后台备份进程出错时,主进程停不停止写入? rdbcompression yes # 导出的rdb文件是否压缩 Rdbchecksum yes # 导入rbd恢复时数据时,要不要检验rdb的完整性 dbfilename dump.rdb #导出来的rdb文件名 dir /usr/data/redis_backup #rdb的放置路径 注意文件夹路径一定要存在的
使用AOF日志增加的方式进行持久化
采用追加的方式来进行简单的原理图:
主程序在执行写入的操作, 后台程序执行写入到磁盘的操作, 这样不影响主程序接受客户端发送来的命令
就是把发生的写入命令, 逐条的写入到日志文件中, 保存在磁盘上, 同样有三种频率可以选择, 来进行
默认情况下redis没有开启aof,可以通过参数appendonly参数开启
aof文件的保存位置和rdb文件的位置相同,都是dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改
AOF的配置方式, 主要的几个配置
appendonly yes# 是否打开 aof日志功能 appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢 appendfsync everysec # 折衷方案,每秒写1次(一般选择这个, 默认的也是这个选项) appendfsync no # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof. 同步频率低,速度快, appendfilename "appendonly.aof" # 默认的aof日志文件的名称 no-appendfsync-on-rewrite yes: # 正在导出rdb快照的过程中,要不要停止同步aof auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写 auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写 # 为什么要进行重写的操作 重写后可以大大的降低aof 文件的大小, 因为我们在操作redis的时候, 可能是对一个键操作了多次, 但是我们需要的最终结果是最后一次的操作, 前面的就没什么用了, 但是还是保存在redis的日志文件中, 进行重写就是把内存中的数据再次逆化成指令,重写的写入到aof 中 这个时候, 就没有多于的指令了, 可以大大的减少aof文件的大小
两种持久化的区别:
采用rbd快照的形式的情况下, 每次的快照形成的时间, 是固定的, 如果在这次快照已经形成后, 到下一次快照形成前, 这个期间服务器出现了问题, 那么这期间的数据就会丢失了, 就是这段时间的操作
如果使用aof的话可以配置不同的频率的保存形式, 为了减少不必要的操作, 一般采用每秒写入一次, 这样如果服务器出现问题, 那么丢失也就是这一秒的数据, 数据量就少了很多. 具体的采用那种方式, 可以按照自己的业务需求来进行选择
当rdb文件和 aof同事存在的时候, 会优先采用aof 来进行恢复 因为aof方式所保存的数据通常是最完整的。如果aof文件丢失了,则启动之后数据库内容为空。
恢复rdb和aof 的时候, 谁的速度比较快
rbd 比较快, 因为rdb是数据的一个内存快照, 恢复的时候, 直接载入到内存中就可以了, 而aof是命令, 需要进行逐条的写入到内存中, 进行执行.
rdb的缺陷
redis服务端的命令
redis 127.0.0.1:6380> time ,显示服务器时间 , 时间戳(秒), 微秒数 1) "1375270361" 2) "504511" redis 127.0.0.1:6380> dbsize // 当前数据库的key的数量 (integer) 2 redis 127.0.0.1:6380> select 2 # 选择其他的数据库 这里是第3个 默认的是从0开始的 OK redis 127.0.0.1:6380[2]> dbsize (integer) 0 BGREWRITEAOF #后台进程重写AOF BGSAVE #后台保存rdb快照 SAVE #保存rdb快照 LASTSAVE #上次保存时间 Flushall #清空所有库所有键 Flushdb #清空当前库所有键 Shotdown [save/nosave] # 关闭redis服务, 后面的参数是保存还是不保存
注: 如果不小心运行了flushall, 立即 shutdown nosave ,关闭服务器
然后 手工编辑aof文件, 去掉文件中的 “flushall ”相关行, 然后开启服务器,就可以导入回原来数据.
如果,flushall之后,系统恰好bgrewriteaof了,那么aof就清空了,数据丢失
相关文章推荐
- Redis操作及持久化分析
- redis学习四,redis的持久化操作
- Spring Redis(7)Redis持久化查询、过期、集群操作
- Redis中的持久化操作
- Redis的持久化操作
- Redis安装、配置、操作、持久化、主从、phpredis扩展安装使用详解之安装配置
- Redis中的持久化操作
- Redis安装、配置、操作、持久化、主从、phpredis扩展安装使用详解之操作使用
- redis持久化操作
- 07_NoSQL数据库之Redis数据库:Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存
- 07_NoSQL数据库之Redis数据库:Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存
- Redis系列-事务处理、持久化操作、pub_sub、虚拟内存
- redis(五) 高级应用(事务处理,持久化操作,pub_sub、虚拟内存)
- NoSQL数据库之Redis数据库管理六(Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存)
- Redis安装、配置、操作、持久化、主从、phpredis扩展安装使用详解之持久化与主从
- redis学习记录(redis的持久化操作、基于java的jedis操作)
- Redis 笔记与总结6 Redis 高级应用之 事务处理、持久化操作、pub_sub、虚拟内存
- NoSQL数据库之Redis数据库管理六 (Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存)
- redis学习系列(四)--redis的AOF持久化深入理解各种操作和相关实验
- 【redis篇】redis持久化操作