Redis5.0.8_03 数据持久化

RDB 持久化优缺点

RDB持久化是把当前进程数据生成快照,保存到硬盘的过程,触发RDB持久化为分手动触发和自动触发。

可以在指定的时间间隔内生成数据集的时间快照(point-in-time snapshot)
优点:速度快,适合于用做备份,主从复制也是基于RDB持久化功能实现的
缺点:会有数据丢失,执行成本高,还存在兼容问题。

手动触发:
在redis命令界面,直接bgsave
把内存里面的数据保存到磁盘上
bgsave 执行流程:





当你执行bgsave的时候,会创建一个子进程,用来生成RDB文件,原来的这个进程还在继续处理其他工作,所以当你持久化数据时,需要额外的内存空间,用来保存数据。






当你的redis被重启后,数据还会存在,这是因为redis在启动的时候,会检测有没有持久化的数据文件,有就会加载到内存里面。

但是当有新的数据插入进来,如果没有把数据保存到磁盘,这时redis 重启,也只会有上一次的数据,并没有刚才插入的数据。

自动触发:修改配置文件

vim /usr/local/redis_cluster/redis_6379/conf/redis_6379.conf




save 900 1 ## 15分钟,至少有1个key,发生改变
save 300 10 ## 5分钟,至少有10个key,发生改变
save 60 10000 ## 1分钟,至少有10000个key,发生改变

这三个条件,只要满足其一,redis 就执行bgsave ,保存持久化数据

redis-cli -h 192.168.189.14 shutdown
redis-server /usr/local/redis_cluster/redis_6379/conf/redis_6379.conf

+++++++++
登录redis
keys *


再利用脚本插入1000条数据




再执行一次keys *


然后直接在命令模式shutdown 并 exit

重新启动redis,登录redis,执行keys *



这是因为,只要满足以下三个条件中的一个,都会触发bgsave

save 900 1 ## 15分钟,至少有1个key,发生改变
save 300 10 ## 5分钟,至少有10个key,发生改变
save 60 10000 ## 1分钟,至少有10000个key,发生改变
================================================
面试题1:

当不满足以上三个条件时,执行了shutdown ,数据会不会丢失?

不会,因为在执行shutdown 时,实际上是执行了两个命令,先执行了bgsave,再执行的shutdown





keys *




这时,查看RDB文件



重新启动redis ,并登录redis,执行keys *



面试题2
为什么执行kill -9 redis-server ,数据会丢失,执行kill redis-server 进程,数据不会丢失?

kill -9 相当于,直接把头砍掉,普通的kill 相当于kill -15 ,还会把自己的事情处理完,再退出。普通的kill相当于是一个正常的退出,和shutdown 是一个意思。kill pkill kill -15 都是优雅的关闭,让你把活干完,正常的退出。
==============================

AOF 持久化
以独立日志的方式,记录每次的写命令,重启时再执行 AOF文件中的命令,AOF的主要作用是解决了数据持久化的实时性。

相当于Mysql 的binlog ,每个记录,都记录下来,只记录操作,不记录数据。

AOF工作流程:
所有命令会追加到AOF缓冲区中
缓冲区根据对应的策略向硬盘做同步操作(同步到AOF 文件中)

随着AOF文件越来越大,需要定期对AOF文件进行重写(根据redis重写算法,对写入的命令进行计算,清除一些不会影响到结果的命令。),达到压缩目的

当Redis服务重启时,可以加载AOF文件进行数据恢复。



AOF 持久化配置:
vim /usr/local/redis_cluster/redis_6379/conf/redis_6379.conf




appendfilename "appendonly.aof" ##AOF 文件名称

appendonly yes ## 是否打开 aof 日志功能

appendfsync always ##每1个命令,都立即同步到aof

appendfsync everysec ##每秒写一次

appendfsync no ##写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof .

++ redis 数据持久化 AOF 和 RDB 同时存在,redis启动时优先读取那一个?

测试:
重启redis
登录redis,插入两条数据,然后shutdown


查看持久化文件:



这时,备份一份rdb文件

cp /data/redis_cluster/redis_6379/redis_6379.rdb /tmp/

重启redis,并登录。再插入一条记录。

redis-server /usr/local/redis_cluster/redis_6379/conf/redis_6379.conf

redis-cli -h 192.168.189.14



keys *



现在共有103条数据。

这时再执行,shutdown ,数据都有持久到两个文件中。



这时,把刚才备份到/tmp/ 下面的rdb文件,拷贝回redis数据目录,并覆盖。




然后再启动redis,登录redis,查看数据

redis-server /usr/local/redis_cluster/redis_6379/conf/redis_6379.conf

redis-cli -h 192.168.189.14

keys *



数据还是103条,并不是102条。

当redis 的两种持久化数据,都存在的时候,redis启动的时候,只导入aof 数据。
++++++++++++++++


面试题:
redis 持久化方式有哪些?他们有什么区别?

redis持久化有 rdb 和 aof
rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能
aof:以追加的方式记录 redis 操作日志的文件,可以最大程度保证redis数据安全,类似于mysql的binlog

这两种方式可以并存。
+++++++++++++++++
Redis 安全认证
redis 默认开启了保护模式,只允许本地回环地址登录并访问数据库

禁止protected-mode

修改配置文件:
protected-mode yes/no (保护模式,是否只允许本地访问)

Bind : 指定 IP进行监听

修改配置文件:
bind 192.168.189.14 127.0.0.1

增加 requirepass {password}

修改配置文件:
requirepass 123456
验证:



不登录redis进行,密码验证。