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进行恢复
浙公网安备 33010602011771号