持久化
自建Redis镜像
由于docker hub暂时不能正常使用,故使用自建阿里云docker镜像,这里仅仅记录一下,可以直接跳到后面的安装
docker pull registry.cn-hangzhou.aliyuncs.com/yeswater/redis:7.2.4
遇到的问题
docker desktop 和 virtual box切换
这两个虚拟的产品之间应该有兼容性问题,需要在执行windows cmd 切换一下
bcdedit /set hypervisorlaunchtype auto
windows 执行上述命令然后重启,可正常使用docker desktop
科学上网,拉取镜像,上传到个人阿里云镜像仓库
bcdedit /set hypervisorlaunchtype off
windows 执行上述命令然后重启,可正常使用virtual box
使用虚拟机操作docker镜像
docker安装 Redis
步骤:
- 创建
conf
和data
文件夹,方便后边挂载- 复制官网 链接
redis.conf
文件,方便后面正常启动镜像- 拉取镜像
- 启动
官网redis.conf
https://github.com/redis/redis/blob/unstable/redis.conf
mkdir -p /usr/local/redis7.2.4/conf
mkdir -p /usr/local/redis7.2.4/data
touch /usr/local/redis7.2.4/conf/redis.conf#开启远程权限
bind 0.0.0.0 docker run --name redis7.2.4 \
-v /usr/local/redis7.2.4/data:/data \
-v /usr/local/redis7.2.4/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-p 6379:6379 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis.conf
redis-server /usr/local/etc/redis/redis.conf
指定配置文件位置
遇到的问题
通过第三方软件连接会报错
设置Redis密码 可解决该问题
docker exec -it reids7 /bin/bash
reids-cli
config set requirepass 123456
RDB
记录数据快照
RDB 自动触发
创建 dumpfiles
文件夹
配置
五秒内 set 达到2次就记录dump文件
dump文件路径
dump文件名
实操演示
5秒内插入4条数据
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> set k4 v4
OK
127.0.0.1:6379>
/data/dumpfiles
目录下自动生成 dump6379.rdb
文件
验证持久化
重启后keys *
能够看到数据
1、备份文件
dump.rdb
移动到 redis设置的dump文件目录下,即可恢复数据2、建议备份文件和服务放在不同主机
RDB 手动触发
save和 bgsave
1、
save
会阻塞redis 服务器2、
bgsave
会fork()
一个子进程,由子进程复制持久化过程。可以用lastsave
检查是否执行成功
save 案例
前面设置了save 5 1
这里只插入一条数据,执行save
,观察 dump 文件修改时间,可见持久化成功
bgsave 案例
前面设置了save 5 1
这里只插入一条数据,执行bgsave
,观察 dump 文件修改时间,可见持久化成功
执行lastsav
可以得到持久化成功时间,由此判断是否持久化成功
RDB的缺点
1、宕机时RDB会丢失未持久化的数据
2、数据量大时,会增加IO消耗
3、fork (克隆主线程)会复制一份内存,消耗内存
RDB丢失数据演示
使用
docker restart
或shutdown
且未设置AOF
,重启前会备份当前数据使用
flushall
、flushdb
会生成空 dump 文件所以这里演示,直接 kill 进程
1、set k6 v6
,此时不满足save 5 2
2、直接 kill -9 redis-server
3、再启动 redis ,查看数据,观察可见 k6 v6
未被持久化,数据丢失
禁用RDB
RDB优化参数
save <seconds> <changes>
dbfilename
dir
stop-writes-on-bgsave-error 数据一致性
rdbcompression 压缩快照
rdbchecksum 数据校验
rdb-del-sync-flies 在没有快起持久化的情况下删除复制生成的 rdb 文件
AOF
记录写操作日志
工作流程
写回策略
always: 每次写入
everysec:每秒写入
no:操作系统决定写入
开启AOF
文件&路径
redis 6:一个文件,和rdb共用路径
redis 7:三个文件,新路径为 dir + appenddirname
演示
在dir + appenddirname 路径下,生成三个文件
只有在 set 时,aof 文件会更新,get 时 aof 不会更新,其他两个文件 get set 都不会更新
AOF重写机制
AOF持久化是Redis持久将命令记录到AOF文件,随着Redis的运行,AOF文件会变大,当AOF文件大小操作设定的值,Redis就会自动启动AOF文件压缩,只保留可以恢复数据的最小指令集
也可以手动重写
bgrewriteaof
默认自动触发规则:操作上次rewrite大小的100% (达到上次的两倍) 且 文件大于 64 M时
第一次达到 auto-aof-rewrite-min-size
时会重写 (演示如下)
演示
这里auto-aof-rewrite-min-size
设为 1k
aof-use-rdb-preamble
设为 no
演示
set操作
aof文件变化
RDB 和 AOF对比
AOF+RDB 混合模式
RDB镜像做全量持久化,AOF做增量持久化
先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。这样的话,重启服务的时候会从RDB和AOF两部分恢复数据,既保证了数据完整性,又提高了恢复数据的性能。
aof-use-rdb-preamble
设为 yes
演示