Redis持久化之RDB和AOF
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文件内容
od为Octal Dump,是Linux上用来输出文件内容的工具,-c为以字符形式输出。
- REDIS0011表示RDB版本号是11,。
- redis-ver为
7.2.3
。 - redis-bits表示操作系统的架构32位或者64位。
- ctime为RDB的创建时间
- used-mem为写RDB的实例所占用的内存。
- aof-base设置为0
\0 003 one
表示3个字节的字符串:one,其后的003 xxx
表示one对应的值为3个字节的xxx
。- 377为 EOF:表示 RDB 文件的结尾。
- 最后的
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
,其中的内容为
将换行符删掉后,可以看到有两条命令,第一条命令选择了第0个数据库,然后set了一个键值对one: zzz。
可以看到aof是通过记录客户端命令而不是保存数据来实现持久化的。
当重启Redis容器时可以看到从aof中加载了数据,顺序为先base后incr,这时候执行keys *
可以看到Redis重启之前的数据未被丢失。
两个文件prefix.file_seq.base.aof
和prefix.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
。