高并发核心技术Redis系列(五)--------持久化和事务(上)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 由于Redis的数据都存放在内存中,如果没有配置持久化,Redis重启后数据就全丢失了,于是需要开启Redis的持久化功能,将数据保存到磁盘上,当Redis重启后,可以从磁盘中恢复数据。

一、Redis持久化

     由于Redis的数据都存放在内存中,如果没有配置持久化,Redis重启后数据就全丢失了,于是需要开启Redis的持久化功能,将数据保存到磁盘上,当Redis重启后,可以从磁盘中恢复数据。

Redis提供了两个不同形式的持久化方式:

  • RDB(Redis DataBase)
  • AOF(Append Only File)

1 持久化操作-RDB

1.1 RDB是什么?

在指定的时间间隔内将内存的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。

1.2 备份过程

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

2345_image_file_copy_141.jpg

1.3 dump.rdb文件

1. RDB保存的文件,在redis.conf中配置文件名称,默认为dump.rdb。

2345_image_file_copy_142.jpg

2. rdb文件的保存位置,也可以修改。默认在Redis启动时命令行所在的目录下。

2345_image_file_copy_143.jpg

redis.conf中配置文件路径

2345_image_file_copy_144.jpg

1.4 如何触发快照?

      1.4.1 配置文件中默认的快照配置

2345_image_file_copy_145.jpg

1. 快照默认配置

save 3600 1:表示3600秒内(一小时)如果至少有1个key的值变化,则保存
save 300 100:表示300秒内(五分钟)如果至少有100个 key 的值变化,则保存
save 60 10000:表示60秒内如果至少有 10000个key的值变化,则保存

可以自己配置新的保存规则。

2. 例:给redis.conf添加新的快照策略,30秒内如果有5次key的变化,则触发快照。配置修改后,需要重启Redis服务。

2345_image_file_copy_146.jpg

dump.rdb默认大小是92字节,里面会有一些基本信息。

2345_image_file_copy_147.jpg

30秒内设置5个以上的值。

set k1 v1
set k2 v2
set k3 v3
set k4 v4
set k5 v5
set k6 v6
set k7 v7

2345_image_file_copy_148.jpg

dump.rdb大小已经改变。

2345_image_file_copy_149.jpg

1.4.2 flushall

执行flushall命令,也会触发rdb规则。

1.4.3 save与bgsave

手动触发Redis进行RDB持久化的命令有两种:

1. save

该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止,不建议使用。

2. bgsave

执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。

这两个命令是在Redis客户端中执行,并不是redis.conf中修改。

1.4.4 stop-writes-on-bgsave-error

默认值是yes。当Redis无法写入磁盘的话,直接关闭Redis的写操作。

2345_image_file_copy_150.jpg

1.4.5 rdbcompression

默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。

2345_image_file_copy_151.jpg

1.4.6 rdbchecksum

默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。

2345_image_file_copy_152.jpg

1.5 恢复数据

   只需要将rdb文件放在Redis的启动目录,Redis启动时会自动加载dump.rdb并恢复数据。

2 持久化操作-AOF

2.1 AOF是什么?

以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只允许加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,Redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

2.2 AOF持久化流程

1. 客户端的请求写命令会被append追加到AOF缓冲区内。

2. AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作同步到磁盘的AOF文件中。

3. AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量。

4. Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的。


2345_image_file_copy_153.jpg

2.3 AOF默认不开启

可以在redis.conf中配置文件名称,默认为appendonly.aof。

AOF文件的保存路径,同RDB的路径一致。

2345_image_file_copy_154.jpg

如果AOF和RDB同时启动,Redis默认读取AOF的数据。

2.4 AOF启动/修复/恢复

正常恢复

1. 启动:设置Yes:修改默认的appendonly no,改为yes。

2. 恢复:重启Redis然后重新加载。

例:设置appendonly为yes,配置修改后,需要重启Redis服务。

2345_image_file_copy_155.jpg

服务器启动后,生成appendonly.aof文件,且大小为0。

2345_image_file_copy_156.jpg

设置数据。

set k11 v11
set k12 v12
set k13 v13
set k14 v14
set k15 v15

appendonly.aof大小已经改变。

2345_image_file_copy_157.jpg 

异常恢复

1. 启动:设置Yes:修改默认的appendonly no,改为yes。

2. 修复:如遇到AOF文件损坏,通过/user/local/bin/redis-check-aof --fix appendonly.aof进行恢复。

3. 恢复:重启Redis然后重新加载。

例:服务启动和数据设置同上,模拟损坏appendonly.aof文件

vi appendonly.aof

重启Redis服务,并连接。由于aof文件被破坏,导致服务器启动失败。

2345_image_file_copy_158.jpg

通过/user/local/bin/redis-check-aof --fix工具对appendonly.aof进行恢复。

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

2345_image_file_copy_159.jpg

修复成功。再次查看aof文件,破坏的地方已经修复。再次启动服务器成功。

2345_image_file_copy_160.jpg


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2天前
|
NoSQL 安全 Unix
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(中)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
16 0
|
1天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
2天前
|
存储 NoSQL 关系型数据库
【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署
【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署
14 0
|
2天前
|
存储 监控 负载均衡
保证Redis的高可用性是一个涉及多个层面的任务,主要包括数据持久化、复制与故障转移、集群化部署等方面
【5月更文挑战第15天】保证Redis高可用性涉及数据持久化、复制与故障转移、集群化及优化策略。RDB和AOF是数据持久化方法,哨兵模式确保故障自动恢复。Redis Cluster实现分布式部署,提高负载均衡和容错性。其他措施包括身份认证、多线程、数据压缩和监控报警,以增强安全性和稳定性。通过综合配置与监控,可确保Redis服务的高效、可靠运行。
24 2
|
2天前
|
存储 NoSQL 调度
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(下)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
9 0
|
NoSQL 云栖大会 Redis
【云栖大会】Redis技术的实践与探索
Redis作为高性能的key-value数据库,目前包括Twitter、微博、GitHub在内等众多IT互联网企业都在使用它。本专场阿里云高级技术专家兼Redis中国用户会发起人子嘉等人齐聚首,分享了Redis的实践经验,以及Redis云服务的技术架构、云上客户的典型问题等内容。
3380 0
|
2天前
|
负载均衡 监控 NoSQL
Redis的几种主要集群方案
【5月更文挑战第15天】Redis集群方案包括主从复制(基础,读写分离,手动故障恢复)、哨兵模式(自动高可用,自动故障转移)和Redis Cluster(官方分布式解决方案,自动分片、容错和扩展)。此外,还有Codis、Redisson和Twemproxy等工具用于代理分片和负载均衡。选择方案需考虑应用场景、数据量和并发需求,权衡可用性、性能和扩展性。
29 2
|
2天前
|
存储 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(下)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
19 1
|
2天前
|
监控 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(上)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
34 0
|
2天前
|
存储 监控 NoSQL
Redis哨兵&分片集群
Redis哨兵&分片集群
20 0