您的位置:首页 > 数据库 > Redis

Redis持久化

2018-01-31 19:25 99 查看
一 相关概念
1 什么是持久化
将数据从掉电易失的内存存放到能够永久存储的设备上
2 Redis为什么需要持久化
基于内存
缓存服务器
内存数据库
消息队列
3 Redis持久化方式
RDB(Redis DB):默认开启
AOF(AppendOnlyFile):默认是不开启动

二 相关说明
因为Redis服务器将数据存储在内存里面,而一旦服务器被关闭、或者运行服务器的主机本身被关闭的话,存储在内存里面的数据就会消失不见
如果我们仅仅是将Redis用作缓存的话,那么这种数据丢失带来的问题并不是非常大,我们只需要重启机器,然后再次将数据放到缓存里面就可以了,但如果我们将Redis用作数据库的话,那么这种数据丢失就不能被接受了。
为了再redis服务器关闭时,仍然保留数据库中的数据,redis提供了RDB和AOF两种持久化功能,这两种功能可以将存储在内存里面的数据库数据以文件形式保存到硬盘里面,这样的话,即使服务器关闭,已经保存到硬盘里面的数据也不会丢失。
除此之外,服务器也可以在重新启动时候,通过载入持久化文件来还原服务器在关闭之前的数据库数,或者使用持久化文件来进行数据备份、数据迁移等工作。
RDB持久化功能可以将服务器包含的所有数据库数据以二进制文件的形式保存到硬盘里面。



而通过服务器启动时载入RDB文件,服务可以根据RDB文件的内容、还原服务器原有的数据库数据。



三 RDB
在redis服务器创建RDB文件的情况中,以下三种最常见:
1 服务器执行客户端发送的SAVE命令
2 服务器执行客户端发送的BGSAVE命令
3 使用save配置选项设置的自动保存条件被满足,服务器自动执行BGSAVE
这三种创建RDB文件的情况中,前两种需要用户手动执行,而第三种情况则是由redis服务器自动执行。

四 SAVE
1 通过使用客户端向服务器发送SAVE命令,可以命令服务器去创建一个新的RDB文件:
2 在执行SAVE命令的过程中(也即是创建RDB文件的过程中),redis服务器将被阻塞,无法处理客户端发送的命令请求,只有SAVE命令执行完毕后(也即是RDB文件创建完毕之后),服务器才会重新开始处理客户端发送的命令请求。
3 如果RDB文件已经存在,那么服务器将自动使用新的RDB文件代替旧的RDB文件。
4 实例
127.0.0.1:6379> save
OK
127.0.0.1:6379> save
OK
[root@master ~]# ll dump.rdb
-rw-r--r-- 1 root root 715 Jan 31 18:32 dump.rdb
[root@master ~]# ll dump.rdb
-rw-r--r-- 1 root root 715 Jan 31 18:34 dump.rdb
5 图例



五 BGSAVE
1 执行BGSAVE命令同样可以创建一个新的RDB文件,这个命令和SAVE命令的区别在于,BGSAVE不会造成redis服务器阻塞:在执行BGSAVE命令的过程中,redis服务器任然可以正常的处理其他客户端发送的命令请求。
2 BGSAVE命令不会造成服务器阻塞的原因在于:
2.1 当redis服务器接受到BGSAVE命令的时候,他不会自己来创建RDB文件,而是通过fork()来生成一个子进程,然后由子进程负责创建RDB文件,而自己则继续处理客户端的命令请求。
2.2 当子进程创建好RDB文件并退出时,他想父进程(也即是负责处理命令请求的redis服务器)发送一个信号,告知它RDB文件已经创建完毕。
2.3 最后redis服务器(父进程)接受BGSAVE执行完毕。
3 图例





4 BGSAVE是一个异步命令,发送命令的客户端会立即得到回复,而实际的操作在回复之后才开始
5 实战
127.0.0.1:6379> BGSAVE
Background saving started
6 说明
创建子进程,会消耗额外的内存,因为需要创建子进程,会耗费额外的内存,所以SAVE创建RDB文件的速度会比BGSAVE快,可以集中资源来创建RDB文件,SAVE和BGSAVE没有孰好孰坏之分,你要考虑的就是哪个更适合你,比如说你的数据库正在上线当中,那当然就是使用BGSAVE,另外相反如果你要维护,在凌晨3点钟,那么你最好使用SAVE命令,比如维护需要停机一个小时,或者半个小时,那你就使用SAVE命令,这时系统被阻塞了也没有关系,使用SAVE命令好一点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Redis