存在的问题
因为 Redis 是内存数据库, 它将自己的数据库状态储存在内存里面, 所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出, 服务器中的数据库状态也会消失不见。
为了解决这个问题, Redis 提供了持久化功能, 持久化功能可以将 Redis 在内存中的数据库状态保存到磁盘里面, 避免数据意外丢失。
介绍 Redis 的数据持久化方案
Redis 的数据持久化主要有两大机制,AOF 日志和 RDB 快照。
- AOF 持久化是通过保存 Redis 服务器所执行的写命令来记录数据库状态。
- RDB 持久化是通过保存数据库中的键值对来记录数据库状态。
Redis 是一个键值对数据库服务器, 服务器中通常包含着任意个非空数据库, 而每个非空数据库中又可以包含任意个键值对, 为了方便起见, 我们将服务器中的非空数据库以及它们的键值对统称为数据库状态。
因为 AOF 文件的更新频率通常比 RDB 文件的更新频率高,所以:
- 如果服务器开启了 AOF 持久化功能,那么服务器会优先使用 AOF 文件来还原数据库状态。
- 只有在 AOF 持久化功能处于关闭状态时,服务器才会使用 RDB 文件来还原数据库状态。
Redis 服务器的默认配置:
- AOF 持久化功能处于关闭状态
- RDB 持久化有默认条件
RDB 持久化的默认条件。只要满足以下三个条件中的任意一个,bgsave 命令就会被执行:
- 服务器在 900 秒之内, 对数据库进行了至少 1 次修改。
- 服务器在 300 秒之内, 对数据库进行了至少 10 次修改。
- 服务器在 60 秒之内, 对数据库进行了至少 10000 次修改。
AOF 日志和 RDB 快照的优劣局限
AOF 日志相比 RDB 快照的优势:
- AOF 对系统的性能影响更小:AOF 只是追加日志文件,而 RDB 是对所以键值对的快照,因此一次 AOF 操作比 RDB 对系统的性能影响更小,速度比 RDB 要快,消耗的内存较少。
AOF 日志相比 RDB 快照的劣势:
- AOF 载入文件的速度更慢:AOF 保存写命令,而 RDB 保存保存键值 对来记录数据库状态,因此载入 AOF 文件的速度比载入 RDB 更慢。
- AOF 文件的体积更大:保存相同的数据库状态,AOF 文件比 RDB 文件的体积更大。