Redis持久化之RDB和AOF

发布时间 2024-01-12 23:05:07作者: 东方来客

Redis是基于内存的,内存中的信息断电丢失,有时需要持久化来解决这个弊端。

在之前的文章中Shiro中使用Redis管理session - 东方来客 - 博客园 (cnblogs.com)使用了Redis管理Shiro的session。

想要配置Redis持久化不是 在Maven项目中,而是 要通过redis.conf配置来影响Redis,这里通过Docker来演示持久化功能。

RDB

配置

bind 127.0.0.1 -::1
port 6379

dbfilename dump.rdb
dir /data
save 3600 1 300 100 60 10000

RDB文件内容

image

od为Octal Dump,是Linux上用来输出文件内容的工具,-c为以字符形式输出。

  1. REDIS0011表示RDB版本号是11,。
  2. redis-ver为7.2.3
  3. redis-bits表示操作系统的架构32位或者64位。
  4. ctime为RDB的创建时间
  5. used-mem为写RDB的实例所占用的内存。
  6. aof-base设置为0
  7. \0 003 one 表示3个字节的字符串:one,其后的003 xxx表示one对应的值为3个字节的xxx
  8. 377为 EOF:表示 RDB 文件的结尾。
  9. 最后的y 346 a 006 266 022 216 ,8个字节整个文件的校验和。

AOF

配置

bind 127.0.0.1 -::1
port 6379

appendonly yes
# AOF 文件名
appendfilename "redis-aof.aof"

# AOF 文件同步策略  
# "always" 每次写命令都立即同步到磁盘,"everysec" 每秒同步一次,"no" 由操作系统决定何时同步  
appendfsync everysec  

# AOF 重写最小文件大小(单位为字节)
auto-aof-rewrite-min-size 20
auto-aof-rewrite-percentage 100
dir /data
stop-writes-on-bgsave-error yes
# yes代表将会同时生成AOF和RDB文件
aof-use-rdb-preamble no

文件内容

执行一次set one zzz,发现在data目录下生成了redis-aof.aof.1.incr,其中的内容为
image
将换行符删掉后,可以看到有两条命令,第一条命令选择了第0个数据库,然后set了一个键值对one: zzz。
image
可以看到aof是通过记录客户端命令而不是保存数据来实现持久化的。

image

当重启Redis容器时可以看到从aof中加载了数据,顺序为先base后incr,这时候执行keys *可以看到Redis重启之前的数据未被丢失。

两个文件prefix.file_seq.base.aofprefix.file_seq.incr.aof
当base.aof写满时向incr.aof写入内容,incr.aof写满时会触发重写,
将Redis中最新的内容放到base.aof中并清空incr内容。

两个工具redis-check-aof和redis-rdb-cli

redis-check-aof

使用redis-check-aof--fix可以修复rdb、aof和manifest文件的错误。
使用redis-check-aof xxx.rdb文件可以输出文件的Auxiliary fields信息,比如创建时间ctime,redis-ver版本信息等。

redis-rdb-cli

redis-rdb-cli可以格式化rdb文件,输出为json格式等到一个文件:rct -f json -s /path/to/dump.rdb -o /path/to/dump.json