Redis——持久化

这是我参与更文挑战的第19天,活动详情查看:更文挑战

持久化

  • RDB
    • save
    • bgsave
    • 配置
  • AOF
    • 持久化写策略
    • 重写
  • RDB与AOF区别
  • 持久化应用场景

一、RDB

  • 谁:redis操作者
  • 什么时间:随时
  • 干什么事情:保存数据

第一种:save命令

  • 手动执行一次保存操作
save
复制代码

save命令结果

执行一次save命令就会产生一个dump.db文件,这个文件里保存了所有的键值对

  • 这个文件的文件名可以在配置文件里修改(dbfilename)
  • 文件的位置也可以在配置文件里修改(dir)

数据恢复

如果没有执行save命令,然后关闭redis服务,那么下一次启动的时候里面的数据就丢失了。

所以执行save命令产生dump.db文件,下一次redis服务启动的时候会从里面获取键值对。

save指令的风险性

由于redis是单线程任务序列,所以如果数据量较大,执行save命令的时候,可能会造成长时间阻塞。因此线上环境不建议使用。

第二种:bgsave指令

  • 在后台执行保存指令,但不是立即执行,解决lsave命令的阻塞问题
  • 它会生成一个子进程来保存数据,不会占用redis的任务队列
bgsave
复制代码

第三种:自动执行

  • 谁:redis服务器发起指令(基于条件)
  • 上面时间:满足条件
  • 干什么事情:保存数据
  • 这里配置以后使用的是bgsave操作
  • 要注意影响,可能会造成灾难性
  • 命令
# 现代时间内key变化的数量达到指定数量就持久化
# 如果时间到了,key的数量没有满足会重新记时
# sencod:时间
# changes:key变化的数量
save second changes

# 例子:60s有10个变化就持久化
save 60 10
复制代码

save和bgsave对比

方式 save指令 bgsave指令
读写 同步 异步
阻塞客户端指令
额外内存消耗
启动新进程

rdb特殊启动形式

  • 服务器运行过程中启动
debug reload
复制代码
  • 关闭服务器时指定保存数据
shutdown save
复制代码

rdb优缺点

  1. 优点
    • RDB是一个紧凑压缩的二进制文件,存储效率较高
    • RDB存储的是Redis在某个时间点的数据快照,非常适用于数据备份
    • RDB恢复数据的速度要比AOG快很多
    • 它是一个文件,可以复制,可用于灾难恢复
  2. 缺点
    • 无法做到实时持久化,可能会丢失数据
    • bgsave每次都要常见子进程,要牺牲掉一些性能
    • Redis个版本的RDB文件格式并不统一,在不同服务中可能会造成版本不兼容

三、AOF(append only file)

  • 主流持久化方式
  • 解决了实时持久化的问题

解决RDB的弊端

  • 不会一次性写入所有数据,仅记录部分数据
  • 改记录数据为记录操作过程
  • 对所有操作均进行记录,排除丢失数据的风险

AOF写数据的三种策略(appendfsync)

  • always(每次)(不建议)
    • 每次写入操作均写入AOF文件,数据零误差,性能较低
  • everysec(每秒)(建议)
    • 每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高
    • 在系统突然宕机的情况下丢失1s的数据
  • no(系统控制)
    • 有操作系统控制(不可控)

AOF配置文件修改

  • 是否开启AOF持久化功能,默认关闭
appendonly yes|no
复制代码
  • AOF写数据策略
appendfsyno always|everysec|no
复制代码
  • AOF配置文件名称
appendfilename appendonly-6379.aof
复制代码

AOF文件重写

  • 当写入的命令越来越多,文件体积会越来越大,有很多命令叠加会导致有些命令失效
  • AOF重写就是去掉无效命令,压缩文件体积
  • 创建子进程执行重写命令
set name jack
set name rose
# 可以看出最终name是chris,上面的两个name会被覆盖,因此那两个命令相当于无效,不用执行
# AOF重写就是去掉这样的无效命令
set name chris
复制代码
  1. 重写规则
    • 已超时的数据不再写入文件
    • 忽略无效指令
    • 对同一数据的多条命令合并为一条命令
  2. 重写方式
    • 手动重写
    # 输入这个命令aof文件就会压缩去掉没用命令
    bgrewriteaof
    复制代码
    • 自动重写
    auto-aof-rewrite-min-size size
    auto-aof-rewrite-percentage percentage
    复制代码

四、RDB与AOF的区别

持久化方式 RDB AOF
占用存储空间
存储速度
恢复速度
数据安全性 会丢失数据 依据策略决定
资源消耗 高/重量级 低/轻量级
启动优先级

选择RDB还是AOF呢?

  • 对数据非常敏感,建议使用默认的AOF持久化方案
  • 数据呈现阶段有效性,建议使用RDB持久化方案
  • 灾难恢复选用RDB
  • 总的来说需要权衡利弊
  • 两个都用,双重保险

五、持久化应用场景

  • 用于控制数据库表主键id,保障数据库主键唯一性
  • 用于各种结构型和非结构型高热度数据访问加速
  • 用于购物车数据存储设计
  • 用于抢购、限购类、限量发放优惠券、激活码等业务的数据存储设计
  • 用于具有操作先后顺序的数据控制
  • 用于最新消息展示
  • 用于同类信息的关联搜索、二度关联搜索、深度关联搜索
  • 用于基于黑名单与白名单设定的服务控制
  • 用于计数器组合排序功能对应的排名
  • 用于即使任务/消息队列执行管理
  • 用于按次结算的服务控制
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享