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

redis持久化之----RDB(Redis DataBase )

2016-12-04 10:31 246 查看
Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。

第一种方法filesnapshotting:默认redis是会以快照的形式将数据持久化到磁盘的(一个二进 制文件,dump.rdb,这个文件名字可以指定),在配置文件中的格式是:save N M表示在N秒之内,redis至少发生M次修改则redis抓快照到磁盘。当然我们也可以手动执行save或者bgsave(异步)做快照。

工作原理简单介绍一下:当redis需要做持久化时,redis会fork一个子进程;子进程将数据写到磁盘上一个临时RDB文件中;当子进程完成写临时文件后,将原来的RDB替换掉,这样的好处就是可以copy-on-write。

1.RDB是什么?

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件,待持久化过程结束后,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那么RDB方式要比AOP方式更加的有效。RDB的缺点是最后一次持久化的数据可能丢失。

2.fork

fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量,环境变量,程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。

3.rdb保存的是dump.rdb文件

4.配置的位置



5.如何触发RDB快照

①配置文件中默认的快照配置



冷拷贝后重新使用,所谓冷拷贝,就是从这台机器拷贝到另外一台机器,以免发生硬件故障时,数据恢复受阻。

可以 cp
dump.rdb    dump_new.rdb

② 命令是save或者是bgsave

save:save时只管保存,其他的不管,全部阻塞

bgsave:redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。可以通过lastsave命令获取最后一次成功执行快照的时间

③执行flushall命令,也会产生dump.rdb文件,但里面是空的,也就是重启启动数据没有回复,所以无意义。

6.如何恢复?

将备份文件(dump.rdb或者是dump_new.rdb)移动到redis的安装目录并启动服务即可

config  get dir 获取目录的路径

7.优势?

①适合大规模的数据恢复

②对数据的完整性和一致性要求不高

8.劣势?

在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改

fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑

9.如何停止?

动态所有停止RDB保存规则的方法:redis-cli config set save ""

10.小总结



Snapshotting快照

①save

save 秒钟 写操作次数

RDB是整个内存的压缩过的Snapshot,RDB的数据结构,可以配置复合的快照触发条件,默认是1分钟内改了1万次,或5分钟内改了10次,或15分钟内改了1次。

如何禁用?

如果想禁用RDB持久化的策略,只要不设置任何save指令,或者给save传入一个空字符串参数也可以





也就是说,当我们插入数据,立即执行save命令,会直接把数据写入到dump.rdb文件,上图显示了dump.rdb的时间变化

②stop-writes-on-bgsave-error



③ rdbcompression



rdbcompression:对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能

④ rdbchecksum



rdbchecksum:在存储快照后,还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能

⑤dbfilename

⑥dir

RDB的持久化的过程?

首先我们到指定的文件目录下,清除dump.rdb这里用的指令是:rm -f dump.rdb,然后用vim /myredis/redis.conf 

进入配置文件,按i进行修改,由于时间关系,我们设置了2分钟内10次对数据的修改,此时需要再开启一个new terminal对数据进行插入,如下:

root@ubuntu:/home/kyl# cd /usr/local/bin
root@ubuntu:/usr/local/bin# redis-server /myredis/redis.conf
root@ubuntu:/usr/local/bin# redis-cli -p 6379
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> set k4 v4
OK
127.0.0.1:6379> set k5 v5
OK
127.0.0.1:6379> set k5 v5
OK
127.0.0.1:6379> set k6 v6
OK
127.0.0.1:6379> set k7 v7
OK
127.0.0.1:6379> set k8 v8
OK
127.0.0.1:6379> set k9 v9
OK
127.0.0.1:6379> set k10 v10
OK
127.0.0.1:6379> keys *
1) "k9"
2) "k5"
3) "k8"
4) "k3"
5) "k4"
6) "k10"
7) "k2"
8) "k6"
9) "k7"

然后再用ls -l查看原先的terminal,会发现生成了dump.rdb文件,然后用cp dump.rdb dump_bk.rdb,即重新复制了一份dump.rdb文件,然后再在新的terminal中执行flushall,shutdown,exit等命令,然后我们再开启,执行keys *的命令,会发现没有数据,即数据没有恢复过来,这是为什么呢?原因是我们执行flushall命令的时候,会首先清空数据,在生成dump.rdb文件,于是我们删除原先的文件中的dump.rdb,使用命令rm -f dump.rdb,再使用cp
dump_bk.rdb dump.rdb,即把原先的复制在dump_bk.rdb中的数据再次复制到dump.rdb文件,于是我们再新的terminal窗口中再次重新启动,然后执行keys *命令,会看到原先执行后的数据显示出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: