验证redis的快照和AOF

本文深入解析Redis的两种持久化方式——快照与AOF,详细介绍了它们的工作原理、配置参数及优缺点。通过实验演示,展示了如何验证这两种持久化方式在Redis中的实际应用。

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

 

<think> 我们被要求提供关闭Redis的RDBAOF持久化方法。根据引用内容,我们知道RDBAOFRedis的两种持久化方式。要关闭它们,我们需要修改Redis的配置文件(redis.conf)或使用命令行配置。 步骤如下: 1. **关闭RDB(快照)持久化**: - 在配置文件中,找到与RDB相关的配置,主要是`save`指令。RDB通过`save`指令来触发快照保存,默认配置可能包含多个save条件(如`save 900 1`表示900秒内至少有1个键被修改则保存)。 - 要关闭RDB,我们可以注释掉所有`save`配置行,或者将它们设置为空字符串。也可以设置`save ""`来禁用RDB。 - 另外,也可以通过设置`stop-writes-on-bgsave-error`为`no`(虽然这不是直接关闭RDB,但通常与RDB相关)以避免在RDB保存失败时停止写入,但这不是必须的。 2. **关闭AOF(追加文件)持久化**: - 在配置文件中,找到`appendonly`配置项,将其设置为`no`(默认就是`no`)。这样AOF功能就被关闭了。 - 同时,AOF相关的配置如`appendfilename`、`appendfsync`等就不再起作用。 3. **动态配置(无需重启)**: - 如果Redis正在运行,我们可以通过`CONFIG SET`命令动态修改配置,但注意这些动态配置在重启后会失效。要永久生效,必须修改配置文件。 - 关闭RDB动态命令:`CONFIG SET save ""`(将save设置为空字符串) - 关闭AOF动态命令:`CONFIG SET appendonly no` 4. **重启Redis(如果修改了配置文件)**: - 如果修改了配置文件,需要重启Redis才能使配置永久生效(动态配置不需要重启,但重启后会丢失,所以修改配置文件后重启是必要的)。 具体操作: **方法一:修改配置文件(永久生效)** 1. 打开Redis配置文件(通常名为redis.conf)。 2. 找到RDB配置部分,注释掉所有`save`行,或者添加一行`save ""`(推荐)来禁用RDB。例如: ```conf # save 900 1 # save 300 10 # save 60 10000 save "" ``` 3. 找到AOF配置部分,将`appendonly`改为`no`: ```conf appendonly no ``` 4. 保存配置文件并重启Redis服务。 **方法二:使用命令行(临时生效,重启后失效)** 1. 连接Redis服务器:`redis-cli` 2. 执行以下命令关闭RDBAOF: ```sh # 关闭RDB CONFIG SET save "" # 关闭AOF CONFIG SET appendonly no ``` 3. 为了使这些配置永久化,还需要将这些设置写入配置文件(使用`CONFIG REWRITE`命令),但注意这个命令可能会失败(如果配置文件路径没有设置或者权限问题)。或者手动修改配置文件(如方法一)。 注意:关闭持久化后,Redis将完全在内存中运行,重启或崩溃后数据将丢失。请确保在不需要数据持久性的场景下使用。 根据引用[1][2],我们知道AOF的开启配置是`appendonly yes`,关闭则设置为`no`。RDB的触发条件由`save`配置决定,禁用RDB可以通过清空`save`配置来实现。 引用[4]提到AOF有三种写入方式,但关闭AOF后这些配置就不起作用了。 因此,关闭RDBAOF的方法总结为: - 设置`save ""`(禁用RDB) - 设置`appendonly no`(禁用AOF) 最后,我们生成相关问题。 </think>要关闭 Redis 的 RDB AOF 持久化功能,需修改 Redis 配置文件或通过命令行操作,以下是详细步骤: --- ### 一、永久关闭(修改配置文件) 1. **定位配置文件** 找到 Redis 配置文件 `redis.conf`(通常位于 `/etc/redis/` 或安装目录)。 2. **关闭 RDB** 注释或删除所有 `save` 配置行,并添加 `save ""`: ```conf # save 900 1 # 注释默认的 RDB 触发条件 # save 300 10 # save 60 10000 save "" # 显式禁用 RDB ``` 3. **关闭 AOF** 将 `appendonly` 设为 `no`: ```conf appendonly no # 关闭 AOF 持久化 ``` 4. **重启 Redis 生效** ```bash sudo systemctl restart redis # 系统服务方式 # 或 redis-server /path/to/redis.conf --daemonize yes # 手动启动 ``` --- ### 二、临时关闭(运行时命令) **通过 `redis-cli` 动态修改(重启失效)**: ```bash # 关闭 RDB 127.0.0.1:6379> CONFIG SET save "" # 关闭 AOF 127.0.0.1:6379> CONFIG SET appendonly no ``` --- ### 三、验证关闭状态 ```bash 127.0.0.1:6379> CONFIG GET save # 应返回空字符串 1) "save" 2) "" 127.0.0.1:6379> CONFIG GET appendonly # 应返回 "no" 1) "appendonly" 2) "no" 127.0.0.1:6379> INFO persistence # 检查关键指标 # RDB 部分 rdb_last_save_time:0 # 最后保存时间应为0 rdb_changes_since_last_save:0 # AOF 部分 aof_enabled:0 # 确认AOF已关闭 ``` --- ### ⚠️ 重要注意事项 1. **数据丢失风险** 关闭持久化后,**Redis 重启或崩溃时所有数据将丢失**,仅适用于临时缓存等非关键场景[^1][^2]。 2. **混合持久化关闭** 若启用了 RDB+AOF 混合模式(Redis 4.0+),需额外关闭: ```conf aof-use-rdb-preamble no # 禁用混合持久化[^3] ``` 3. **备份替代方案** 如需数据安全但不想用内置持久化,可考虑: - 定期手动执行 `BGSAVE` 备份 - 通过外部工具(如 `redis-dump`)导出数据 --- ### 操作流程总结 ```mermaid graph TD A[定位redis.conf] --> B[禁用RDB: save ""] A --> C[禁用AOF: appendonly no] B --> D[重启Redis服务] C --> D D --> E[验证配置: INFO persistence] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值