前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis数据持久化

Redis数据持久化

作者头像
Autooooooo
发布2020-11-09 10:01:57
6770
发布2020-11-09 10:01:57
举报
文章被收录于专栏:Coxhuang

Redis持久化

#1 持久化方式

Redis提供了将数据定期自动持久化至硬盘的能力,包括RDB和AOF两种方案,两种方案分别有其长处和短板,可以配合起来同时运行,确保数据的稳定性。

  • RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照
  • AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
  • Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。

#1.1 RDB

Redis会定期保存数据快照至一个rbd文件中,并在启动时自动加载rdb文件,恢复之前保存的数据

# 配置
  • 方式一 :

客户端直接通过命令BGSAVE或者SAVE来创建一个快照

BGSAVE是通过redis调用fork来创建一个子进程,然后子进程负责将快照写入磁盘,而父进程仍然继续处理命令。

SAVE是在没有足够的内存空间去执行BGSAVE或者无所谓等待的时候。执行SAVE命令过程中,redis不在响应任何其他命令。

  • 方式二(常用) :

在redis.conf中设置save配置选项

代码语言:javascript
复制
save [seconds] [changes]
# save 60 100

会让Redis每60秒检查一次数据变更情况,如果发生了100次或以上的数据变更,则进行RDB快照保存。可以配置多条save指令,让Redis执行多级的快照保存策略。Redis默认开启RDB快照。

注意:

  • 当Redis通过shutdown命令关闭服务器请求时,会执行SAVE命令创建一个快照,如果使用kill -9 PID将不会创建快照

#1.2 AOF

采用AOF持久方式时,Redis会把每一个写请求都记录在一个日志文件里。在Redis重启时,会把AOF文件中记录的所有写操作顺序执行一遍,确保数据恢复到最新。

# 配置

AOF默认是关闭的

代码语言:javascript
复制
appendonly yes

随着AOF不断地记录写操作日志,因为所有的操作都会记录,所以必定会出现一些无用的日志。大量无用的日志会让AOF文件过大,也会让数据恢复的时间过长。不过Redis提供了AOF rewrite功能,可以重写AOF文件,只保留能够把数据恢复到最新状态的最小写操作集。

AOF rewrite可以通过BGREWRITEAOF命令触发,也可以配置Redis定期自动进行:

代码语言:javascript
复制
auto-aof-rewrite-percentage
100auto-aof-rewrite-min-size 64mb

上面两行配置的含义是,Redis在每次AOF rewrite时,会记录完成rewrite后的AOF日志大小,当AOF日志大小在该基础上增长了100%后,自动进行AOF rewrite。同时如果增长的大小没有达到64mb,则不会进行rewrite。

代码语言:javascript
复制
# 在日志进行BGREWRITEAOF时,如果设置为yes表示新写操作不进行同步fsync,只是暂存在缓冲区里,避免造成磁盘IO操作冲突,等重写完成后在写入。redis中默认为no  
no-appendfsync-on-rewrite no   
# 当前AOF文件大小是上次日志重写时的AOF文件大小两倍时,发生BGREWRITEAOF操作。  
auto-aof-rewrite-percentage 100  
#当前AOF文件执行BGREWRITEAOF命令的最小值,避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEAOF。  
auto-aof-rewrite-min-size 64mb  
# Redis再恢复时,忽略最后一条可能存在问题的指令(因为最后一条指令可能存在问题,比如写一半时突然断电了)
aof-load-truncated yes
#Redis4.0新增RDB-AOF混合持久化格式,在开启了这个功能之后,AOF重写产生的文件将同时包含RDB格式的内容和AOF格式的内容,其中RDB格式的内容用于记录已有的数据,而AOF格式的内存则用于记录最近发生了变化的数据,这样Redis就可以同时兼有RDB持久化和AOF持久化的优点(既能够快速地生成重写文件,也能够在出现问题时,快速地载入数据)。
aof-use-rdb-preamble no

#1.3 比较

RDB与AOF同时开启 默认先加载AOF的配置文件,因此需要根据具体情况使用,4.0+的可以使用RDB-AOF混合持久化格式

#2 测试

小坑

  • 修改redis配置文件redis.con后,启动redis-server时,一定要带上修改后的redis.conf,否则配置文件不生效
代码语言:javascript
复制
# 原来启动redis
./redis-server
代码语言:javascript
复制
# 修改配置文件后启动redis,带上你的redis.conf的绝对路径
./redis-server /path/to/redis.conf 

#2.1 RDB (默认开启)

# RDB开启测试(默认开启)

往redis写入数据,重启后redis中的数据还在



# RDB关闭

关闭RDB有两种方式:

  • 修改配置文件redis.conf
代码语言:javascript
复制
...
save ""

# save 900 1
# save 300 10
# save 60 10000
...
  • 在redis-cli (redis客户端) 修改配置
代码语言:javascript
复制
config set save ""

无论以哪种方式修改,再次启动redis-server时,都要带上redis.conf文件




注意: 关闭RDB只是在关闭之后,不会将数据快照保存到rdb文件中,而之前的文件仍然会有以前的数据,在重启之后,以前的数据还是会恢复

#2.1 AOF (默认关闭)

代码语言:javascript
复制
# 把no改成yes
appendonly yes
# aof文件名
appendfilename "appendonly.aof"
# 每秒一次(默认)
appendfsync everysec 



本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Redis持久化
  • #1 持久化方式
    • #1.1 RDB
      • # 配置
    • #1.2 AOF
      • # 配置
    • #1.3 比较
    • #2 测试
      • #2.1 RDB (默认开启)
        • # RDB开启测试(默认开启)
          • # RDB关闭
            • #2.1 AOF (默认关闭)
            相关产品与服务
            云数据库 Redis
            腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档