01,持久化
1.RDB持久化和AOF持久化
RDB: 类似于快照,当前内存⾥的数据的状态持久化到硬盘
优点:压缩格式/恢复速度快
缺点:不是实时的,可能会丢数据,操作⽐较重量
AOF:类似于mysql的binlog,可以设置成每秒/每次操作都以追加的形式保存在⽇志⽂件中
优点:安全,最多只损失1秒的数据,具备⼀定的可读性
缺点:⽂件⽐较⼤,恢复速度慢
2.RDB持久化流程图
3.配置RDB持久化
save 900 1
save 300 10
save 60 10000
dbfilename redis.rdb
dir /data/redis_cluster/redis_6379
4.RDB持久化结论:
没配置save参数时:
1.shutdown/pkill/kill都不会持久化保存
2.可以⼿动执⾏bgsave
配置save参数时:
1.shutdown/pkill/kill均会⾃动触发bgsave持久化保存数据
2.pkill -9 不会触发持久化
恢复时:
1.持久化数据⽂件名要和配置⽂件⾥定义的⼀样才能被识别
2.RDB⽂件只有⼀个数据⽂件,迁移和备份只要这⼀个RDB⽂件即可
注意:
RDB⾼版本兼容低版本,低版本不能兼容⾼版本
3.x >> 5.X >> OK
5.x >> 3.x >> NoOK
⽇志内容:
8952:M 13 Apr 2020 17:33:12.947 # User requested shutdown...
8952:M 13 Apr 2020 17:33:12.947 * Saving the final RDB snapshot before
exiting.
8952:M 13 Apr 2020 17:33:12.947 * DB saved on disk
8952:M 13 Apr 2020 17:33:12.947 * Removing the pid file.
8952:M 13 Apr 2020 17:33:12.947 # Redis is now ready to exit, bye bye...
5.AOF流程图
6.AOF持久化配置
appendonly yes
appendfilename "redis.aof"
appendfsync everysec
7.AOF重写机制
实验流程:
执⾏的命令 aof记录 redis⾥的数据
set k1 v1 set k1 k1
set k2 v2 set k1 k1 k2
set k2
set k3 v3 set k1 k1 k2 k3
set k2
set k3
del k1 set k1 k2 k3
set k2
set k3
del k1
del k2 set k1 k3
set k2
set k3
del k1
del k2
aof⽂件⾥实际有意义的只有⼀条记录:
set k3
操作命令:
BGREWRITEAOF
8.AOF和RDB读取实验
实验背景:
aof和rdb同时存在,redis重启会读取哪⼀个数据?
实验步骤:
set k1 v1
set k2 v2
bgsave rbd保存 k1 k2
mv redis.rdb /opt/
flushall
set k3 v3
set k4 v4 aof保存 k3 k4
mv redis.aof /opt/
redis-cli shutdown
rm -rf /data/redis_6379/*
mv /opt/redis.aof /data/redis_6379/
mv /opt/redis.rdb /data/redis_6379/
systemctl start redis
实验结论:
当aof和rdb同时存在的时候,redis会优先读取aof的内容
9.AOF模拟故障
损坏实验结论:
1.aof修复命令不要⽤,因为他的修复⽅案⾮常粗暴,⼀⼑切,从出错的地⽅到最后全部删除
2.任何操作之前,先备份数据
kill -9 实验:
for i in {1..10000};do redis-cli set key_${i} v_${i} && echo "${i} is
ok";done
ps -ef|grep redis|grep -v grep|awk '{print "kill -9",$2}'
结论:
aof相对⽐较安全,最多丢失1秒数据
10.如果设置了过期时间,恢复数据后会如何处理?
1.aof⽂件会记录下过期时间
2.恢复的时候会去对⽐过期时间和当前时间,如果超过了,就删除key
3.key的过期时间不受备份影响
11.AOF和RDB如何选择
https://redis.io/topics/persistence
1.开启混合模式
2.开启aof
3.不开启rdb
4.rdb采⽤定时任务的⽅式定时备份
5.可以从库开启RDB进⾏备份
02,redis⽤户验证
1.配置密码认证功能
requirepass 123456
2.使⽤密码
第⼀种:
[root@db01 ~]# redis-cli
127.0.0.1:6379> set k1 v1
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> keys *
1) "k1"
第⼆种:
[root@db01 ~]# redis-cli -a '123456' get k1
Warning: Using a password with '-a' or '-u' option on the command line
interface may not be safe.
"v1"
3.为什么redis的密码认证这么简单?
1.redis⼀般都部署在内⽹环境,默认是相对⽐较安全的
2.有同学担⼼密码写在配置⽂件⾥,不⽤担⼼,因为开发不允许SSH登陆到Linux服务器,但是可
以远程连接Redis,所以设置密码还是有作⽤的
03,禁⽤或重命名危险命令
1.禁⽤危险命令
rename-command KEYS ""
rename-command SHUTDOWN ""
rename-command CONFIG ""
rename-command FLUSHALL ""
2.重命名危险命令
rename-command KEYS "QQ526195417"
rename-command SHUTDOWN ""
rename-command CONFIG ""
rename-command FLUSHALL ""