Redis学习11:持久化RDB/AOF

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
日志服务 SLS,月写入数据量 50GB 1个月
简介: 什么是持久化?利用永久性的存储介质进行保存,特定的时间将保存的数据进行恢复。持久化方式:保存分为快照和日志。注意日志保存的是整个操作的过程。

持久化简介


fd8f94e93f7e7f11ecd6b3ff6c7c8b09_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_20,color_FFFFFF,t_70,g_se,x_16.png


什么是持久化?

利用永久性的存储介质进行保存,特定的时间将保存的数据进行恢复。

持久化方式:保存分为快照和日志。注意日志保存的是整个操作的过程。

629135e02885ee25dc2b333c5d988485_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_19,color_FFFFFF,t_70,g_se,x_16.png

在Redis中两种都有,左边叫做RDB,右边叫做AOF。

RDB 快照


RDB启动方式

一定要有三个因素:任务时间地点

1ad0d45f2df2b25f46102070fffbb99b_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_8,color_FFFFFF,t_70,g_se,x_16.png

对应命令:sava

每执行一次就可以手动保存一次数据

先通过 key * 查看有没有数据

有没有数据 没有就添加

然后save命令

然后进入到data目录下会发现 dump.rdb 一个文件

打开rdb文件发现乱码,是因为rdb是二进制文件所以查看不出来

497298116716751d24c3a2e3b6b0dcc4_26055fa4ab9c44b4b922255a561fd105.png

把rdb删掉,然后再执行一次save,然后查看会发现又有了rdb文件。

每保存一次,会 生成一个rdb文件生成当前的快照信息。

RDBsava指令的相关配置

3ba1212e89468ed410e3dfe665c4eceb_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_20,color_FFFFFF,t_70,g_se,x_16.png

进入data目录中,查看dump.rdb文件。

然后可以通过更改配置文件来修改save的相关命令

进入到目录中,cat conf文件,进行更改配置

883c0f25847726dbf0d74b1e590ebc3c_565d366848854165a9126d91438e2b4d.png

然后重新开启一下这个进程,先kill -s 这个进程

然后redis-server conf/redis-6379.conf 启动redis就可以生效了

然后就可以通过save命令后直接去data目录下查看有没有这个文件

b0a22f54f7ca82582b237896c62074c0_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_20,color_FFFFFF,t_70,g_se,x_16.png

先杀掉这个进程,然后再次启动这个服务,看是否恢复了数据 。

09f758be67c9557deae6cb484bfebacd_6ff16f3c37fd4286ae12ab81339f05b3.png

通过命令:redis-server conf/redis-6379.conf 启动

可以通过:ps -ef | grep redis- 来查看有哪些进程

通过客户端连接 然后keys * 查看到原来的数据恢复了

原理是在启动的时候把数据加载了进行恢复

save的工作原理


8d82fa802d9d54a1888ad1110cfe012c_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_20,color_FFFFFF,t_70,g_se,x_16.png


要注意redis是单线程执行。

92ef6673370fedfe0a5c1c70c536e167_6838c47963a34312bbdb8b15a5285dd8.png

注意save的指令可能会阻塞redis服务器,线上环境不建议使用,因为会把性能损耗很多。

所以需要慎重需要使用RDB线上的使用。

总结:当数据量过大,rdb单线程执行方式造成的效率过低,性能过低。

解决方案:rdb后台执行。

7fbce9105eee281182b384da2f38d209_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_14,color_FFFFFF,t_70,g_se,x_16.png

bgsave 就是命令了。

手动启动后,后台将保存这个操作,但不是立即就执行了。

7e441b1cf1ea3d27ad70ae06ccf60109_c9db019d69494653a5691ab5b1fccb07.png


执行ll查看rdb的大小与时间。

298600debfc182aac073ac69e1a2072f_3a59b628d5ea42ae9a8d17ee1671ecfd.png

工作原理:

e9abbb984b6dca4bc7de6bececc67ea9_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_20,color_FFFFFF,t_70,g_se,x_16.png


那么如何验证这个工作过程呢?

可以进行查看日志文件,来查看是否是这样的。

cat 6379.log

可以查看到日志也是这么显示的。

bgsave与save总结


bgsave命令是针对save阻塞问题做的优化,redis内部涉及到的rdb操作都将采用bgsave的方式,save命令可以放弃使用的。

860c7e12b87fc3b4392cccb43dabe921_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_13,color_FFFFFF,t_70,g_se,x_16.png

自动执行save rdb启动方式

9f6d595ddf8cca4bd172341e4a34d26d_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_18,color_FFFFFF,t_70,g_se,x_16.png

1a480db4c2bdfa2313fef45eff171347_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_14,color_FFFFFF,t_70,g_se,x_16.png


意思就是说,10s内有99个key了,那么就需要进行持久化。其实就是单位时间内达标了就进行bgsave存。

配置的方式和案例如下:

73c6f04bba0fca85f8891a265647909f_2356409c196740e38fff8e422b255b07.png

rdb三种启动方式对比


feed5255d06f057e9fb87622aa9bdcad_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_16,color_FFFFFF,t_70,g_se,x_16.png


bgsave起了一个新进程所以需要额外的内存消耗的。

664b6e5c3f5fa84f8d74a1d8ee60409f_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_8,color_FFFFFF,t_70,g_se,x_16.png

52bdadf74ad1f57d2d1b3301f6095d8e_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_18,color_FFFFFF,t_70,g_se,x_16.png

第二种持久化方案 AOF

RDB存储的弊端:

33559b82ed2ed907bbd3773218750648_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_13,color_FFFFFF,t_70,g_se,x_16.png

最后一个指的是无法时刻进行RDB,可能会有一些丢失。

b6a79ce6c4d1099b83795428a0ee1c55_307435abd13c40048e00c1753b432486.png

AOF介绍


1c7b5e6a9b27a58179022e60f798a0ea_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_18,color_FFFFFF,t_70,g_se,x_16.png


AOF写数据的过程

f45dfff81e5c159886eac7639e440b65_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_18,color_FFFFFF,t_70,g_se,x_16.png


那么问题变成了如何控制命令同步到.aof文件中。

一共有三种策略:

每次、每秒、系统控制

7622a6d08cf34cfe11889476cd3e6601_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_13,color_FFFFFF,t_70,g_se,x_16.png


AOF功能开启


427fd1a31a2eb8ac7dcb8f5217fbc80b_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_12,color_FFFFFF,t_70,g_se,x_16.png

进入到conf目录下,然后更改conf文件就可以了。

配置过程如下:

6777325f5148174408d433a4c7f0c0a8_cac9c25487b84322bef7fd4bc4a6fbd0.png

67d8badd7e3e6690cb05008d69ad0779_0cc84d3d48ea4c58a1d26943300c6c34.png


然后到客户端写一个set name 123,会发现.aof文件已经开始变化了。

2e3608974f1afca4d74c497985bc094b_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_12,color_FFFFFF,t_70,g_se,x_16.png


也就是说always是可以每次都记住变化的。

但是记住如果是get,.aof的大小是不会变化的,因为没有进行更改数据。

然后可以查看这个文件。

7f08eb90a0c97e94e41a261917f81c22_fe2962403a8c4be6aecd960cb51c1100.png

aa96e82e7fcd1dc2d027d5d6c8690f60_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_9,color_FFFFFF,t_70,g_se,x_16.png

如果改成 everysec的话是看不出来每次一存的区别的。因为每秒一存太快了。

AOF重写概念与命令执行

7d3a931800e8cc17a34d4fa411c717e7_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_17,color_FFFFFF,t_70,g_se,x_16.png

d9711bf7434ab3cc4766456f19a32937_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_20,color_FFFFFF,t_70,g_se,x_16.png

76f9429794335f5950dd1e48ad5dda17_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_14,color_FFFFFF,t_70,g_se,x_16.png


bg就是后台的意思,background。

38029e0c8f79e96c86cb9b55002443a1_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_12,color_FFFFFF,t_70,g_se,x_16.png

9435a117d3a81f7a1caeb4cd0493bf94_46a3bd9259bc41d493b9f06c4b9ba42f.png


当执行重写之后,再次查看ll。然后发现变小了。

7cc7d5093a3ec0ef0a2323eb2064ca2a_e3fe149eb3ad47e7b7c417cc966ba6a8.png

835d52ad31deac720766d619c4435c6c_1f60f3915913470594acb8b2bc9adb52.png

发现只剩下了345。

类似消消乐,多个操作合并一个了。

acbce7976da5f693d51976d5193d9730_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_20,color_FFFFFF,t_70,g_se,x_16.png

自动AOF重写


8d80b353a67a91cb0ef4fc1fd98a85b7_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_17,color_FFFFFF,t_70,g_se,x_16.png


一共有两种,一个是大小,一个是百分比。

这个两个触发条件触发一个就会触发AOF了。

在客户端输入info就可以看到上面说的系统数据值了。

2821b7cff79ef61452f26f9cc92f431e_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_8,color_FFFFFF,t_70,g_se,x_16.png

AOF的工作流程

32745406f1a29153db50cc1e9daab947_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_20,color_FFFFFF,t_70,g_se,x_16.png

86a2c86c6fe051815020ea1cba4902f2_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_19,color_FFFFFF,t_70,g_se,x_16.png


RDB与AOF的区别

ba169ad8bb27512e7ed29356d3695441_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_18,color_FFFFFF,t_70,g_se,x_16.png


RDB类似整盘复制。

76fb2fdecb875b36ba92345cdd61ccba_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_20,color_FFFFFF,t_70,g_se,x_16.png

比如说游戏的回档,玩家是可以接受的。所以可以用RDB,用来做阶段性的恢复。

如果用了RDB,那么存储的时间要慎重考虑。

持久化的应用场景

f33a970ef68e85d45c6d6147da736da6_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_18,color_FFFFFF,t_70,g_se,x_16.png


第一个主键id不适合用持久化,适合临时化。

第二个热度数据也不适用。

第三个不适用。因为数据库也有。

第四个快速存储、快速消失的适合存起来。其次恢复这个就不用后台做大规模的重做。如果差一两个,那么激活码就多发一两个也没事。

第五个操作先后顺序的话也适用redis存储。

任务队列、消息队列也可以,但是用MQ更适合。

第七个关联搜索不适用。

黑白名单的控制:如果黑名单做的是长期策略,那么数据库肯定要存,就不需要redis了。而如果是短期策略,那么就不适合。(因为网吧或者校园网的ip进行黑名单了,那么如果直接封了网吧和校园网会导致其他的用户ip访问不了了。)

排名功能适合做持久化,这种数据是不会存数据库的。

最后一个应用按次结算,那么要不要持久化,可以这么想:如果不存,会不会出灾难性的结果,如果会出现,那么需要,如果不会出现,那么就不用管。


相关实践学习
基于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
相关文章
|
5天前
|
监控 NoSQL 测试技术
【赵渝强老师】Redis的AOF数据持久化
Redis 是内存数据库,提供数据持久化功能,支持 RDB 和 AOF 两种方式。AOF 以日志形式记录每个写操作,支持定期重写以压缩文件。默认情况下,AOF 功能关闭,需在 `redis.conf` 中启用。通过 `info` 命令可监控 AOF 状态。AOF 重写功能可有效控制文件大小,避免性能下降。
|
5天前
|
存储 监控 NoSQL
【赵渝强老师】Redis的RDB数据持久化
Redis 是内存数据库,提供数据持久化功能以防止服务器进程退出导致数据丢失。Redis 支持 RDB 和 AOF 两种持久化方式,其中 RDB 是默认的持久化方式。RDB 通过在指定时间间隔内将内存中的数据快照写入磁盘,确保数据的安全性和恢复能力。RDB 持久化机制包括创建子进程、将数据写入临时文件并替换旧文件等步骤。优点包括适合大规模数据恢复和低数据完整性要求的场景,但也有数据完整性和一致性较低及备份时占用内存的缺点。
|
1月前
|
NoSQL 数据可视化 Linux
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
本文介绍了Redis的两个可视化管理工具:付费的Redis Desktop Manager和免费的Another Redis DeskTop Manager,包括它们的下载、安装和使用方法,以及在使用Another Redis DeskTop Manager连接Redis时可能遇到的问题和解决方案。
112 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
1月前
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
218 3
|
1月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
24 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
1月前
|
NoSQL Redis
redis学习五、错误总结,redis正常运行时后会出现一些bug 总结。
本文介绍了Redis在正常运行时可能遇到的一个错误,即无法进行磁盘持久化的问题,并提供了通过设置`stop-writes-on-bgsave-error`为`no`来解决这一问题的方案。
92 0
|
1月前
|
存储 缓存 NoSQL
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
35 2
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
|
2月前
|
存储 缓存 NoSQL
Redis中的rdb和aof
本文深入探讨了Redis的持久化机制,包括RDB和AOF两种方式。详细解释了RDB的工作原理、优势和劣势,以及AOF的实现原理、配置选项、文件重写机制和三种数据同步方式,还介绍了AOF文件修复工具redis-check-aof的使用,并通过实例展示了如何开启和配置AOF持久化方式。
Redis中的rdb和aof
|
1月前
|
存储 缓存 NoSQL
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
56 1
|
2月前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群