redis持久化 防止数据丢失,持久化到本地,以文件形式保存 持久化的方式 ,两种 aof和 rdb模式 1.触发机制, - 手动执行save命令 - 或者配置触发条件 save 200 10 #在200秒中内,超过10个修改类的操作 2.建立redis配置文件,开启rdb功能 配置文件 s21_rdb.conf 内容如下 ,有关rdb的配置参数是 dbfilename dbmp.rdb ,一个是 save 900 1 daemonize yes port 6379 logfile /data/6379/redis.log dir /data/6379 #定义持久化文件存储位置 dbfilename s21redis.rdb #rdb持久化文件 bind 127.0.0.1 #redis绑定地址 requirepass redhat # save 900 1 #rdb机制 每900秒 有1个修改记录 save 300 10 #每300秒 10个修改记录 save 60 10000 #每60秒内 10000修改记录 save 20 2 #在20秒内,超过2个修改类的操作
[root@mcw01 ~/redis]$ redis-cli -h 10.0.0.11 -p 6379 #查看有三个key 10.0.0.11:6379> auth mcw123 OK 10.0.0.11:6379> keys * 1) "stu2" 2) "stu1" 3) "new1" 10.0.0.11:6379> [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis root 24392 1 0 19:10 ? 00:00:21 redis-server 10.0.0.11:6379 [root@mcw01 ~/redis]$ kill 24392 #杀掉redis服务 [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis [root@mcw01 ~/redis]$ redis-server mcwRedis.conf #重新启动redis服务 24590:C 05 Mar 23:08:45.304 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 24590:C 05 Mar 23:08:45.304 # Redis version=4.0.10, bits=64, commit=00000000, modified=0, pid=24590, just started 24590:C 05 Mar 23:08:45.304 # Configuration loaded [root@mcw01 ~/redis]$ redis-cli -h 10.0.0.11 -p 6379 #重连 10.0.0.11:6379> auth mcw123 OK 10.0.0.11:6379> keys * #查看三个key已经丢失 (empty list or set) 10.0.0.11:6379> redis持久化配置文件: daemonize yes port 6379 logfile /data/6379/redis.log dir /data/6379 dbfilename mcwredis.rdb bind 127.0.0.1 save 900 1 save 300 10 save 60 10000
#在20秒内,超过2个修改类的操作就做持久化保存 [root@mcw01 ~/redis]$ ls 00-RELEASENOTES CONTRIBUTING deps Makefile mcwRedis.conf redis.conf runtest-cluster sentinel.conf tests BUGS COPYING INSTALL MANIFESTO README.md runtest runtest-sentinel src utils [root@mcw01 ~/redis]$ vim rdbRedis.conf [root@mcw01 ~/redis]$ mkdir -p /data/6379 [root@mcw01 ~/redis]$ cat rdbRedis.conf #配置在20秒内,超过2个修改类的操作就做持久化保存 daemonize yes port 6379 logfile /data/6379/redis.log dir /data/6379 dbfilename mcwredis.rdb bind 127.0.0.1 save 20 2 [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis root 24591 1 0 23:08 ? 00:00:02 redis-server 10.0.0.11:6379 [root@mcw01 ~/redis]$ kill 24591 [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis [root@mcw01 ~/redis]$ redis-server rdbRedis.conf #使用这个配置文件启动服务 [root@mcw01 ~/redis]$ ls /data/ 6379 [root@mcw01 ~/redis]$ ls /data/6379/ #查看只有个日志文件,无rdb文件 redis.log [root@mcw01 ~/redis]$ redis-cli 127.0.0.1:6379> set name1 mcw OK 127.0.0.1:6379> set name2 mcw2 #20秒时间内添加两条数据 OK 127.0.0.1:6379> [root@mcw01 ~/redis]$ ls /data/ 6379 [root@mcw01 ~/redis]$ ls /data/6379/ #查看已生成rdb文件 mcwredis.rdb redis.log 已生成rdb文件了,重启服务,然后进去看到数据还存在的。也就是只要保存进这个rdb文件,那么即使服务停止重启,也不会丢失保存下来的数据 [root@mcw01 ~/redis]$ ls /data/6379/ #查看已生成rdb文件 mcwredis.rdb redis.log [root@mcw01 ~/redis]$ [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis root 24625 1 0 23:32 ? 00:00:00 redis-server 127.0.0.1:6379 [root@mcw01 ~/redis]$ kill 24625 [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis [root@mcw01 ~/redis]$ redis-server rdbRedis.conf [root@mcw01 ~/redis]$ redis-cli 127.0.0.1:6379> keys * 1) "name1" 2) "name2" 127.0.0.1:6379> get name1 "mcw" 127.0.0.1:6379>
[root@mcw01 ~/redis]$ ls 00-RELEASENOTES BUGS COPYING INSTALL MANIFESTO rdbRedis.conf redis.conf runtest-cluster sentinel.conf tests 6379 CONTRIBUTING deps Makefile mcwRedis.conf README.md runtest runtest-sentinel src utils [root@mcw01 ~/redis]$ vim rdbRedis.conf [root@mcw01 ~/redis]$ cat rdbRedis.conf #修改配置文件1000秒内插入10条才触发持久化保存数据 daemonize yes port 6379 logfile /data/6379/redis.log dir /data/6379 dbfilename mcwredis.rdb bind 127.0.0.1 save 1000 10 [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis root 24657 1 0 23:41 ? 00:00:00 redis-server 127.0.0.1:6379 [root@mcw01 ~/redis]$ kill 24657 #停掉服务 [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis [root@mcw01 ~/redis]$ rm -rf /data/6379/* #删除原来的数据 [root@mcw01 ~/redis]$ redis-server rdbRedis.conf #用新配置文件启动服务 [root@mcw01 ~/redis]$ redis-cli 127.0.0.1:6379> keys * (empty list or set) 127.0.0.1:6379> set name1 mcw1 OK 127.0.0.1:6379> set name2 mcw2 #添加两条数据 OK 127.0.0.1:6379> keys * 1) "name2" 2) "name1" 127.0.0.1:6379> [root@mcw01 ~/redis]$ ls /data/6379/ #查看此时还没有持久化保存数据,没有达到save的条件 redis.log [root@mcw01 ~/redis]$ redis-cli 127.0.0.1:6379> keys * 1) "name2" 2) "name1" 127.0.0.1:6379> save #重新进入,手动执行save命令持久化保存数据 OK 127.0.0.1:6379> [root@mcw01 ~/redis]$ ls /data/6379/ #发现已经生成持久化rdb文件。说明save保存数据生效 mcwredis.rdb redis.log [root@mcw01 ~/redis]$
3.第二个机制 aof机制 ,将你的修改类的操作命令,追加到日志文件中 修改aof配置文件,添加如下参数,核心功能参数是 appendonly yes appendfsync always 总是修改类的操作 everysec 每秒做一次持久化 no 依赖于系统自带的缓存大小机制 创建aof配置文件s21aof.conf ,内容如下
新增后两条配置 daemonize yes port 6379 logfile /data/6379/redis.log dir /data/6379 appendonly yes appendfsync everysec [root@mcw01 ~/redis]$ ls 00-RELEASENOTES aofRedis.conf CONTRIBUTING deps Makefile mcwRedis.conf README.md runtest runtest-sentinel src utils 6379 BUGS COPYING INSTALL MANIFESTO rdbRedis.conf redis.conf runtest-cluster sentinel.conf tests [root@mcw01 ~/redis]$ cat aofRedis.conf #查看aof配置 daemonize yes port 6379 logfile /data/6379/redis.log dir /data/6379 appendonly yes appendfsync everysec [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis root 24760 1 0 00:02 ? 00:00:00 redis-server *:6379 [root@mcw01 ~/redis]$ kill 24760 #杀掉redis服务 [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis [root@mcw01 ~/redis]$ rm -rf /data/6379/* #删除旧的数据 [root@mcw01 ~/redis]$ redis-server aofRedis.conf #使用aof配置启动服务 [root@mcw01 ~/redis]$ ls /data/6379/ #查看已经生成aof文件,但是还没有数据。 appendonly.aof redis.log 当我再开一个窗口时,登录上时,执行keys *,是没有往aof里添加内容的。 [root@mcw01 ~]$ redis-cli 127.0.0.1:6379> keys * (empty list or set) 127.0.0.1:6379> set name mcw OK 127.0.0.1:6379> 当执行了set name mcw 这种新增语句时,就将语句写进了aof文件,如下 [root@mcw01 ~/redis]$ tailf /data/6379/appendonly.aof *2 $6 SELECT $1 0 *3 $3 set $4 name $3 mcw ^C [root@mcw01 ~/redis]$ 当我杀掉redis进程后,重新用配置文件启动服务,因为数据已经保存进aof文件了,所以没有丢失数据 [root@mcw01 ~/redis]$ ls /data/6379/ appendonly.aof redis.log [root@mcw01 ~/redis]$ ls 00-RELEASENOTES aofRedis.conf CONTRIBUTING deps Makefile mcwRedis.conf README.md runtest runtest-sentinel src utils 6379 BUGS COPYING INSTALL MANIFESTO rdbRedis.conf redis.conf runtest-cluster sentinel.conf tests [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis root 24801 1 0 00:04 ? 00:00:00 redis-server *:6379 [root@mcw01 ~/redis]$ kill 24801 [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis [root@mcw01 ~/redis]$ redis-server aofRedis.conf [root@mcw01 ~/redis]$ redis-cli 127.0.0.1:6379> keys * 1) "name" 127.0.0.1:6379> get name "mcw" 127.0.0.1:6379>
4.rdb模式下的redis持久化,不重启切换为 aof模式 环境准备 1.准备一个有数据的rdb模式的redis数据库 准备rdb配置文件 daemonize yes port 6379 logfile /data/6379/redis.log dir /data/6379 #定义持久化文件存储位置 dbfilename s21redis.rdb #rdb持久化文件 bind 127.0.0.1 #redis绑定地址 requirepass redhat # save 900 1 #rdb机制 每900秒 有1个修改记录 save 300 10 #每300秒 10个修改记录 save 60 10000 #每60秒内 10000修改记录 save 20 2 #在20秒内,超过2个修改类的操作 #详细看博客https://www.cnblogs.com/pyyu/p/10061526.html 2.注意想要永久切换为aof,还得修改配置文件方可
准备环境: [root@mcw01 ~/redis]$ ls 00-RELEASENOTES aofRedis.conf CONTRIBUTING deps Makefile mcwRedis.conf README.md runtest runtest-sentinel src utils 6379 BUGS COPYING INSTALL MANIFESTO rdbRedis.conf redis.conf runtest-cluster sentinel.conf tests [root@mcw01 ~/redis]$ cp rdbRedis.conf 2rdbRedis.conf [root@mcw01 ~/redis]$ cat 2rdbRedis.conf #复制过来一份rdb的配置文件 daemonize yes port 6379 logfile /data/6379/redis.log dir /data/6379 dbfilename mcwredis.rdb bind 127.0.0.1 save 1000 10 [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis root 24850 1 0 00:14 ? 00:00:03 redis-server *:6379 [root@mcw01 ~/redis]$ kill 24850 #杀掉redis服务 [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis [root@mcw01 ~/redis]$ rm -rf /data/6379/* #删除原有的数据 rdb模式的redis下,添加一个数据 [root@mcw01 ~/redis]$ redis-server 2rdbRedis.conf #现在已经准备好rdb的环境了 [root@mcw01 ~/redis]$ ls /data/6379/ redis.log [root@mcw01 ~/redis]$ redis-cli 127.0.0.1:6379> set name mcw OK 127.0.0.1:6379> save OK 127.0.0.1:6379> [root@mcw01 ~/redis]$ ls /data/6379/ #数据保存到rdb文件中 mcwredis.rdb redis.log [root@mcw01 ~/redis]$ redis-cli 127.0.0.1:6379> config set appendonly yes #在线修改步骤1,开启aof OK 127.0.0.1:6379> config set save "" #在线修改步骤2:关闭rdb OK 127.0.0.1:6379> [root@mcw01 ~/redis]$ ls /data/6379/ appendonly.aof mcwredis.rdb redis.log [root@mcw01 ~/redis]$ cat /data/6379/appendonly.aof #然后就可以看到aof将rdb中的数据复制了一份过来 *2 $6 SELECT $1 0 *3 $3 SET $4 name $3 mcw [root@mcw01 ~/redis]$ vim 2rdbRedis.conf [root@mcw01 ~/redis]$ cat 2rdbRedis.conf #永久修改为aof,需要修改配置文件,注释两行,添加后两行 daemonize yes port 6379 logfile /data/6379/redis.log dir /data/6379 #dbfilename mcwredis.rdb bind 127.0.0.1 #save 1000 10 appendonly yes appendfsync always [root@mcw01 ~/redis]$ [root@mcw01 ~/redis]$ [root@mcw01 ~/redis]$ ls /data/6379/ appendonly.aof mcwredis.rdb redis.log [root@mcw01 ~/redis]$ rm -rf /data/6379/mcwredis.rdb #现在可以删除rdb文件了,因为数据都同步到aof上了 [root@mcw01 ~/redis]$ ls /data/6379/ appendonly.aof redis.log [root@mcw01 ~/redis]$ [root@mcw01 ~/redis]$ 验证重启后数据是否不丢失。 [root@mcw01 ~/redis]$ [root@mcw01 ~/redis]$ [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis root 24896 1 0 01:00 ? 00:00:00 redis-server 127.0.0.1:6379 [root@mcw01 ~/redis]$ kill 24896 [root@mcw01 ~/redis]$ ps -ef|grep -v grep |grep redis [root@mcw01 ~/redis]$ redis-server 2rdbRedis.conf [root@mcw01 ~/redis]$ redis-cli 127.0.0.1:6379> keys * #重启后验证数据还在,说明已经是成功修改的。生产环境就不需要重启验证了。 1) "name" 127.0.0.1:6379> get name "mcw" 127.0.0.1:6379> [root@mcw01 ~/redis]$