Redis 持久化

redis 持久化

redis提供了不同级别的持久化方式:一种是RDB,一种是AOF

 

RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)

 

AOF持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF文件中的命令全部以Redis协议的格式来保存,新命令会被追加到文件的末尾。Redis还可以在后台对AOF文件进行重写(rewrite),使得AOF文件的体积不会超出保存数据集状态所需的实际大小。

 

redis还可以同时使用AOF持久化和RDB持久化。在这种情况下,当redis重启时,他会优先使用AOF文件来还原数据集,因为AOF文件保存的数据集通常比RDB文件所保存的数据集更完整。只有当AOF持久化功能处于关闭状态时,服务器才会使用RDB文件还原数据库状态

 

RDB持久化

RDB持久化是将内存中的数据库状态保存到硬盘上,可以手动执行也可以在redis.conf中配置,定期执行

 

数据库状态是指非空数据库及数据库中的键值对

 

RDB持久化所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成的RDB文件时的数据库状态

 

RDB文件的创建与载入

有两个命令可以用于生成RDB文件:

  • SAVE : SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求。
  • BGSAVE : 派生一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求。(此时会拒绝客户端发送的save和bgsave)

注意:BGSAVE与BGREWRITEAOF不能同时执行

  • 如果BGSAVE正在执行,客户端发送的BGREWRITEAOF会被延迟到BGSAVE命令执行完毕之后执行
  • 如果BGREWRITEAOF命令正在执行,那么客户端发送的BGSAVE命令会被服务器拒绝

RDB文件的载入是由服务器启动时自动执行的,没有专门用于载入RDB文件的命令,如图

配置redis.conf

  1.  

################################ 快照 #################################

  1. #
  2. # Save the DB on disk:保存数据库到磁盘
  3. #
  4. # save <秒> <更新>
  5. #
  6. # 如果指定的秒数和数据库写操作次数都满足了就将数据库保存。
  7. #
  8. # 下面是保存操作的实例:
  9. # 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)
  10. # 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化)
  11. # 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)
  12. #
  13. # 注释:注释掉“save”这一行配置项就可以让保存数据库功能失效。
  14. #
  15. # 你也可以通过增加一个只有一个空字符串的配置项(如下面的实例)来去掉前面的“save”配置。
  16. #
  17. # save ""
  18.  
  19. save 900 1
  20. save 300 10
  21. save 60 10000
  22. # 900秒内至少修改1次 300秒至少修改10次 60秒至少10000次
  23. #在默认情况下,如果RDB快照持久化操作被激活(至少一个条件被激活)并且持久化操作失败,Redis则会停止接受更新操作。
  24. #这样会让用户了解到数据没有被正确的存储到磁盘上。否则没人会注意到这个问题,可能会造成灾难。
  25. #
  26. #如果后台存储(持久化)操作进程再次工作,Redis会自动允许更新操作。
  27. #
  28. #然而,如果你已经恰当的配置了对Redis服务器的监视和备份,你也许想关掉这项功能。
  29. #如此一来即使后台保存操作出错,redis也仍然可以继续像平常一样工作。
  30. stop-writes-on-bgsave-error yes
  31.  
  32. #是否在导出.rdb数据库文件的时候采用LZF压缩字符串和对象?
  33. #默认情况下总是设置成‘yes’, 他看起来是一把双刃剑。
  34. #如果你想在存储的子进程中节省一些CPU就设置成'no',
  35. #但是这样如果你的kye/value是可压缩的,你的到处数据接就会很大。
  36. rdbcompression yes
  37.  
  38. #从版本RDB版本5开始,一个CRC64的校验就被放在了文件末尾。
  39. #这会让格式更加耐攻击,但是当存储或者加载rbd文件的时候会有一个10%左右的性能下降,
  40. #所以,为了达到性能的最大化,你可以关掉这个配置项。
  41. #
  42. #没有校验的RDB文件会有一个0校验位,来告诉加载代码跳过校验检查。
  43. rdbchecksum yes
  44.  
  45. # 导出数据库的文件名称
  46. dbfilename dump.rdb
  47.  
  48. # 工作目录
  49. #
  50. # 导出的数据库会被写入这个目录,文件名就是上面'dbfilename'配置项指定的文件名。
  51. #
  52. # 只增的文件也会在这个目录创建(这句话没看明白)
  53. #
  54. # 注意你一定要在这个配置一个工作目录,而不是文件名称。
  55. dir /opt/redis-2.6.10/data

 

AOF持久化

AOF持久化是通过保存redis服务器所执行的写命令来记录数据库状态的

 

 

AOF配置

 

AOF持久化,默认是关闭的,默认是打开RDB持久化

appendonly yes,可以打开AOF持久化机制,在生产环境里面,一般来说AOF都是要打开的,除非你说随便丢个几分钟的数据也无所谓

AOF,append only file。

appendonly no

配置文件中的appendonly修改为yes。开启AOF持久化后,你所执行的每一条指令,都会被记录到appendonly.aof文件中。但事实上,并不会立即将命令写入到硬盘文件中,而是写入到硬盘缓存,在接下来的策略中,配置多久来从硬盘缓存写入到硬盘文件。所以在一定程度一定条件下,还是会有数据丢失,不过你可以大大减少数据损失。

AOF保存模式

#appendfsync always

appendfsync everysec

#appendfsync no

 

这里是配置AOF持久化的策略。redis默认使用everysec,就是说每秒持久化一次,而always则是每次操作都会立即写入aof文件中。而no则是不主动进行同步操作,是默认30s一次。当然always一定是效率最低的,个人认为everysec就够用了,数据安全性能又高。

Redis也允许我们同时使用两种方式,再重启redis后会从aof中恢复数据,因为aof比rdb数据损失小。

模式

WRITE 是否阻塞?

SAVE 是否阻塞?

停机时丢失的数据量

AOF_FSYNC_NO

阻塞

阻塞

操作系统最后一次对 AOF 文件触发 SAVE 操作之后的数据。

AOF_FSYNC_EVERYSEC

阻塞

不阻塞

一般情况下不超过 2 秒钟的数据。

AOF_FSYNC_ALWAYS

阻塞

阻塞

最多只丢失一个命令的数据。

AOF重写

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值