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进行,密码验证。
![]()