redis 持久化

redis是一个内存数据库,数据保存在内存中,内存的数据变容易发生丢失。需要将内存中的数据存储到磁盘上。

Redis提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Append Only File)

Redis启动前准备

新建redis配置文件

cat redis.conf | grep -v "#" | grep -v "^$" >redis-6379.conf 
#过滤配置文件中的注释和空白和新建文件,并将过滤后内容放入新建的文件中

修改配置文件

port 6379 
#端口号
daemonize yes 
#以守护进行方式启动,命令窗口不会出现日志信息
logfile "log_6379.log"
#日志文件名
dir ./data
#服务文件保存目录,包含日志文件、持久化文件

开启Redis

redis-server redis-config/redis-6379.conf
#开启Redis服务 

redis-cli -p 6379
#开启Redis客户端

RDB

数据以快照的形式保存在磁盘上。什么是快照,当前时刻中的数据拍成一张照片。

将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。

如何触发快照??RDB有三种方式:save命令、bgsave命令、自动触发

save命令

#查看data目录
[root@localhost data]# ls
log_6319.log
[root@localhost bin]# redis-cli -p 6379
#客户端设置数据
127.0.0.1:6379> set age 18
OK
#查看data目录,没有持久化数据
[root@localhost data]# ls log_6319.log
#执行save
[root@localhost bin]# redis-cli -p 6379 127.0.0.1:6379> save OK
#数据持久化
[root@localhost data]# ls dump.rdb log_6319.log

注意:

1、Save命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令。

2、如果已经存在RDB文件,就需要替换成新的文件。客户端可能都是几万或者是几十万,

这种方式显然不可取

bgsave命令

Redis会在后台异步进行快照操作,不会阻塞当前Redis服务器

具体操作:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。

127.0.0.1:6379> set addr suzhou
OK
127.0.0.1:6379> bgsave
Background saving started
#执行前后
[root@localhost data]# ll 总用量
8 -rw-r--r--. 1 root root 104 9月 17 10:48 dump.rdb -rw-r--r--. 1 root root 2891 9月 17 10:48 log_6319.log

#执行后 [root@localhost data]# ll 总用量
8 -rw-r--r--. 1 root root 117 9月 17 11:21 dump.rdb -rw-r--r--. 1 root root 3166 9月 17 11:21 log_6319.log

持久化文件变大了。

自动触发

自动触发是由我们的配置文件来完成的,本质通过设置配置文件save来自动触发bgsave

在redis.conf配置文件中,里面有如下配置

port 6379
daemonize yes
logfile "log_6379.log"
dir ./data
#save m n。表示m秒内数据集(Key)存在n次修改时,自动触发bgsave
save 900 1
save 300 10

#存储过程中,出现错误,停止存储操作
stop-writes-on-bgsave-error yes

#设置压缩存储
rdbcompression yes

#使用CRC64算法来进行数据校验
rdbchecksum yes

#设置快照的文件名
dbfilename "dump-6379.rdb"

测i是60秒内修改两次key(可以对同一个key修改两次)

save 60 2
#重启Redis
[root@localhost data]# ps -ef | grep redis
root 4945 1 0 11:04 ? 00:00:36 redis-server *:6379
root 5418 5387 0 14:12 pts/5 00:00:00 redis-cli -p 6379
root 5936 5900 0 16:03 pts/2 00:00:00 grep --color=auto redis
[root@localhost data]# kill -s 9 4945

60秒内

127.0.0.1:6379> set key1 value3
OK
127.0.0.1:6379> set key1 value4
OK

查看RDB生成成功

[root@localhost data]# ll
总用量 8
-rw-r--r--. 1 root root  110 9月  17 16:06 dump-6379.rdb
-rw-r--r--. 1 root root 1417 9月  17 16:06 log_6379.log

RDB 的优势和劣势

优势

  • RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复
  • 生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作
  • RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快

劣势

  可能丢失数据

AOF

将Redis写命令存储到磁盘

AOF开启配置

#开启AOF
appendonly yes
#设置触发AOF持久化机制
appendfsync always
#设置持久化文件名
appendfilename "appendonly-6379.aof"

AOF触发机制

  • always(每次):每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
  • everysec(每秒):异步操作,每秒记录 如果一秒内宕机,有数据丢失
  • no(系统控制):由系统控制每次同步到AOF文件的周期,整体过程不可控

AOF持久化文件重写

AOF持久化的文件会变的越来越大。为了压缩aof的持久化文件,redis提供了bgrewriteaof命令。

将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写,

重写aof文件的操作:将整个内存中的数据库内容用命令的方式重写了一个新的aof文件

重写方式

  • 手动重写
  • 自动重写

非重写

127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> set name wangwu
OK
127.0.0.1:6379> INCR num
(integer) 1
127.0.0.1:6379> INCR num
(integer) 2
127.0.0.1:6379> INCR num
(integer) 3

查看持久化文件

[root@localhost data]# ll
总用量 12
-rw-r--r--. 1 root root  197 9月  18 13:24 appendonly-6379.aof

手动重写

127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started

查看持久化文件

[root@localhost data]# ll
总用量 12
-rw-r--r--. 1 root root  117 9月  18 13:29 appendonly-6379.aof

AOF自动重写

自动重写触发条件设置两种方式

  • 根据大小触发重写
  • 根据百分比触发重写
1)auto-aof-rewrite-min-size size #当前aof缓冲区中的内容大小超过设置的值就会触发重写,
条件表达式:aof_current_size > auto-aof-rewrite-min-size
2)auto
-aof-rewrite-percentage percent #当前aof缓冲区中的内容达到的百分比就会触发重写,
条件表达式:
(aof_current_size - aof_base_size) / aof_base_size >= auto-aof-rewrite-percentage

通过指令info Persistence获取具体信息

aof_current_size #当前aof缓冲区中的内容大小
aof_base_size #默认基数
原文地址:https://www.cnblogs.com/WarBlog/p/15305124.html