【2023】Redis数据持久化

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【2023】Redis数据持久化

1.为什么需要Redis持久化

Redis是基于内存的NoSQL数据库,读写速度很快,但是存储在内存中的Redis数据会在服务器重启后丢失。

然而在一些场景中,需要长久的保存数据,所以需要把内存中的数据持久化的保存在硬盘中。

Redis持久化提供两种方式:

1️⃣:AOF(Append Only File)只追加文件

2️⃣:RDB(Redis DataBase)基于Redis数据库

2.Redis持久化机制概述

2.1.基于AOF的持久化机制

Redis的AOF持久化是指将数据存储到二进制日志文件中,以便在重启或出现故障时可以恢复数据。

AOF持久化会周期性地将数据写入到日志文件中,因此可以实现更高的数据备份频率。

在使用基于AOF的持久化方式时,需要注意以下几点:

  • 写入日志文件的数据会占用一定的存储空间,因此需要考虑磁盘空间的问题。
  • 基于AOF的持久化方式需要消耗一定的系统资源,包括写入日志文件的时间和空间、维护AOF文件的开销等。因此在高并发场景下,需要根据实际情况进行调整。
  • 基于AOF的持久化方式可以通过配置日志文件的大小和频率来调整备份数据的频率和大小,以满足不同场景的需求。
  • 在使用基于AOF的持久化方式时,需要注意防止系统故障或重启导致数据丢失,可以通过定期备份或使用其他持久化方式(如RDB持久化)来增强数据保护能力。

2.2.基于RDB的持久化机制

基于RDB的持久化方式会把当前内存中所有Redis键值对数据以快照(snapshot)的方式写入硬盘文件中,如果需要恢复数据,就把快照文件读到内存中。

RDB持久化的主要优点是数据可以快速恢复,而且不需要消耗太多的系统资源。

但是,RDB持久化也有一些缺点,如数据在内存中的写入和查询效率可能会受到一定的影响,并且RDB持久化方式不支持快速的数据备份和恢复。

因此,在实际应用中,需要根据具体场景选择适合的持久化方式。

3.AOF持久化机制实战

3.1.AOF方式持久化机制实战

可以通过设置配置文件里的参数来启动或停止AOF持久化机制,由于基于AOF的持久化方式具有实时存储的特性,因此可以在读写关键数据时开启,以防因Redis重启或故障而导致的风险。

AOF配置文件参数说明:通过redis.conf来配置AOF

  • 开启AOF持久化,关闭注视掉即可
appendonly yes
  • 设置持久化策略(always、everysec、no)
appendfsync everysec

1️⃣:always:每次触发写操作都会触发持久化操作,可能会影响redis自身及redis服务器性能

2️⃣:everysec:会以1秒频率触发持久化动作,这种方式能很好平衡持久化需求和性能间关系

3️⃣:no:由操作系统决定持久化频率,这种方式对其他另外两种而言性能最好,但可能每次持久化操作间的间隔有些长,这样当故障发生时可能会丢失较多的数据。

  • 持久化文件所在路径和文件名
dir ./
appendfilename "appendonly.aof"
  • 平衡性能与安全性:取值为yes,那么在重写AOF文件时能提升性能,但可能在重写AOF文件时丢失数据;如果取值为no,则不会丢失数据,但较取值为yes的性能可能会降低。
no-appendfsync-on-rewrite no
  • 指定重写条件:如果当前的AOF文件比上次执行重写时的文件大100%时会再次触发重写操作。如果该参数取值为0,则不会触发重写操作。
auto-aof-rewrite-percentage 100
  • 指定触发重写时AOF文件大小
auto-aof-rewrite-min-size 64mb

注意:,由auto-aof-rewrite-percentageauto-aof-rewrite-min-size两个参数指定的重写条件是“And”的关系,即只有当同时满足这两个条件时才会触发重写操作,比如当前AOF文件的大小小于auto-aof-rewrite-min-size参数指定的值,哪怕文件增幅达到no-appendfsync-on- rewrite参数指定的范围,也不会触发重写操作。

实践:

  • 配置reids AOF持久化配置文件:redis.conf,配置后重启redis
dir /data
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

注意:启动redis时指定配置文件

redis-server /path/to/redis.conf
  • 连接redis服务器,创建一些数据
[root@localhost ~]# redis-cli 
127.0.0.1:6379> get name001
(nil)
127.0.0.1:6379> set name001 'xiaoming'
OK
127.0.0.1:6379> set age001 30
OK

如果配置成功,当前是开启AOF持久化的,应该会有数据

[root@localhost redis-6.2.12]# cd /data/
[root@localhost data]# ls
appendonly.aof
[root@localhost data]# cat appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
set
$7
name001
$8
xiaoming
*3
$3
set
$6
age001
$2
30

以上数据即为持久化文件的内容:

选择0号数据库,插入两条键值对

3.2.重写AOF文件的效果

  • 向数据库插入一个列表
[root@localhost ~]# redis-cli
127.0.0.1:6379> lpush namelist "yy1"
(integer) 1
127.0.0.1:6379> lpush namelist "yy2"
(integer) 2
127.0.0.1:6379> lpush namelist "yy3"
(integer) 3
127.0.0.1:6379> lpush namelist "yy4"
(integer) 4
  • 查看持久化文件内容
*3
$5
lpush
$8
namelist
$3
yy1
*3
$5
lpush
$8
namelist
$3
yy2
*3
$5
lpush
$8
namelist
$3
yy3
*3
$5
lpush
$8
namelist
$3
yy4
  • 运行bgrewriteaof命令手动触发AOF文件的重写动作,然后打开文件查看
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started
REDIS0009ú      redis-ver^F6.2.12ú
redis-bitsÀ@ú^EctimeÂ^<8b><91>dú^Hused-memÂHW^M^@ú^Laof-preambleÀ^Aþ^@û^C^@^@^Fage001À^^^@^Gname001^Hxiaoming^N^Hnamelist^A^_^_^@^@^@^Y^@^@^@^D^@^@^Cyy4^E^Cyy3^E^Cyy2^E^Cyy1ÿÿ^?d^_5µ<82>{^?

3.3.模拟数据恢复

  • 停止该redis服务器并重新启动一个新的服务器
[root@localhost data]# ps -ef | grep 6379
root       1943      1  0 19:03 ?        00:00:03 redis-server 127.0.0.1:6379
root       1993   1314  0 19:24 pts/0    00:00:00 grep --color=auto 6379
[root@localhost data]# kill -9 1943
redis-server /root/redis-6.2.12/redis.conf 
  • 连接服务器查看数据、创建数据、清空内存数据
127.0.0.1:6379> get name001
"xiaoming"
127.0.0.1:6379> get age001
"30"
127.0.0.1:6379> set name002 xiaoli
OK
127.0.0.1:6379> set age002 21
OK
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> get name002
(nil)
127.0.0.1:6379> get age002
(nil)
  • 查看持久化文件,包含刚才执行的数据
*3
$3
set
$7
name002
$6
xiaoli
*3
$3
set
$6
age002
$2
21
*1
$8
FLUSHALL
  • 退出客户端,停止运行redis服务器,删除持久化文件中的FLUSHALL,不然执行后还会清空
  • 重启启动redis服务器,查看数据
[root@localhost ~]# redis-cli 
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> get name002
"xiaoli"
127.0.0.1:6379> get age002
"21"

看到此内容证明恢复成功

3.4.修复AOF文件

报错:

"Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>"

代表AOF文件格式不正确

解决:

redis-check-aof --fix /data/appendonly.aof

后面加你自己的aof文件路径,即可修复成功。

文件损坏也会导致redis启动失败。

4.RDB持久化机制实践

在基于RDB的持久化机制里会定时把Redis内存数据以快照的方式保存到硬盘上,而在必要的时候可以通过快照文件来恢复数据。

4.1.修改基于RDB的配置文件

  • 为了方便区分,先把基于AOF的配置关闭,只配置RDB相关配置
appendonly no
save 600 1
save 300 100
save 60 1000

1️⃣:第1行代码表示当在600秒内有1个或1个以上的键被修改时就会生成快照

2️⃣:第2行代码表示在300秒内有大于或等于100个键被修改时就会生成快照

3️⃣:第3行表示在60秒内有大于或等于1000个键被修改时会生成快照。

注意:三者是或的关系,满足一条即可触发

  • 设置文件名及路径
dbfilename dump.rdb
dir /data

4.2.创建Redis服务器进行测试

  • 启动redis服务器
[root@localhost redis-6.2.12]# redis-server redis.conf 
  • 连接服务器创建一条数据
[root@localhost ~]# redis-cli
127.0.0.1:6379> set id001 001
OK
127.0.0.1:6379> set id002 002
OK
  • 此时已经有rdb文件
[root@localhost redis-6.2.12]# cd /data/
[root@localhost data]# ls
appendonly.aof  dump.rdb
[root@localhost data]# cat dump.rdb 
REDIS0009 redis-ver6.2.12
redis-bits󿿀򳨭eÊused-mem@V
aof-preamble@r¶ [root@localhost data]# Xshell
  • 恢复数据与AOF类似,停止服务器重启创建即可自动恢复数据。

5.如何选用持久化方式

在Redis里,基于AOF和RDB的两种持久化方式有各自的优缺点,所以它们有各自的应用场合。

5.1.对比两种持久化方式

Redis有两种持久化方式,分别是RDB(Redis DataBase)和AOF(Append-Only File)。

RDB的优点:

  1. RDB使用一种紧凑的二进制格式来存储数据,因此它的速度非常快。在恢复大量数据时,它通常比AOF快得多。
  2. RDB对于在磁盘上的数据备份和恢复非常有用,用于灾难恢复和数据迁移。

RDB的缺点:

  1. RDB快照是定期执行的,而不是实时执行,所以如果Redis在快照之间崩溃,您将丢失最新的数据。
  2. RDB无法保证数据的实时性,因为您需要配置多久进行一次快照,并在磁盘之间传输大量的数据。

AOF的优点:

  1. AOF以追加方式记录每个写操作,因此能够实时记录每个数据更改,更加可靠。
  2. AOF提供了更好的数据安全保障,因为它通过记录每个写操作来避免数据的丢失。

AOF的缺点:

  1. AOF记录每个写操作,因此它的速度比RDB慢,尤其在写操作比较频繁时更加明显。
  2. AOF生成的日志文件可能比较大,因此需要定期进行压缩和清理。

综上所述,RDB在执行速度和备份恢复上优于AOF,但无法保证数据的实时性;而AOF在数据安全方面更有保障,但会对性能产生影响。因此,选择哪种持久化方式应该根据具体业务需求和应用场景来确定。Redis有两种持久化方式,分别是RDB(Redis DataBase)和AOF(Append-Only File)。

5.2.综合使用两种持久化方式

因为两种持久化方式各有优缺点,所以可以两种方式都开启。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
|
7天前
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略,分为淘汰易失数据和淘汰全库数据两大类。易失数据淘汰策略包括:volatile-lru、volatile-lfu、volatile-ttl 和 volatile-random;全库数据淘汰策略包括:allkeys-lru、allkeys-lfu 和 allkeys-random。此外,还有 no-eviction 策略,禁止驱逐数据,当内存不足时新写入操作会报错。
37 16
|
27天前
|
监控 NoSQL Java
场景题:百万数据插入Redis有哪些实现方案?
场景题:百万数据插入Redis有哪些实现方案?
36 1
场景题:百万数据插入Redis有哪些实现方案?
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
|
7天前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
39 14
|
7天前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用哈希槽分区算法,共有16384个哈希槽,每个槽分配到不同的Redis节点上。数据操作时,通过CRC16算法对key计算并取模,确定其所属的槽和对应的节点,从而实现高效的数据存取。
33 13
|
7天前
|
存储 NoSQL Redis
Redis的数据过期策略有哪些 ?
Redis 采用两种过期键删除策略:惰性删除和定期删除。惰性删除在读取键时检查是否过期并删除,对 CPU 友好但可能积压大量过期键。定期删除则定时抽样检查并删除过期键,对内存更友好。默认每秒扫描 10 次,每次检查 20 个键,若超过 25% 过期则继续检查,单次最大执行时间 25ms。两者结合使用以平衡性能和资源占用。
29 11
|
7天前
|
监控 NoSQL 测试技术
【赵渝强老师】Redis的AOF数据持久化
Redis 是内存数据库,提供数据持久化功能,支持 RDB 和 AOF 两种方式。AOF 以日志形式记录每个写操作,支持定期重写以压缩文件。默认情况下,AOF 功能关闭,需在 `redis.conf` 中启用。通过 `info` 命令可监控 AOF 状态。AOF 重写功能可有效控制文件大小,避免性能下降。
|
7天前
|
存储 监控 NoSQL
【赵渝强老师】Redis的RDB数据持久化
Redis 是内存数据库,提供数据持久化功能以防止服务器进程退出导致数据丢失。Redis 支持 RDB 和 AOF 两种持久化方式,其中 RDB 是默认的持久化方式。RDB 通过在指定时间间隔内将内存中的数据快照写入磁盘,确保数据的安全性和恢复能力。RDB 持久化机制包括创建子进程、将数据写入临时文件并替换旧文件等步骤。优点包括适合大规模数据恢复和低数据完整性要求的场景,但也有数据完整性和一致性较低及备份时占用内存的缺点。
|
1月前
|
存储 缓存 NoSQL
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
37 2
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比