Redis高性能内存数据库(五)

Redis的持久化*(重点-要会叙述)

本质:备份和恢复

弥补memcached不足

1.RDB快照:默认的一种持久化的方式

      

(1)一种快照,就是一种备份。

每隔一段时间,会把内存中的数据,保存到硬盘上的文件。

产生rdb文件。

当内存数据崩溃,重新启动redis时,会读这个文件

注意:每隔一段时间生成,是需要配置的

(2)RDB生成策略

[root@bigdata111 conf]# pwd

/usr/local/redis/conf

[root@bigdata111 conf]# vi redis.conf

:set number

 

147 save 900 1 在900秒内,如果有1个key发生变化,就执行rdb

148 save 300 10 在300秒内,如果有10个key发生变化,就执行rdb

149 save 60 10000 在60秒内,如果有10000个key发生变化,就执行rdb

save 时间(秒) 数字(key变化个数)

从下往上(149->147)看,策略会越来越弱

(3)其他参数

164 stop-writes-on-bgsave-error yes

  当后台写进程出错的时候,禁止写入新的数据

  bgsave   手动触发RDB命令

170 rdbcompression yes

 是否压缩  如果看中性能,选择no

 压缩会节约空间,但会影响备份和恢复性能。

182 dbfilename dump.rdb    RDB名字

192 dir ./   RDB的路径

(4)RDB优点和缺点:

优点:快,恢复速度快

缺点:在两次rdb之间,可能会造成数据丢失。因为每隔一段时间做一个快照。

解决:AOF(如果对系统数据安全性/备份要求很高的话)

2.AOF日志:操作记录日志

客户端在操作redis时,把所有客户端的操作记录到文件中,如果发生崩溃,把操作完全恢复一遍,就恢复了数据。

(1)默认是禁用的。需要修改参数,来启动。

首先停掉redis:

如果想停掉redis,则输入:

[root@bigdata111 redis]# ./bin/redis-cli shutdown

[root@bigdata111 redis]# ps -ef | grep redis

root       5233   2400  0 14:46 pts/0    00:00:00 vi redis.conf

root       5266   2505  0 15:37 pts/1    00:00:00 grep --color=auto redi

然后修改保存配置文件:

509 appendonly yes 启动aof

  接着启动redis-server:

  

(2)AOF记录日志策略

538 # appendfsync always 每个操作都记录日志。优点:安全。缺点:慢。

539 appendfsync everysec   每秒记录一下。

540 # appendfsync no 由操作系统来决定记录日志的方式。不会用得到,

默认是每秒记录一次日志。

(3)AOF的日志重写

举例:假如每个操作都记录到aof日志中

set money 0  现在没钱

incr money   钱变成1

incr money   钱变成2

incr money   钱变成3

.....自增100次

如果每个操作都记录日志的话,会记录101条日志。但这是没有必要的

最终的结果 money 100

进行日志重写:上面的101条删除,添加一条 set money 100

                         这句话效果和上面101条效果一样。

现在操作:

./redis-benchmark -n 100000 模拟10万次redis操作

[root@bigdata111 redis]# ./bin/redis-benchmark -n 100000

 

现在再模拟10万次redis操作,同时不断地查看AOF日志的大小:

 

可以看到AOF日志变小了,这说明这段期间发生了日志的合并。

---------------------------------

aof参数设置:

561 no-appendfsync-on-rewrite no

执行重写的时候,不写入新的日志

581 auto-aof-rewrite-min-size 64mb

执行重写的aof文件大小。超过64M就触发重写

3.当RDB和aof同时存在时,我优先执行哪个恢复?

504 # If the AOF is enabled on startup Redis will load the AOF, that is the file

505 # with the better durability guarantees.

如果aof开启,优先使用aof

----------------- 讲    义 ------------------

Redis 提供了多种不同级别的持久化方式:

RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。

AOF (Append-only file)持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。

AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。

Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。

Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下,当 Redis 重启时,它会优先使用 AOF 文件来还原数据集,因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。

你甚至可以关闭持久化功能,让数据只在服务器运行时存在。

1、RDB

工作原理:每隔一定时间给内存照一个快照,将内存中的数据写入文件(rdb文件)

配置参数:redis.conf文件

 

RDB示例测试:可以使用redis-benchmark进行压力测试

 ./bin/redis-benchmark -n 100000  表示执行100000个操作

RDB的缺点:

在两次快照之间,如果发生断电,数据会丢失

举例:在生成rdb后,插入新值。突然断电,数据可能会丢失

2、AOF:通过日志的方式

工作原理:记录操作的命令

配置参数: 

什么是AOF的重写:rewrite

将内存中的key逆向生成命令,如同一个可以,反复操作了100次,aof文件会记录100次操作,这样会导致AOF文件过大

例如:

set age 0

incr age

incr age

... 100次

最后 age的值是100

经过重写后,直接执行: set age 100

可以通过观察aof日志文件的大小

3、Redis持久化注意的问题

RDB恢复的速度快

如果RDB和AOF都有,默认使用AOF进行恢复

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3