首页>>帮助中心>>云服务器redis数据持久化

云服务器redis数据持久化

2023/8/29 650次
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"