Redis持久化RDB
背景
Redis作为一个键值对内存数据库(NoSQL),数据都存储在内存中,在处理客户端请求时,所有操作都在内存当中进行。
但是存储在内存中的数据,只要服务器关机(各种原因引起的),内存中的数据就会消失了,不仅服务器关机会造成数据消失,Redis服务器守护进程退出,内存中的数据也一样会消失。
对于只把redis当做缓存来用的项目,数据消失问题不大,重新把数据加载进来即可,但如果直接把业务数据存储在redis中,把redis作为数据库来使用,在其存储重要业务数据,那么Redis的内存数据丢失所造成的影响也许是毁灭性的。
为了避免内存中数据丢失,Redis提供了对持久化的支持,接下来介绍一下持久化方案之一RDB。
RDB
RDB是一种快照存储持久化方式,具体就是讲redis某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名是dump.rdb,而在Redis服务器启动时,会重新加载dump.rdb文件中的数据导内存中
开启RDB
save
命令
save命令是一个同步操作
当客户端向服务器发送save命令请求进行持久化时,服务器会阻塞save命令之后的其他客户端的请求,直到数据同步完成。
如果数据量太大,同步数据会执行很久,而这期间Redis服务器也无法接收其他请求,所以,最好不要在生产环境使用save命令。
bgsave
命令
bgsave是一个异步操作
当客户端发出bgsave命令时,Redis服务器主进程会forks一个子进程来同步数据,在数据保存到rdb文件之后,子进程将会退出。
所以与save命令相比,Redis服务器在处理bgsave采用子进程进行IO写入,而主进程仍然可以接收其他请求,但forks子进程是同步的,所以forks子进程时,一样不能接收其他请求,这意味着如果forks一个子进程花费的时间太久,仍然会有阻塞其他客户端请求的情况发生。
- 配置文件
除了通过客户端发送命令外,还有一种方式,就是在redis配置文件中的save指定到达触发RDB持久化条件。# 900s内至少达到一条写命令 save 900 1 # 300s内至少达至10条写命令 save 300 10 # 60s内至少达到10000条写命令 save 60 10000
这种通过服务器配置文件触发RDB的方式,与bgsave命令类似,达到触发条件时,会forks一个子进程进行数据同步,不过最好不要通过这方式来触发RDB持久化,因为设置触发的时间太短,则容易频繁写入rdb文件,影响服务器性能,时间设置太长则会造成数据丢失。