Redis持久化机制
Redis是一种内存型数据库,Redis 为了保证效率,数据缓存在了内存中,但是会周期性的把更新的数据写入磁盘或者把修改操作写入追加 的记录文件中,以保证数据的持久化。总的目的把数据保存到硬盘
1、redis提供的两种持久化方法:
-
快照RDB
RDB指的是在指定时间间隔内,将内存的数据集快照写入磁盘,它恢复时是将快照文件内存直接读到内存里。RDB 是一次的全量备份,是 redis 默认的存储方式,推荐使用。
优点:性能消耗的比较小,速度快
缺点:容易丢失数据
RDB 是默认的持久化方案:推荐使用的。Redis 生成二进制压缩的快照文件 xxx.rdb 保存到磁盘。 RDB 工作原理:当 Redis 需要做持久化时,Redis 会 fork 一个子进程,子进程将数据写到磁盘上一个临时 RDB 文件中。当子进程完成写临时文件后,将原来的 RDB 替换掉,这样的好处是可以 copy-on-write。 定时生成 RDB 快照非常便于进行数据库备份,并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度快。Redis4.0 支持同时开启 RDB 和 AOF,系统重启后,Redis 会优先使用 AOF 来恢复数据,这样丢失的数据会最少。
需要查看配置文件,满足三个条件中一个触发生成快照 rdb 文件。可以配置符合快照触发条件,默认的是 1 分 钟内改动 1 万次,或者 5 分钟改动 10 次,或者是 15 分钟改动一次 save 900 1 save 300 10 save 60 10000 启动服务器的时候需要通过命令行启动,进入 reids 的安装目录 redis-server.exe redis.conf save 命令:save 时只管保存,其他不管,全部阻塞 bgsave 命令:redis 会在后台进行快照操作,快照操作的同时还可以响应客户端的请求,可以通过 lastsave 命 令获取最后一次成功执行快照的时间。
-
只追加文件AOF
AOF 持久化方案:把所有的对 Redis 的服务器进行修改的命令都存到一个文件里,是命令的集合
AOF是以日志的形式来记录每个操作,将Redis执行过的所有写指令记录下来,只许追加文件但不能修改文件,Redis启动之初会读取该文件重新构造数据。即,Redis重启的话,就根据日志文件的内容将写指令从前到后执行一次已完成数据的恢复工作
AOF采用文件追加方式,文件会越来越大,为避免出现此种情况,新增了重写机制。当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。
优点:每次发生数据变更会立即记录到磁盘,性能较差,但数据完整性较好,AOF相对RDB更加安全,一般不会有数据的丢失或者很少。
缺点:相同的数据集的数据,AOF文件远大于RDB文件,恢复速度慢于RDB
当 Redis 重启时会优先使用 AOF 文件来还原数据集,因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数 据集更完整。甚至可以关闭持久化功能,让数据只在服务器运行时存储
2、如何选择合适的持久化方式
- 如果数据不那么敏感,且可以从其他地方重新生成补回的,那么可以关闭持久化
- 如果数据比较重要,不想从其他地方获取,可以接受几分钟的数据丢失,可以使用RDB
- 如果是做内存数据库,要使用redis的持久化,建议RDB和AOF都开启,RDB更适合做数据备份,AOF可以保证数据不丢失。
宕机后会优先加载 AOF 文件。RDB 保存的数据,AOF 保存的命令,RDB 文件比 AOF 小。恢复速度 RDB 小, 更快。RDB 一次写入的数据较多,时间间隔会比 AOF 长,出现宕机丢失的数据会更多 各有优劣,如果能综合就好了,所幸的是在 redis4.0 后,通过配置 aof-use-rdb-preamble 就可以开启两者混合 持久化,取长补短
混合持久化 Redis4.0 后大部分的使用场景都不会单独使用 RDB 或者 AOF 来做持久化机制,而是兼顾二者的优势混合使用。 其原因是 RDB 虽然快,但是会丢失比较多的数据,不能保证数据完整性;AOF 虽然能尽可能保证数据完整性, 但是性能确实是一个诟病,比如重放恢复数据 混合持久化通过 aof-use-rdb-preamble yes 开启,Redis 4.0 以上版本默认开启 推荐是 AOF 和 RDB 两者均开启 如果对数据不敏感,可以选单独用 RDB 阿里微服务教程 教学的重点不在于讲授了什么而是学生学会了什么 闫峻编写 我的目标:把需要工作的人变成工作需要的人 2023 年 7 月 9 日 09:32:23 不建议单独用 AOF,因为可能会出现 Bug 如果只是做纯内存缓存,可以都不用
3、Redis持久化数据和缓存怎么做扩容
- 如果Redis被当作缓存用,使用一致性哈希实现动态扩容缩容
- 如果Redis被当作一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化,否则必须使用可以在运行时进行数据再平衡的一套系统。