码迷,mamicode.com
首页 > 其他好文 > 详细

redis持久化

时间:2016-03-26 08:28:01      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:服务器   数据库   二进制   名词解释   执行文件   

Redis持久化原理:

Redis支持两种持久化:RDB和AOF模式

一、名词解释:

RDB:持久化可以在指定的时间间隔内生成数据集的时间点快照点快照(point-in-time snapshot)。

snapshot,二进制格式:按事先定制的策略,周期性地将数据保存到磁盘:数据文件默认为dump.rdb;

    客户端也可显式使用SAVA或BGSAVE命令启动快照保存机制;

        SAVE:同步,在主线程中保存快照;此时会阻塞所有客户端请求;

        BGSAVE:异步,不会阻塞客户端请求;

AOF:持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。记录每一次写操作至指定的文件尾部实现持久化;当redis重启时,可通过重新执行文件中的命令在内存重建数据库;

    BGREWRITEAOF:AOF文件重写;不会读取正在使用的AOF文件,而通过将内存中的数据以命令的方式保存到临时文件中,完成之后替换原来的AOF文件;


AOF文件中的命令全部以redis协议的格式来保存,新命令会被追加到文件的尾部。redis还可以在后台对AOF文件进行重写(rewrite)


使得AOF文件的体积不会超出保存数据集状态所需的实际大小。


RDB和AOF的优先级:

如果同时开启RDB和AOF模式,AOF的优先级要比RDB高;

Redis还可以同时使用RDB和AOF持久化。在这种情况下,当redis重启时,它会优先使用AOF文件来还原数据集。

因为AOF文件保存的数据集通常比RDB文件所保存的数据集更完整。


AOF的方式有点像ORCAL的逻辑备库!

AOF redis还会在后台对数据进行重写,比如set key1,set key2,其实set key1没用,这样做可以把set key1删掉。这样保存下来的数据集就很小了可以压缩了!

你甚至可以关闭持久化功能,让数据只在服务器运行时存在。


二、RDB&AOF优缺点

RDB的优缺点:

优点:

1、紧凑易于备份,他就一个文件。

2、RDB可以最大化redis性能、父进程无需做任何操作只需要for一个子进程即可

3、恢复比AOF快

缺点:

1、数据完整性:如果非常注重数据的完整性,那么RDB就不行,虽然他是一个point-in-tie的快照方式,但是在快照的过程中,redis重启了,那么在快照中的这些数据将会丢失;

2、数据非常庞大后,非常耗CPU和时间,那么redis将可能down掉1秒钟甚至更长。


AOF的优缺点:

优点:

1、使用AOF持久化会让redis变得非常耐久,AOF默认的每一秒追加一次也可以修改他的方式,每执行一次命令追加一次,所以你最多丢失1秒钟的数据。

2、AOF文件是一个只进行追加操作的日志文件(append only log)。

3、redis可以在AOF文件体积变得过大时,自动地在后台对AOF进行重写。

缺点:

1、对于相同的数据集来说,AOF文件的体积通常要大于RDB文件的体积。

2、根据所使用的fsync策略,AOF的速度可能会慢于RDB。


Rdis持久化设置:

默认Redis是开启的RDB模式的持久化的看下面配置文件:

########################### SNAPSHOTTING  ########################
#
# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   In the example below the behaviour will be to save:
#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed
#
#   Note: you can disable saving completely by commenting out all "save" lines.
#
#   It is also possible to remove all the previously configured save
#   points by adding a save directive with a single empty string argument
#   like in the following example:
#
#   save ""

save 900 1
save 300 10
save 60 10000

===================================================
上面3个save是或的关系

# save <seconds> <changes>  333格式!
解释:
#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed

900 sec内有1个Key发生了改变就做一次快照
或 300 sec内有10个keys发生了改变做一次快照
或 60 sec内有10000 keys发生了改变做一次快照

快照原理:
forker出一个进程,是当前进程的一个副本相当于子进程,不会影响你当前运行的进程!当子进程写的时候会有一个临时
的文件,当子进程写完之后会把这个临时的文件move替换老的文件,所以这个rdb的文件任何时间都是一个完整的可用的
副本!你写的时候不会影响RDB这个文件,因为forker出的子进程正在写的是一个临时文件!
但是如果故障了,你这个保存的时间是你开始快照那一刻那个时间,你快照到快照完毕那一段时间的数据就丢失了。

如果想禁用持久化把这三行删了就行了
save 900 1
save 300 10
save 60 10000
1、快照保存在哪里呢?
# The filename where to dump the DB
dbfilename dump.rdb #如果你启用了多个快照名称,可以使用端口来定义;比如:dump_6379.rdb

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the ‘dbfilename‘ configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir ./ #不仅仅是RDB模式下的DB存放在这个目录,AOF模式下也是存放在这个目录的,建议存放在指定的目录。

#比如 dir /data/redis

#比如我上面指定了:
# The filename where to dump the DB
dbfilename dump_6379.rdb
# Note that you must specify a directory here,not a file name.
dir /data/redis/

2、手动在redis中保存

127.0.0.1:6379> SET key 1
OK
127.0.0.1:6379> SAVE
OK
127.0.0.1:6379> quit
# ll /u01/redis/   查看文件目录下面有没有修改
-rw-r--r--. 1 root root 399 Mar 25 15:55 dump.rdb   #当前时间创建
在设置一个key看下:
127.0.0.1:6379> set key 2
OK
127.0.0.1:6379> SAVE
OK
127.0.0.1:6379> quit
# ll /u01/redis/
-rw-r--r--. 1 root root 399 Mar 25 15:59 dump.rdb
127.0.0.1:6379> BGSAVE
Background saving started

SAVE和BGSAVE有什么区别:SAVE是阻塞的当你直接执行SAVE的时候他就不干活了,BGSAVE是在后台执行。
forker一个子进程来进行SAVE。

SAVE的使用场景仅限于:当redis需要迁移的时候,redis没有数据写入并且可以停的时候使用!

测试添加一个:key然后停掉看看!不保存:
目前的key是:
127.0.0.1:6379> KEYS *
1) "key"
2) "hello"
127.0.0.1:6379> SET key3 haha
OK

# kill -9 `pgrep -f redis` 杀掉进程
127.0.0.1:6379> KEYS *  #重启登录之后发现设置的key丢失了
1) "hello"
2) "key"
#所以当redis异常挂掉之后,没有SAVE数据!

3、启动AOF后

给这个文件追加,把所有的命令都写到一个文件里面,你执行一个我写一个。恢复的话在执行一遍不就行了吗!非常简
单(但是恢复相对RDB模式会慢,他相当于重新把AOF库里的记录重新往内存中写一遍)可以RDB和AOF同时使用!优点
都占用了!但是也得根据业务来定!

开启方法:修改配置文件
appendonly yes  #改成yes
appendfilename "appendonly.aof" #文件名

工作原理:
forker 一个子进程写到临时文件,写完之后就给父进程发一个信号,开始写到写完的这个过程还会有子进程给父进程发信
号。先保存在内存里,但是他有个好的功能,重写,他会定时对aof进行更新,这样文件就会非常小!

测试:(他会根据redis可识别的方式写入文件,不过大概人也能看懂)

127.0.0.1:6379> SET sichuan dazhou
OK
127.0.0.1:6379> SET beijing beijing
OK
127.0.0.1:6379> SET magedu peixunjigou
OK
127.0.0.1:6379> SET cengdu sichuan
OK
127.0.0.1:6379> KEYS *
1) "magedu"
2) "beijing"
3) "cengdu"
4) "sichuan"

# cat /u01/redis/appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
SET
$7
sichuan
$6
dazhou
*3
$3
SET
$7
beijing
$7
beijing
*3
$3
SET
$6
magedu
$11
peixunjigou
*3
$3
SET
$6
cengdu
$7
sichuan


本文出自 “把酒问苍天” 博客,请务必保留此出处http://79076431.blog.51cto.com/8977042/1755235

redis持久化

标签:服务器   数据库   二进制   名词解释   执行文件   

原文地址:http://79076431.blog.51cto.com/8977042/1755235

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!