Redis持久化(RDB+AOF)和发布订阅

在这里插入图片描述

持久化

Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。

官网地址

RDB

RDB(Redis DataBase Bakup file),redis数据备份文件,是指在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。快照文件称为RDB文件,默认是保存在当前运行目录。

执行时机

  • 执行 save 命令

    save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。

  • 执行 bgsave 命令

    bgsave命令执行后会开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响。

  • Redis停机时

    Redis停机时会触发一次save命令,实现RDB持久化。

  • 触发 RDB 条件时

    可在redis.conf配置文件中找到:

    # 代表900秒内至少执行1次修改则触发RDB,执行bgsave   如果是save "" 则表示禁用RDB
    save 900 1  
    save 300 10  
    save 60 10000 
    

RDB的其它配置也可以在redis.conf文件中设置:

# 是否压缩 ,建议不开启,压缩也会消耗cpu,磁盘的话不值钱
rdbcompression yes

# RDB文件名称
dbfilename dump.rdb  

# 文件保存的路径目录
dir ./ 

RDB恢复

  1. 将备份文件(dump.rdb)移动到Redis安装目录并启动服务

  2. 获取目录

    127.0.0.1:6379> config get dir
    1) "dir"
    2) "/www/server/redis"
    127.0.0.1:6379> 
    

RDB原理

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。

fork采用的是copy-on-write技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

RDB方式bgsave的基本流程?

  • fork主进程得到一个子进程,共享内存空间
  • 子进程读取内存数据并写入新的RDB文件
  • 用新RDB文件替换旧的RDB文件

RDB的缺点?

  • RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险
  • fork子进程、压缩、写出RDB文件都比较耗时
AOF

AOF全称Append Only File(追加文件)。以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件,不可改写文件。Redis重启会根据aof文件将指令执行一遍以完成数据恢复。

AOF配置

AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:

# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"

AOF的命令记录的频率也可以通过redis.conf文件来配:

# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always 
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec 
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no

三种策略对比:

配置项刷盘时机优点缺点
always同步刷盘可靠性高,几乎不丢数据性能影响大
everysec每秒刷盘性能适中可能会丢失1秒数据
no操作系统控制性能最好可靠性较差,可能丢失大量数据

恢复

先在配置文件开启appendonly yesAOF功能。

​ 正常恢复:将aof备份文件移动至config get dir下,启动服务即可。

​ 异常恢复:aof备份文件被损坏,启动服务时会报文件格式错误,这时可以使用redis-check-aof --fix XXX.aof指令进行修复,最后启动服务即可。

AOF文件重写

AOF采用文件追加的方式,文件体积会越来越大,针对这种情况,有了重写机制,当文件大小超过所设定的阈值时,Redis会通过bgrewriteaof命令,让AOF文件执行重写功能,只保留可以恢复数据的最小指令集。

相关触发阈值配置,redis.cong:

# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写 
auto-aof-rewrite-min-size 64mb 

默认配置是当AOF文件大于64MB的触发。

原理

AOF文件持续追加而过大时,会fork出一条新进程来将文件重写(先写临时文件,再rename),遍历新进程的内存数据,进行重写,并不会读取旧的AOF文件。

案例:

AOF原本有三个命令,set num 123set name jackset num 666;但是set num 123 和 set num 666都是对num的操作,第二次会覆盖第一次的值,因此第一个命令记录下来没有意义。

所以重写命令gbrewriteaof后,AOF文件内容就是:mset name jack num 666

RDB与AOF对比

发布订阅

是一种消息通信模式:发送者(PUBLISH)发送消息,订阅者(SUBSCRIBE)接收消息,可以实现进程间的消息传递。

官网地址

作用

Redis客户端可以订阅多个频道,类似我们关注微信公众号,当有新消息通过PUBLISH命令发送给频道channel时,这个消息会被发送给订阅者(客户端)。

命令

推荐先订阅再发布,因为数据不会被持久化,所以订阅前发布的消息是接收不到的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值