redis 7年前

从零学习redis(2)--- RDB持久化

作者头像 刘宇帅
2810 0

RDB 是 Redis 的一个持久化方案,也是 Redis 默认的持久化方案。RDB 持久化可以手动执行也可以根据服务器配置定期执行。
RDB 持久化所生成的 RDB 文件是一个经过压缩的二进制文件,使用该文件可以还原生成 RDB 文件时的数据库状态。RDB 保存在硬盘上,所以即使 Redis 服务器退出甚至运行 Redis 的服务器停机,但只要 RDB 文件还在就不影响数据的恢复。

RDB文件创建和载入

有两个 Redis 命令可以用于生成 RDB 文件,一个是 SAVE ,另一个是BGSAVE
SAVE命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕为止,在这期间服务器不能接受任何命令请求。

127.0.0.1:6379> save
OK

SAVE命令阻塞服务器进程做法不同,BGSAVE命令会派生出一个子进程(RDB的定期持久化也是fork一个子进程进行的),然后由子进程负责创建 RDB 文件,服务器进程可以正常处理命令请求。

127.0.0.1:6379> bgsave
Background saving started

SAVE命令或则BGSAVE命令创建 RDB 文件不同,RDB 文件的载入工作是在 Redis 服务器启动的时候自动执行的,服务器启动时如果检查到 RDB 文件就会自动执行。
RDB 文件的默认目录是当前目录,文件名是 dump.rdb,可以在 redis.conf 配置文件里查看或则修改

dir ./   # rdb文件存储路径
dbfilename dump.rdb    # rdb文件名

ps:AOF 文件的更新频率比较高,那么服务器会优先使用 AOF 文件恢复数据,如果服务器关闭了 AOF 功能的话才会使用 RDB 来恢复数据。

save bgsave 命令测试

我们起一个新的redis,这个时候 redis 里数据为空:

127.0.0.1:6379> KEYS *
(empty list or set)

这个时候我们在 redis 里新建几个值,并使用 save 或则 bgsave 生成 RDB 文件。

127.0.0.1:6379> set user:1 shuai
OK
127.0.0.1:6379> set user:2 bushuai
OK
127.0.0.1:6379> set user:3 shuaishuai
OK
127.0.0.1:6379> keys *
1) "user:2"
2) "user:3"
3) "user:1"
127.0.0.1:6379> save
OK

我们关闭 redis 服务器并再次启动

> $ docker stop 196cbe3bf787  // 我这里使用的docker
> $ docker start 196cbe3bf787

检查 redis 服务器里的数据

127.0.0.1:6379> keys *
1) "user:2"
2) "user:1"
3) "user:3"
127.0.0.1:6379> get user:1
"shuai"
127.0.0.1:6379> get user:2
"bushuai"
127.0.0.1:6379> get user:3
"shuaishuai"

查看 RDB 文件

REDIS0008�  redis-ver4.0.11�
redis-bits�@�ctime����[used-mem��T
                                  �
                                   aof-preamble���user:2bushuaiuser:3

因为 RDB 文件是压缩的二进制文件,所以我们勉强可以看到我们数据的影子。我们可以通过设置配置文件 redis.conf 的 rdbcompression no 来关闭压缩。
我们关闭压缩,重启redis,并生成 RDB 文件

REDIS0008�  redis-ver4.0.11�
redis-bits�@�ctime�a��[used-mem¨�
                                 �
                                  aof-preamble���user:3
shuaishuaiuser:2bushuaiuser:1shuai���Ga}y�

RDB文件压缩不压缩对比

压缩:
    优点:减少磁盘存储空间
    缺点:消耗CPU资源
不压缩:
    优点:不消耗CPU资源
    缺点:占用磁盘空间多

自动间隔性保存

RDB 是 Redis 默认的持久化方案,并且默认的持久化策略是周期性的,redis.conf 里相应配置如下

save 900 1 # 15分钟内至少有一个键被更改 
save 300 10 # 5分钟内至少有10个键被更改
save 60 10000 # 1分钟内至少有10000个键更改

当满足上面任何一个条件的时候都会生成相应的RDB文件。如果要关闭 RDB 只需要把上面配置修改为

save ""

即使我们修改了配置以关闭 RDB,但是如果我们执行 SAVE 或则 BGSAVE 依然会生成 RDB 文件。

ps: RDB 文件会保存在 redis.conf 指定的文件里,所以 RDB 里保存的永远是上次生成 RDB 的时候的数据状态,如果我们需要定时备份不同时期的数据需要自己定时去备份不同时刻的 RDB 文件。

作者头像

刘宇帅

非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。

提示

功能待开通!


暂无评论~

相关文章

从零学习redis(8)--- 过期及过期策略

redis 的 string 类型是支持过期设置的,默认是永不过期的。 Redis 设置过期 redis 中设置设置 key 过期有3中方式 第一种在设置值的时候指定过期时间 Set 命令格式 SET key value [EX seconds] [PX milliseconds] [NX|XX] EX second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。 PX millisecond :设置键的过期时间为 millisecond 毫秒。 3. SET key value PX m

从零学习redis(6)--- 多机部署之集群模式

Redis 作为高效的缓存数据库,单机也能够表现出很好的性能。但是随着数据的增加、并发的增加,单机模式的 Redis 会受到单机性能、容量、稳定性的限制,即使 Redis 提供了稳定的持久化方案,但是单机服务器始终是部署在单个机器上,如果运行机器本身的服务器出现问题我们很难在短时间恢复服务。所以 Redis 提供了三种多机模式: 主从复制模式 哨兵模式 集群模式 redis集群模式 哨兵模式解决了主节点挂掉的问题,但是没有解决从节点挂掉的问题,而 redis 集群模式可以有效的解决这个问题。redis集群中的数据是和槽(slot)挂钩的,一共定义了16384个槽,所有的数据使用一致性哈希分

从零学习redis(5)--- 多机部署之哨兵模式

Redis 作为高效的缓存数据库,单机也能够表现出很好的性能。但是随着数据的增加、并发的增加,单机模式的 Redis 会受到单机性能、容量、稳定性的限制,即使 Redis 提供了稳定的持久化方案,但是单机服务器始终是部署在单个机器上,如果运行机器本身的服务器出现问题我们很难在短时间恢复服务。所以 Redis 提供了三种多机模式: 主从复制模式 哨兵模式 集群模式 哨兵模式 主从复制模式解决了数据备份和单机可能存在的性能问题,但是也引入了新的问题,一主多从,在使用过程中,如果主服务器挂掉那么整个 Redis 服务的写就挂掉了,如果一个从服务器挂掉那么调用方就无法正确的读数据了,只能通过修改调

从零学习redis(15)--- 源码阅读之内存分配

redis 中内存管理没有直接使用 C 语言提供的方法而是做了一个可管理已分配内存大小及添加了自己分配策略的实现,下面从 SDS 开始去了解 redis 的内存管理实现及策略。 SDS 内存管理函数定义如下: src/sdsalloc.h #include "zmalloc.h" #define s_malloc zmalloc #define s_realloc zrealloc #define s_free zfree s_malloc 内存申请、s_realloc 内存重新分配、s_free 内存释放,这里定义分别是 zmalloc.h 里三个函数的别名,而 zmalloc zrea

从零学习redis(12)--- 大量导入数据

有时候我们需要在短时间内往 redis 里插入大量的数据,我们如果单条单条的出入会浪费很多时间和服务器资源,我们可以使用管道来实现快速的插入。 netcat 我们把需要插入 redis 的数据创建为如下的一个命令集文件 set key1 val1 set key2 val2 ... set key3 val3 我们使用如下命令执行数据导入 > $ cat /tmp/test|nc localhost 6379 +OK +OK +OK pipe mode 使用 netcat 并不是一个可靠地方式,因为用netcat进行大规模插入时不能检查错误。从Redis 2.6开始redis-cli支