Redis 数据持久化

Redis 数据持久化

我在这里只记录点基本内容,不会写太深入的内容

两种持久化方式:

  • RDB 当前的数据:RDBFile
  • 操作的命令:AOFFile

RDB

RDB 是 redis 默认的持久化,又称为快照
看redis的配置文件,redis.conf

save 900 1 # 900 秒操作大于等于 1 次,就会使用一次 RDB
save 300 10 # 300 秒操作大于等于 10 次,就会使用一次 RDB
save 60 10000 # 60 秒操作大于等于 10000 次,就会使用一次 RDB

RDB 命令

  • save 命令:将内存数据镜像保存为 rdb 文件,由于 redis 是单线程模型,期间会阻塞 redis 服务进程,redis 服务不再处理任何指令,直到 rdb 文件创建完成为止
  • bgsave 命令:父进程启动子进程,由子进程将内存保存在硬盘文件,期间不会影响其它的指令操作

通过redis配置,自动触发 bgsave 命令的原理:

  • redis有一个周期性操作函数,默认每隔 100ms 执行一次(可改源码),它的其中一项工作就是检查自动触发 bgsave 命令的条件是否成立
  • 计数器记录了上一次成功的持久化后,redis进行了多少次写操作,其值在每次写操作之后都加1,在成功完成持久化后清零

缺点:

  • 持久化时比较耗时
  • 持久化时,新写入redis的数据可能丢失

优点:

  • 还原数据时很块

AOF

AOF 称为日志追加,会保存redis每次操作的命令
redis.conf 文件

appendonly yes

三种追加方式:

  • appendfsync always:只要有读写。安全性高,性能低
  • appendfsync everysec:1秒钟的周期。安全性比较高,性能比较高
  • appendfsync no:等业务不繁忙的时候。安全性低,性能高、这种操作最不可靠

尽量使用 appendfsync everysec

文件中的命令保存的格式

*第一个命令的参数个数
$第一个命令的第一个参数的长度
第一个命令的第一个参数
$第一个命令的第二个参数的长度
第一个命令的第二个参数
*第二个命令的参数个数
$第二个命令的第一个参数的长度
第二个命令的第一个参数
$第二个命令的第二个参数的长度
第二个命令的第二个参数

举例:

*2
$6
SELECT
$1
0
*3
$3
set
$4
name
$8
zhangsan

就是保存了两个命令

select 0
set name zhangsan

可以修改文件的数据,从而影响redis的读取

重写

对同一个 key 的操作会导致 AOF 文件变得很大,这时候就需要重写,重写就是把大文件改成小文件
比如

key1 value1
key1 value2
key1 value3

可以重写成

key1 value1,value2,value3

缺点:

  • 持久化文件体积比RDB大
  • 还原比RDB慢,不适合大数据迁移

优点:

  • 持久化文件可读性好
  • 数据的安全性比RDB高

综合方案

redis.conf 文件,混合持久化模式

aof-use-rdb-preamble yes

数据量大时,将AOF变成RDB

Redis 数据持久化 结束

posted @ 2021-08-15 17:03  .NET好耶  阅读(96)  评论(0编辑  收藏  举报