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重写

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些关于 Redis 持久的可能面试问题: 1. Redis持久有哪些方式? Redis持久有两种方式,一种是 RDB 持久,一种是 AOF 持久。 2. RDB 持久和 AOF 持久有什么区别? RDB 持久是将 Redis 在内存中的数据快照保存到磁盘上,而 AOF 持久则是将 Redis 执行的每条写命令记录到磁盘上。RDB 持久可以节约磁盘空间,但可能会丢失最近的一些数据,而 AOF 持久可以保证数据不会丢失,但可能会占用更多的磁盘空间和写入时间。 3. Redis持久机制是如何保证数据一致性的? Redis持久机制可以通过在每次写操作后立即同步到磁盘,或者设置定期同步时间来保证数据一致性。 4. Redis持久可以在运行时进行吗? 可以,Redis持久可以在运行时进行配置和切换,例如可以在运行时从 RDB 切换到 AOF 持久,或者从 AOF 切换到 RDB 持久。 5. Redis持久会对性能产生影响吗? 会,Redis持久会增加磁盘 I/O 开销,可能会对写入性能产生一定的影响,但可以通过合理的配置来平衡性能和数据一致性。 6. Redis持久可以与 Redis 集群一起使用吗? 可以,Redis持久可以与 Redis 集群一起使用,但需要注意配置文件的设置和数据同步的策略。 总之,Redis持久是保证数据一致性和可靠性的重要手段,需要根据具体的业务需求和性能要求来选择合适的持久方式,并进行合理的配置和优。在面试中,还需要了解 Redis 持久的原理、机制、优缺点、与集群的结合等方面的知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值