首页 > 数据库 >Redis 数据持久化方案

Redis 数据持久化方案

时间:2023-10-28 21:04:13浏览次数:57  
标签:AOF 持久 方案 Redis redis 文件 RDB 执行

今日目标

  • 掌握Redis数据持久化原理

在分布式系统中,存储非结构化数据的中间件Redis是必不可少的,Redis在小、中、大甚至高并发系统中都有发挥起作用的场合,在之前我已经给大家介绍过Redis的基础数据结构(String/Hash/Set/ZSet/List)的增删改查操作。

现在思考一个问题,Redis 如果仅仅只是将数据缓存在内存里面,如果 Redis 宕机了再重启,那么存储在内存中的数据是不是就全部丢失了,这是不是严重的生产事故?如何解决这样的问题?这就用到了我今天要介绍的内容Redis持久化机制,他在将数据写到内存的同时,也在异步的将数据写入磁盘,进行数据持久化

1. Dcoekr安装Redis

我们演示Redis,因为之前已经介绍过Docker,所以我们现在以后的演示,都是使用Docker安装

  • 1.配置文件
mkdir -p /redis/data
mkdir -p /redis/config
cd /redis/config/
#`redis.conf`文件内容`http://download.redis.io/redis-stable/redis.conf`,redis的配置文件
curl -O -L http://download.redis.io/redis-stable/redis.conf
  • 2.启动Docker
docker run -d \
--name redis \
-e TZ=Asia/Shanghai \
-e LANG=en_US.UTF-8 \
-v /redis/data:/data \
-v /redis/config/redis.conf:/etc/redis/redis.conf \
-p 6379:6379 \
--restart unless-stopped \
redis:6.0.20

命令解读

  • docker run :创建并运行redis容器
  • --name : 给redis容器名字为redis
  • -p 6379:6379:这是Redis的主要端口,该端口号用于Redis客户端与Redis服务器之间的通讯,冒号左侧是宿主机端口,右侧是容器端口
  • -e TZ=Asia/Shanghai: 设置时区
  • -e  LANG=en_US.UTF-8: 设置编码格式
  • -d:后台运行容器
  • redis:6.0.20:镜像名称以及版本
  • 3.检验是否安装成功
docker ps

Redis 数据持久化方案_Redis

2.Redis持久化

好了我们已经完成了Redis的安装,现在了介绍Redis持久化,Redis持久化方案有两种:

  • RDB持久化
  • AOF持久化

3. RDB持久化

RDB(Redis DataBase Backup file):Redis数据备份文件,也叫Redis数据快照。可以理解为将Redis所有数据进行备份到磁盘,当Redis出现宕机重启的时候,就会读取磁盘中快照文件,进行数据恢复。

3.1. RDB执行时机

RDB在四种情况下会执行持久化:

  • 1.执行save命令
  • 2.执行bgsave命令

  1. Redis停机时(默认执行一次save)

  1. 触发执行RDB条件

3.1.1.执行save命令进行RDB持久化

执行下面的命令,可以立即执行一次RDB,那么接下来就演示一下:

【步骤一】 进入redis容器
## 进入redis容器内部
 docker exec -it redis bash
【步骤二】 执行redis-cli
redis-cli

Redis 数据持久化方案_redis_02

【步骤三】 新打开一个窗口用于查看Redis日志
docker logs -f redis

注意:-f 参数表示实时跟踪容器的日志输出,即将新的日志输出实时打印出来,直到手动停止程序

Redis 数据持久化方案_数据_03

【步骤四】 在redis客户端执行save命令,并查看Redis日志
save

只有执行save命令,日志中就会出现DB saved

Redis 数据持久化方案_Redis_04

注意:save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。

3.1.2.执行bgsave命令进行RDB持久化

在执行save命令的时候我们已经进入了redis客户端,以及redis日志,那么现在我们只需要执行命令进行查看即可

【步骤一】 在redis客户端执行bgsave命令,并查看Redis日志
bgsave

结果如下:

Redis 数据持久化方案_redis_05

注意:bgsave命令执行后会开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响

3.1.3.Redis停机是RDB持久化

Redis停机时会执行一次save命令,实现RDB持久化。

【步骤一】 暂停redis容器
docker stop redis
【步骤二】 查看redis日志

结果如下:说在退出redis之前进行一次RDF

Redis 数据持久化方案_redis_06

3.1.4. 触发RDB条件(理解Save格式即可)

Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

# 900秒内,如果超过1个key被修改,则发起快照保存
save 900 1
# 300秒内,如果超过10个key被修改,则发起快照保存
save 300 10
# 60秒内,如果1万个key被修改,则发起快照保存
save 60 10000

使用vim /redis/config/redis.conf,进行添加配置

Redis 数据持久化方案_Redis_07

注意:配置完成后,执行命令是bgsave , 如果是save "" 则表示禁用RDB

修改保存后重启redis,然后再进行数据的保存,来查看规则是否生效

docker restart redis

RDB的其它配置也可以在redis.conf文件中设置

# 是否压缩 ,建议不开启,压缩也会消耗cpu,磁盘的话不值钱
rdbcompression yes

# RDB文件名称
dbfilename dump.rdb  

# 文件保存的路径目录
dir ./

3.2. RDB原理

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。

fork采用的是copy-on-write技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

Redis 数据持久化方案_redis_08

RDB总结

RDB方式bgsave的基本流程

  • fork主进程得到一个子进程,共享内存空间
  • 子进程读取内存数据并写入新的RDB文件
  • 用新RDB文件替换旧的RDB文件

RDB会在什么时候执行

  • 默认是服务停止时

save 60 1000代表什么含义

  • 代表60秒内至少执行1000次修改则触发RDB

RDB的缺点

  • RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险
  • fork子进程、压缩、写出RDB文件都比较耗时

4.AOF持久化

AOF(Append Only File)文件追加:    Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。

4.1. AOF配置

AOF默认关闭,需要在redis.conf文件中尽显配置开启AOF:

# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"

Redis 数据持久化方案_redis_09

Redis 数据持久化方案_持久化_10

AOF的命令记录的频率也可以通过redis.conf文件来配

appendfsync everysec是默认方案

# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always 
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec 
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no

Redis 数据持久化方案_redis_11

思考:AOF默认配置下,会丢失数据?

AOF默认是会丢失数据的,但是最多也就丢失一秒数据

4.2. AOF配置策略对比

配置项

刷盘时机

优点

缺点

Always

同步刷盘

可靠性高,几乎不丢数据

性能影响大

everysec

每秒刷盘

性能适中

最多丢失1秒数据

no

操作系统控制

性能最好

可靠性较差,可能丢失大量数据

4.2. AOF文件重写

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

  • 在redis控制台执行
bgrewriteaof

发现开始完成文件写入

Redis 数据持久化方案_持久化_12

Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置

# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写 
auto-aof-rewrite-min-size 64mb

Redis 数据持久化方案_redis_13

AOF和RDB优缺点对比


RDB

AOF

持久化方式

定时对整个内存做快照

记录每一次执行的命令

数据完整性

不完整,两次备份之间会丢失

相对完整,取决于刷盘策略

文件大小

会有压缩,文件体积小

记录命令,文件体积很大

宕机恢复速度

很快


数据恢复优先级

低,因为数据完整性不如AOF

高,因为数据完整性更高

系统资源占用

高,大量CPU和内存消耗

低,主要是磁盘IO资源 但AOF重写时会占用大量CPU和内存资源

使用场景

可以容忍数分钟的数据丢失,追求更快的启动速度

对数据安全性要求较高常见

AOF和RDB的选择

在实际生产中我们如何选择AOF和RDB持久化呢?实际上他们两个是相互辅助的

  • 不能只设置RDB,因为只设置RDB会导致数据大量丢失(两次保存时间间隔的数据会丢失)
  • 不能只设置AOF,因为当 AOF 文件非常大时,恢复过程可能需要较长时间,RDB相对于AOF更加健壮,可以避免 AOF 这种复杂的备份和恢复机制的 bug;
  • Redis 支持同时开启开启两种持久化方式,我们可以综合使用 AOF 和 RDB 两种持久化机制,用 AOF 来保证数据不丢失,作为数据恢复的第一选择;用 RDB 来做不同程度的冷备,在 AOF 文件都丢失或损坏不可用的时候,还可以使用 RDB 来进行快速的数据恢复

标签:AOF,持久,方案,Redis,redis,文件,RDB,执行
From: https://blog.51cto.com/maguobin/8072894

相关文章

  • 【深度学习 | 概念】那些深度学习路上必经的 常见问题解决方案及最佳实践,确定不来看看
    ......
  • [ Redis 2 ] 持久化
    Redis_2持久化1.Redis.conf详解redis.conf从上向下详解1.1单位配置1redis对单位的大小写是不敏感的,单位可以是gb,GB,Gb等等。2可以包含其他配置文件的配置1.2网络配置绑定的ip和端口号bind127.0.0.1protected-modeyes#保护模式port63791.3通用配置Gener......
  • 为什么Spring和IDEA不推荐使用@Autowired注解,有哪些替代方案?
    引言在使用Spring框架和JetBrainsIDEA集成开发环境(IDE)进行Java开发时,你可能经常会遇到@Autowired注解。@Autowired是Spring框架中用于实现依赖注入的核心注解之一。然而,近年来,Spring和IDEA都不再推荐使用@Autowired注解,并提出了更好的替代方案。本文将详细分析为什么Spring和IDE......
  • 机房WSUS服务器搭建方案-概述
    拓扑如下单个WSUS服务器在单个WSUS服务器方案中,在服务器内部网络建立一个运行WSUS的服务器,它直接将内容与MicrosoftUpdate同步,然后再将更新分发到客户端计算机,如上图所示。有几点需要注意:1.如果已经有其它IIS站点了,安装时不能选择IIS默认网站。2.WSUS服务器必须安装BIT......
  • 企业网络建设之二层网络技术优化方案
    一、概述目前绝大部分大型网络的网络设备数量较多,网络结构较为复杂,然而大部分网络出现问题时,多数是由于二层协议造成的网络中断,影响规模较大,导致用户无法正常业务及上网办公等问题,其实目前的二层网络技术已有一定积累,能够解决绝大部分的二层网络问题,为此结合大型二层网络架构提供技......
  • redis缓存更新策略,缓存穿透,缓存雪崩,缓存击穿。封装redis工具类
    (redis缓存)缓存是存储数据的临时地方,一般读写性能高1.给商铺添加缓存思路:在对应的serviceImpl里写逻辑@OverridepublicResultqueryById(Longid){Stringkey=CACHE_SHOP_KEY+id;//1.从redis查询商铺缓存StringshopJSON=stringRedisTemplate.opsF......
  • Linux 下使用 Docker 安装 Redis
    1、下载redisdockerpullredis:6.2.62、提前创建挂载目录mkdir-p/mydata/redis/confmkdir-p/mydata/redis/datamkdir-p/mydata/redis/logtouch/mydata/redis/conf/redis.conftouch/mydata/redis/log/redis.logchmod777/mydata/redis/log/redis.log3、启......
  • IBM V7000微码升级方案
    目录第一章升级时间3第二章微码升级步骤3第三章应急预案9升级时间每一个结点的软件升级耗时大约30–40分钟。GUI会显示“Complete”。整个V7000的软件升级耗时大约90-120分钟。注意:微码升级过程中,可能会导致主机意外的硬件或是软件故障,需要为修复这些故障预留足够的服务......
  • java——redis随笔——实战——优惠券秒杀
    黑马视频地址:https://www.bilibili.com/video/BV1cr4y1671t?p=49&spm_id_from=pageDriver&vd_source=79bbd5b76bfd74c2ef1501653cee29d6 csdn地址:https://blog.csdn.net/weixin_50523986/article/details/131815165          stringRedisTemplate.......
  • CentOS 7.9 Redis 设置开机自启动
    https://blog.csdn.net/aikudexiaohai/article/details/130102729一、背景说明由于安装的redis,不会自动生成systemctl相关的系统命令,每次启动、重启、停止、查看redis状态,不太方便。可以通过如下步骤,创建系统文件,可以通过标准的systemctl命令方便执行redis的相关操作。......