http://blog.csdn.net/lichangzai/article/details/8692103

redis持久化简介:

redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式。下面分别介绍

Snapshotting
       快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久 化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置

save 900 1  #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000

下面介绍详细的快照保存过程

1.redis调用fork,现在有了子进程和父进程。

2. 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数 据是fork时刻整个数据库的一个快照。

3.当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。

client 也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有 client的请求,这种方式会阻塞所有client请求。所以不推荐使用。另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不 是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。

另外由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。如果应用要求不能丢失任何修改的话,可以采用aof持久化方式。下面介绍

Append-only file
    
aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要 通过fsync函数强制os写入到磁盘的时机。有三种方式如下(默认是:每秒fsync一次)

appendonly yes              //启用aof持久化方式
# appendfsync always      //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec     //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no    //完全依赖os,性能最好,持久化没保证

aof 的方式也同时带来了另一个问题。持久化文件会变的越来越大。例如我们调用incr test命令100次,文件中必须保存全部的100条命令,其实有99条都是多余的。因为要恢复数据库的状态其实文件中保存一条set test 100就够了。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据 以命令的方式保存到临时文件中,最后替换原来的文件。具体过程如下

1. redis调用fork ,现在有父子两个进程
2. 子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令
3.父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。
4.当子进程把快照内容写入已命令方式写到临时文件中后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件。
5.现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。

需要注意到是重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

http://www.cnblogs.com/xuxm2007/archive/2011/11/28/2265894.html

redis启动装载:

AOF优先于RDB
RDB性能优于AOF,因为里面没有重复
Redis一次性将数据加载到内存中,一次性预热

一、验证redis的快照功能

1. 修改redis配置文件
--下面redis.conf配置文件参数值都默认的,可以根据需要修改
[root@rac1 redis-2.6.8]# vi /etc/redis_master.conf
# 快照保存规则,如
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000

# 最多使用数据库的个数
databases 16

# 快照文件的名字
dbfilename dump.rdb

# 快照存放的目录
dir /opt/redis-2.6.8

# 数据文件是否要压缩。(为了方便查看数据文件内容,设置成no)
rdbcompression no

# redis操作的口令
# requirepass foobared

# Append Only File 功能被关闭(注意:为了更好测试快照功能,此功能最好关闭)
appendonly no

# daemonize:指定Redis是否后台运行

daemonize yes

2. 启动redis
[root@rac1 ~]# redis-server /etc/redis_master.conf > redis_master.log 2>&1 &
[1] 5009

3. 命令测试快照保存
[root@rac1 redis-2.6.8]# redis-cli
redis 127.0.0.1:6379> keys *
(empty list or set)
redis 127.0.0.1:6379> set aaa 1
OK
redis 127.0.0.1:6379> get aaa
"1"
redis 127.0.0.1:6379> set bbb 2
OK
redis 127.0.0.1:6379> set ccc 3
OK
redis 127.0.0.1:6379> save
OK
redis 127.0.0.1:6379> set ddd 4
OK
redis 127.0.0.1:6379> keys *
1) "aaa"
2) "bbb"
3) "ccc"
4) "ddd"
redis 127.0.0.1:6379> exit

--kill掉redis进程
[root@rac1 redis-2.6.8]# kill -9 5009
[root@rac1 redis-2.6.8]#
[1]+  已杀死                 redis-server /etc/redis_master.conf > redis_master.log 2>&1

--查看redis_master.log日志
[30640] 18 Mar 12:06:07.037 * DB saved on disk #save命令后数据保存到磁盘
[30640] 18 Mar 12:06:07.043 * RDB: 0 MB of memory used by copy-on-write
[30637] 18 Mar 12:06:07.063 * Background saving terminated with success
[30637] 18 Mar 12:06:07.069 * Synchronization with slave succeeded
[30637] 18 Mar 12:07:23.806 * DB saved on disk

4. 查看数据文件内容
[root@rac1 redis-2.6.8]# ll
-rw-rw-r-- 1 root root 14692 01-11 00:15 00-RELEASENOTES
-rw-rw-r-- 1 root root    52 01-11 00:15 BUGS
-rw-rw-r-- 1 root root  1440 01-11 00:15 CONTRIBUTING
-rw-rw-r-- 1 root root  1487 01-11 00:15 COPYING
drwxrwxr-x 6 root root  4096 03-12 16:07 deps
-rw-r--r-- 1 root root    41 03-18 11:59 dump.rdb
-rw-rw-r-- 1 root root    11 01-11 00:15 INSTALL
-rw-rw-r-- 1 root root   151 01-11 00:15 Makefile
-rw-rw-r-- 1 root root  4038 01-11 00:15 MANIFESTO
-rw-rw-r-- 1 root root  4059 01-11 00:15 README
-rw-rw-r-- 1 root root 23259 03-18 11:48 redis.conf
-rwxrwxr-x 1 root root   160 01-11 00:15 runtest
-rw-rw-r-- 1 root root  5754 01-11 00:15 sentinel.conf
drwxrwxr-x 2 root root  4096 03-12 16:11 src
drwxrwxr-x 8 root root  4096 01-11 00:15 tests
drwxrwxr-x 2 root root  4096 01-11 00:15 utils

--再次重启redis,加载快照,发现未保存的ddd丢失
[root@rac1 redis-2.6.8]# redis-server /etc/redis_master.conf > redis_master.log 2>&1 &
[1] 7113
[root@rac1 redis-2.6.8]# redis-cli
redis 127.0.0.1:6379> keys *
1) "aaa"
2) "bbb"
3) "ccc"

[root@rac1 redis-2.6.8]# cat dump.rdb
REDIS0006taaaàbbbàcccà?l
                        ?O¢w?[root@rac1 redis-2.6.8]#

二、验证redis的AOF功能
和快照功能一样,实现AOF功能只需要修改配置参数

1. 修改redis.conf配置文件
--主要修改appendonly
[root@rac1 redis-2.6.8]# vi /etc/redis_master.conf
appendonly yes

2. 重启redis服务
[root@rac1 redis-2.6.8]# redis-cli shutdown
[16739] 18 Mar 13:49:18.232 # User requested shutdown...
[16739] 18 Mar 13:49:18.234 * Saving the final RDB snapshot before exiting.
[16739] 18 Mar 13:49:18.245 * DB saved on disk
[16739] 18 Mar 13:49:18.245 # Redis is now ready to exit, bye bye...
[1]+  Done                    redis-server /etc/redis_master.conf

[root@rac1 redis-2.6.8]# redis-server /etc/redis_master.conf &

[root@rac1 redis-2.6.8]# ll
-rw-r--r-- 1 root root     0 03-18 13:54 appendonly.aof

3. 命令测试
[root@rac1 redis-2.6.8]# redis-cli
redis 127.0.0.1:6379> keys *
(empty list or set)
redis 127.0.0.1:6379> set eee 1
OK
redis 127.0.0.1:6379> set xxx 2
OK
redis 127.0.0.1:6379> get eee
"1"
redis 127.0.0.1:6379> get xxx
"2"
redis 127.0.0.1:6379> keys *
1) "xxx"
2) "eee"

--查看日志文件
[root@rac1 redis-2.6.8]# cat appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
set
$3
eee
$1
1
*3
$3
set
$3
xxx
$1
2

验证redis的快照和AOF的更多相关文章

  1. 实验验证redis的快照和AOF

    安装配置redis http://www.cnblogs.com/myrunning/p/4222385.html 验证redis的主从复制 http://www.cnblogs.com/myrunn ...

  2. redis RDB快照和AOF日志持久化配置

    Redis持久化配置 Redis的持久化有2种方式   1快照  2是日志 Rdb快照的配置选项: save 900 1      // 900内,有1条写入,则产生快照 save 300 1000 ...

  3. 170320、使用快照和AOF将Redis数据持久化到硬盘中

    前言 我们知道Redis是一款内存服务器,就算我们对自己的服务器足够的信任,不会出现任何软件或者硬件的故障,但也会有可能出现突然断电等情况,造成Redis服务器中的数据失效.因此,我们需要向传统的关系 ...

  4. 探索Redis设计与实现11:使用快照和AOF将Redis数据持久化到硬盘中

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  5. redis 实战操作RDB和AOF快照持久化

    前言:redis是我们常用的缓存方式,今天就来介绍下两种持久化的方式吧,先科普概念,再实战操作 一.RDB Redis将某一时刻的快照(备份的数据库数据)保存成一种称为RDB格式的文件中,这种格式是经 ...

  6. Redis持久化之rdb&aof

    Redis有两种持久化的方式:快照(RDB文件)和追加式文件(AOF文件) RDB持久化方式是在一个特定的间隔保存某个时间点的一个数据快照. AOF(Append only file)持久化方式则会记 ...

  7. Redis持久性——RDB和AOF

    Redis持久性 Redis提供了不同的持久性选项: RDB持久性以指定的时间间隔执行数据集的时间点快照. AOF持久性记录服务器接收的每个写入操作,将在服务器启动时再次播放,重建原始数据集.使用与R ...

  8. redis持久化RDB和AOF

    Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AO ...

  9. redis的 rdb 和 aof 持久化的区别 [转]

    aof,rdb是两种 redis持久化的机制.用于crash后,redis的恢复. rdb的特性如下: Code: fork一个进程,遍历hash table,利用copy on write,把整个d ...

随机推荐

  1. 修改chrome的安装目录(默认的竟然安装在documents and settings目录,google真不厚道)

    修改chrome的安装目录(默认的竟然安装在documents and settings目录,google真不厚道) 把chrome从系统目录提取出来 Vista下,Win+R运行 C:/Users/ ...

  2. Android学习笔记之Bitmap位图的缩放

    位图的缩放也可以借助Matrix或者Canvas来实现. 通过postScale(0.5f, 0.3f)方法设置旋转角度,然后用createBitmap方法创建一个经过缩放处理的Bitmap对象,最后 ...

  3. vue实现多语言国际化(vue-i18n),结合element ui、vue-router、echarts以及joint等。

    老板说我们的项目要和国际接轨,于是乎,加上了多语言(vue-i18n).项目用到的UI框架是element ui ,后续echarts.joint等全都得加上多语言. 一.言归正传,i18n在vue项 ...

  4. P2P平台项目建设几点注意事项

    种选择 a.资金池,接入第三方支付,财付通,宝付等,比如一起好 b.第三方资金托管,易宝支付.汇付天下等 c.银行存管,资金放在银行 资金池政策风险,不得不考虑. 每一种模式,技术实现都有变化,需要考 ...

  5. 使用 LaTeX 绘制 PGM(Probabilistic Graphical Models)中的贝叶斯网络(bayesian networks)

    Software for drawing bayesian networks (graphical models) 这里需要调用 latex 中的绘图库:TikZ and PGF. 注意,下述 tex ...

  6. GCJ 2009 Round 2 Problem A. Crazy Rows

    https://code.google.com/codejam/contest/204113/dashboard 题目大意: 给你一个矩阵,让你转化为下三角矩阵,每次只能交换相邻的行,求最小的交换次数 ...

  7. P2P平台很赚钱么?

    最近几年,搞P2P网贷和财富投资相关的金融周边公司,多了很多,楼下门店和电梯里的贷款小广告,真是多啊. 大家都去搞一件事的时候,很可能是大家都觉得这件事有利可图.但事实是,赚钱的总是少数,看到别人搞的 ...

  8. 火狐与IE的7个JavaScript差异

    作者注:本篇文章发表于2009.04.27,是一篇关于讨论Javascript在IE6.IE7和FF2+.FF3.0之间的存在的问题的文章. 虽然须要用冗长的JavaScript代码去识别特定的浏览器 ...

  9. C++小项目-本校科协管理系统

    前几天老师说让我把之前做过的一个小项目改动一下,用于新成员练手. 想到在我刚接触面向对象编程的时候,也是急需一个小的case来熟悉和深入对C++的理解.如今搞的这个东西.希望能够帮到学弟学妹们,嘻嘻. ...

  10. (转)nginx的root和alias指令的区别

    转自 http://www.cnblogs.com/tintin1926/archive/2012/07/11/2586813.html nginx配置下有两个指定目录的执行,root和alias   ...