登录
首页 >  数据库 >  Redis

Redis持久化机制的示例分析

来源:亿速云

时间:2024-04-08 22:09:41 246浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Redis持久化机制的示例分析》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

Redis把数据存储在内存中,当进程退出后数据就会丢失。Redis持久化机制可以将内存中的数据存储到磁盘上,当重新启动时可以从磁盘文件中读取数据加载到内存中。

Redis支持两种持久化机制:全量镜像RDB和增量式持久化AOF。

RDB是Redis的快照,存储了Redis中所有未过期的键值对。

redis.conf中配置RDB:

dbfilename dump.rdb
dir /var/lib/redis



save 900 1 save 300 10 save 60 10000 save "" stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes

每次redis进程启动时会先检查rdb文件是否存在,若存在则将文件中的内容加载到内存中。

redis自动更新RDB文件时会fork一个子进程执行快照保存工作,在保存期间主进程可以正常的提供服务。

我们同样可以通过指令保存快照:

  • save: 以阻塞的方式保存快照,保存期间redis不能处理其它请求

  • bgsave: fork一个子进程完成保存工作,保存期间不会影响redis的正常服务。

lastsave命令可以得到最新的RDB文件创建时间戳,可以用来检查保存是否成功。

RDB作为数据库快照,每次创建都需要将整个数据库写入到文件。这是一个非常耗时的操作,因此也难以频繁进行,在出现异常时可能丢失大量数据。

Redis提供了增量式持久化工具AOF(Append Only ile), AOF通过记录Redis数据库中所有写指令进行持久化。AOF文件中以Redis通信协议的格式存储指令。

当Redis进程启动时会检查AOF文件是否存在,若存在则依次执行AOF中的指令恢复数据。

Redis每次执行写指令时都会向AOF文件中添加一条日志,但新的记录不会立即写入磁盘(fsync)而是缓存在写入缓冲区中。

我们可以配置将缓冲区中的数据写入磁盘的策略,避免数据丢失。

将缓冲区中数据写入磁盘是一个耗时操作,频繁写磁盘会对性能造成影响但是Redis崩溃丢失数据也较少,因此我们需要根据应用场景进行权衡。

AOF中可能会记录多余的指令,若我们对同一个key执行了100次set指令, AOF文件中就会有100条记录但只仅保留最后一条set指令即可恢复数据。AOF重写会整理AOF文件清理不必要的指令日志(如删除被覆盖的set指令),减少AOF文件大小。

redis 采用后台重写的策略,即 fork 一个子进程把整理后的 AOF 写入到临时文件中。使用BGREWRITEAOF可以手动触发后台重写操作。

实际上AOF重写不会读取原来的AOF文件,子进程会带有一份当前数据的副本,并根据该副本直接生成新的AOF文件。

主进程在重写期间将新增的写操作写入原来的 AOF文件 和 AOF重写缓存 中,即使重写失败原来的AOF文件仍保存了完整的数据。当子进程完成AOF重写后会向主进程发送信号,主进程收到该信号后会将AOF重写缓存中的内容写入新的AOF文件,然后用新的AOF文件覆盖原有文件。

redis.conf中配置AOF:

appendonly yes  
  

appendfilename appendonly.aof  
  


appendfsync everysec 

    no-appendfsync-on-rewrite no   
  


auto-aof-rewrite-percentage 100  
  

auto-aof-rewrite-min-size 64mb

Redis会记录启动时或上次重写后AOF文件的大小,若新增数据的大小达到原大小的100%(auto-aof-rewrite-percentage配置)则触发重写。

只有当前AOF文件体积大于auto-aof-rewrite-min-size时才会执行重写操作,否则即使新增数据量超过指定百分比也不会执行重写。这样避免了原文件过小导致初期频繁重写的问题。

以上就是《Redis持久化机制的示例分析》的详细内容,更多关于redis的资料请关注golang学习网公众号!

声明:本文转载于:亿速云 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>