Redis数据持久化
Redis数据持久化的意义
Redis的数据是存储在内存中的,数据持久化主要应用于Redis服务重启时恢复部分数据
RDB:
将内存中Redis存储的数据定期以快照的形式存储到硬盘
拍照片
AOF:
记录Redis曾经执行过的所有的写操作到文本文件
写日记
#编译安装Redis
[root@server55 ~]# ls redis-4.0.8.tar.gz
redis-4.0.8.tar.gz
[root@server55 ~]# yum -y install gcc
[root@server55 ~]# tar -xf redis-4.0.8.tar.gz
[root@server55 ~]# cd redis-4.0.8/
[root@server55 redis-4.0.8]# make && make install
[root@server55 redis-4.0.8]# ./utils/install_server.sh #一路回车
…
Installation successful!
[root@server55 redis-4.0.8]# cd
[root@server55 ~]#
#Redis服务初始化
[root@server55 ~]# ss -pantul | grep redis
tcp LISTEN 0 128 127.0.0.1:6379 *:*users:((“redis-server”,pid=4672,fd=6))
[root@server55 ~]#
RDB测试
##查看RDB相关配置
[root@server55 ~]# vim /etc/redis/6379.conf
[root@server55 ~]# sed -rn ‘219,221p;254p;264p’/etc/redis/6379.conf
save 900 1 #900s内有1个变量变化
save 300 10 #300s内有10个变量变化
save 60 10000 #60s内有10000个变量变化
dbfilename dump.rdb #rdb文件名
dir /var/lib/redis/6379 #rdb文件存储位置
[root@server55 ~]#
##验证触发RDB存储的3种情况
#手工触发
[root@server55 ~]# ls /var/lib/redis/6379/ #确认Redis数据目录为空
[root@server55 ~]# redis-cli save #save指令触发(阻塞)
OK
[root@server55 ~]# ls /var/lib/redis/6379/ #确认rdb文件生成
dump.rdb
[root@server55 ~]# rm -rf /var/lib/redis/6379/* #清理rdb文件
[root@server55 ~]# redis-cli bgsave #bgsave指令触发(非阻塞)
Background saving started
[root@server55 ~]# ls /var/lib/redis/6379/ #确认rdb文件生成
dump.rdb
[root@server55 ~]#
#服务重启触发
[root@server55 ~]# rm -rf /var/lib/redis/6379/* #清理rdb文件
[root@server55 ~]# /etc/init.d/redis_6379 restart #重启Redis服务
[root@server55 ~]# ls /var/lib/redis/6379/ #确认rdb文件生成
dump.rdb
[root@server55 ~]#
#变化规则触发
[root@server55 ~]# rm -rf /var/lib/redis/6379/* #清理rdb文件
[root@server55 ~]# redis-cli keys \*
(empty list or set)
[root@server55 ~]# vim gendata.sh #编写脚本
[root@server55 ~]# cat gendata.sh
#!/bin/bash
for i in {1..10001}
do
key=name$i
value=zs$i
redis-cli set ${key} ${value} &> /dev/null
done
[root@server55 ~]# bash gendata.sh #执行脚本生成数据
[root@server55 ~]# ls /var/lib/redis/6379/ #确认rdb文件生成
dump.rdb
[root@server55 ~]#
##利用rdb文件恢复数据
[root@server55 ~]# cp /var/lib/redis/6379/dump.rdb /opt/#备份rdb文件
[root@server55 ~]# redis-cli flushall#清空Redis数据库模拟数据损坏
OK
[root@server55 ~]# redis-cli bgsave #触发持久化存储
Background saving started
[root@server55 ~]# redis-cli keys \* #数据被清空
(empty list or set)
[root@server55 ~]# /etc/init.d/redis_6379 stop #停止服务
[root@server55 ~]# cp /opt/dump.rdb /var/lib/redis/6379/#rdb文件数据还原
cp: overwrite ‘/var/lib/redis/6379/dump.rdb’? y
[root@server55 ~]# /etc/init.d/redis_6379 start#启动服务器加载rdb文件
[root@server55 ~]# redis-cli keys \* #确认数据恢复
1) “name9813”
2) “name5207”
3) “name5300”
…
#清理测试数据
[root@server55 ~]# redis-cli flushall
OK
[root@server55 ~]# redis-cli bgsave
Background saving started
AOF测试
##查看aof相关配置
[root@server55 ~]# sed -rn ‘673p;677p;702,704p’/etc/redis/6379.conf
appendonly no
appendfilename “appendonly.aof”
# appendfsync always
appendfsync everysec
# appendfsync no
[root@server55 ~]#
#启用aof配置
[root@server55 ~]# redis-cli
127.0.0.1:6379> CONFIG SET appendonly yes #命令行做服务配置
OK
127.0.0.1:6379> CONFIG REWRITE #回写到配置文件
OK
127.0.0.1:6379> exit
[root@server55 ~]# cat /etc/redis/6379.conf | grep ^appendonly#确认回写结果
appendonly yes
[root@server55 ~]#
#测试aof记录
[root@server55 ~]# ls /var/lib/redis/6379/ #确认生成aof文件
appendonly.aof dump.rdb
[root@server55 ~]# cat /var/lib/redis/6379/appendonly.aof#查看文件内容,此时为空
[root@server55 ~]# redis-cli set a 1 #存入数据
OK
[root@server55 ~]# redis-cli set b 2
OK
[root@server55 ~]# redis-cli set c 3
OK
[root@server55 ~]# cat /var/lib/redis/6379/appendonly.aof#查看文件内容,此时不为空
*2
$6
SELECT
$1
0
*3
$3
set
$1
a
$1
1
*3
$3
set
$1
b
$1
2
*3
$3
set
$1
c
$1
3
[root@server55 ~]#
#测试aof文件恢复数据
[root@server55 ~]# cp /var/lib/redis/6379/appendonly.aof /opt/#备份aof文件
[root@server55 ~]# redis-cli flushall #清空数据
OK
[root@server55 ~]# /etc/init.d/redis_6379 stop #停止服务
[root@server55 ~]# rm -rf /var/lib/redis/6379/* #清理已有aof文件
[root@server55 ~]# cp /opt/appendonly.aof /var/lib/redis/6379/#拷贝备份aof文件
[root@server55 ~]# /etc/init.d/redis_6379 start #启动服务
[root@server55 ~]# redis-cli keys \* #确认数据恢复
1) “b”
2) “c”
3) “a”
[root@server55 ~]#
#aof文件修复
[root@server55 ~]# /etc/init.d/redis_6379 stop #停Redis服务
[root@server55 ~]# echo aaaaaa >>/var/lib/redis/6379/appendonly.aof #模拟aof文件损坏
[root@server55 ~]# /etc/init.d/redis_6379 start #启Redis服务
[root@server55 ~]# ss -pantul | grep redis #服务启动失败
[root@server55 ~]# tail -1 /var/log/redis_6379.log #查看日志内容
49447:M 28 May 17:50:50.742 # Bad file format reading the append onlyfile: make a backup of your AOF file, then use ./redis-check-aof –fix<filename>
[root@server55 ~]# redis-check-aof –fix/var/lib/redis/6379/appendonly.aof #修复aof文件
0x 68: Expected prefix ‘*’, got: ‘a’
AOF analyzed: size=111, ok_up_to=104, diff=7
This will shrink the AOF from 111 bytes, with 7 bytes, to 104bytes
Continue? [y/N]: y #输入y确认
Successfully truncated AOF
[root@server55 ~]# /etc/init.d/redis_6379 start#启动服务(报错pid文件已存在)
/var/run/redis_6379.pid exists, process is already running orcrashed
[root@server55 ~]# rm -rf /var/run/redis_6379.pid#删除空的pid文件
[root@server55 ~]# /etc/init.d/redis_6379 start #启动服务
Starting Redis server…
[root@server55 ~]# ss -pantul | grep redis
tcp LISTEN 0 128 127.0.0.1:6379 *:*users:((“redis-server”,pid=49486,fd=6))
[root@server55 ~]# redis-cli keys \* #确认数据恢复
1) “b”
2) “c”
3) “a”