首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis 持久化,为什么,必须要持久化,不就一个cache吗?

Redis 持久化,为什么,必须要持久化,不就一个cache吗?

作者头像
AustinDatabases
发布2020-04-24 13:55:25
1.3K0
发布2020-04-24 13:55:25
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

鉴于很多企业对于 REDIS MONGODB 的不重视,所以才有了这样的文字,REDIS 很多企业都在用,但用的好不好,估计也只有自己知道,没有密码,监听地址乱写,或者没有持久化,或持久化了也不知道持久化了,这样的情况不少。

今天的说说持久化的问题,Redis 有两种持久化的文件 RDB 和 AOF 文件,而这两种文件到底起到什么作用,估计没有DBA 的单位正在使用REDIS 的这个问题可能不是很清楚,这里就说说REDIS 的 AOF ,RDB 文件。

1 RDB 文件,RDB 文件主要是为了进行REDIS 备份和恢复而进行的,某些应用场景REDIS 存储的数据并不是可以进行丢弃的,例如缓存,有些数据的变动是要刷入到数据库中并不是单纯为了提高性能而进行的静态读取,而如果REDIS CRASH 后,这些数据并没有和传统数据库进行交互和落盘。那数据就丢失了,这样的情况是不能被允许的,所以当整个系统崩溃,或者需要将当时的一部分数据在另外的REDIS进行恢复,则RDB 文件就是最好的恢复方式方法。RDB 文件本身是一个紧凑单一的文件,很容易被传递,另外RDB的文件保存机制也使得保存数据文件消耗的系统资源比较低。

  • Redis 调用forks. 同时拥有父进程和子进程。
  • 子进程将数据集写入到一个临时 RDB 文件中。
  • 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

2 AOF 文件,AOF 文件与RDB 文件相比不同的是AOF 文件并不是一个snapshot 的概念, 他是一个 append 的概念,文件的信息会直接添加到文件的末尾,当然这的方式比上面的RDB文件的好处就是,通过调整数据的刷新方式,是可以做到数据不丢失的,但不利的地方,即使随着保证数据不丢失的等级升高,对REDIS 本身的性能影响就会越突出。并且AOF 文件是在系统重启动,或者CRASH 后,在启动REDIS后对系统数据进行恢复的一种方式。

所以针对上面的量的RDB文件和AOF 文件的不同,两种文件的使用的方式和针对REDIS 所承担的任务不同,就会有一个性能和安全性的衡量。

1 如果你的REDIS 仅仅是从事只读的,并且分担读压力的缓冲层,则可以不使用任何的持久化,因为即使你的REDIS CRASH 了,顶多就是在一次启动REDIS 后开始读取,传统数据库,或通过其他方式将将数据填满,所以可以不涉及持久化

2 如果你的REDIS 是从事写缓冲的工作,例如经常更新数据,所以在REDIS中进行了数据的更新,在多次的运算和更新后,将最后的结果刷入到传统的数据库中,这的确是一个解决高并发,更新值,降低传统数据库负担的方式,例如你一分钟更新上百次或上千次的值的情况下,这样的情况下,你是需要将 RDB 文件和 AOF 文件都开启的,并且随着你的应用逻辑和 你容忍数据可能丢失度的降低,你的RDB 文件和 AOF 文件的保存方式等级都会提高,例如 RDB 文件

你是否需要提高下面的RDB 文件的刷新率 ,根据刷新的频率,调整

例如如果写入的在5秒就有10000次,则不需要调整,如果60秒内写入9999次,则需要调整一下 save 60 10000 变为 save 60 5000

这样RDB 的flush file的频率就会提高,满足你的需求。另外在你CTRL + C 终止REDIS 的情况下(Redis 并未在有),会强制先将数据刷入到 RDB 文件,否则除非你 KILL 否则是无法关闭 REDIS的。

AOF 文件,默认是关闭的,需要打开,并且默认是每秒来进行与磁盘的交互

所以在双重的RDB 和AOF 文件的加持下,在这样的业务场景下,数据安全是有保证的,如果还想严格的不丢失数据,则需要将上图的设置调整为 appendfsync always 打开,则任何的操作都会记录在 appendonly.aof 文件中。

随着REDIS 写入的数据的增加,需要文件的分割,rewrite是aof的一个机制,用来压缩aof文件,通过fork一个子进程,重新写一个新的aof文件,该次重写不是读取旧的aof文件进行复制,而是将读取内存中的redis数据库,重写一份aof文件,有点类似于rdb的快照方式;

触发机制为:

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

当文件大小,达到旧的aof文件大小的2倍的情况下,并且文件达到64MB的情况下,重写机制就会启动。

在重启动时如何处理有错的aof

aof-load-truncated yes

文件重写策略

aof-rewrite-incremental-fsync yes

所以REDIS 的持久化可以根据REDIS在系统中所承担的作用来设置,如果是只读作为读缓冲,则可以不需要进行持久化的操作,可以将RDB AOF 文件关闭,已达到最好的效果,当然你的程序也需要考虑在 REDIS CRASH 后的数据重新刷入,否则会引起缓存雪崩,导致你的实体数据库 MYSQL ORACLE ,POSTGRESQL SQL SERVER 等数据库无法承受短期的高频的数据读取,而不再有响应。

要不就需要设置 RDB, AOF 文件,在某些应用场景下,防止丢失数据,或者引起缓冲击穿后的雪崩问题。

建议如果没有特殊的要求,需要打开 RDB AOF 持久化,这样REDIS 好, 传统数据库好,你好我好,大家好。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档