Redis 持久化技术 ,大名鼎鼎的Rdb和Aof,你会选谁呢?

十年河东,十年河西,莫欺少年穷

学无止境,精益求精

首先说下,我的 Redis 系列博客如下:

[置顶] 高并发时,使用Redis应注意的问题【缓存穿透、缓存击穿.、缓存雪崩】

windows环境下配置Redis主从复制-一主二仆,薪火相传、反客为主、哨兵模式

Redis 持久化技术 ,大名鼎鼎的Rdb和Aof,你会选谁呢?

简单介绍下Redis消息队列,实际生产环境中,大数据高并发时,不建议使用Redis做消息队列中间件

Redis 事务,和传统的关系型数据库ACID并不同,别搞混了

Redis常用配置redis.conf介绍,别把默认配置部署到到服务器,否则,会被领导骂的

C# Nuget程序集StackExchange.Redis操作Redis 及 Redis 视频资源 及 相关入门指令 牛逼不,全都有

Redis 的基础数据类型

Window环境下安装Redis 并 自启动Redis 及 Redis Desktop Manager

进入正文

Redis 提供了多种不同级别的持久化方式:

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

AOF 【Append Only File】持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。

Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。

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

一、RDB的持久化
工作原理:每隔一定时间给内存照一个快照,将内存中的数据写入文件(rdb文件)。这是Redis默认的持久化方式。当redis生成dump.rdb文件时,工作过程如下:

当达到RDB生成条件时,redis主进程fork一个子进程

fork出来的子进程将内存的数据集dump到临时的RDB中

当子进程对临时的RDB文件写入完毕,redis用新的RDB文件代替旧的RDB文件

配置参数如下【参考的redis.conf配置文件】:

含义分别是:

15分钟内有1个写入操作【包括修改和删除】,将会更新dump.Rdb文件。

6分钟内有10个写入操作【包括修改和删除】,将会更新dump.Rdb文件。

1分钟内有10000个写入操作【包括修改和删除】,将会更新dump.Rdb文件。

需要说明的是,Redis默认使用Rdb的方式进行持久化,Rdb持久化可以和Aof共存。

RDB的缺点:
在两次快照之间,如果发生断电,数据会丢失。举例:在生成rdb后,插入新值。突然断电,数据可能会丢失。也就是说,Rdb在数据完整性这块没有Aof那么优秀。

RDB的优点:

RDB的效率会高于Aof,在数据完整性要求不那么高的情况下,建议采用RDB模式。

显式保存/更新dump.Rdb:

在redis持久化技术中,如果想实时持久化dump.Rdb文件,可以使用save指令。

C:\Users\chenwolong>redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> save
OK
127.0.0.1:6379> keys *
1) "rds_set01"
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> save
OK
127.0.0.1:6379>

如果你使用flushall指令,该指令将会清空dump.rdb文件,此指令慎用。因为用了,会清空所有16个数据库的key。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379>

 监控Rdb

Redis监控最直接的方法当然就是使用系统提供的 info 命令来做了,只需要执行下面一条命令,就能获得 Redis 系统的状态报告。

C:\Users\chenwolong>redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> info
# Server
redis_version:5.0.10
redis_git_sha1:1c047b68
redis_git_dirty:0
redis_build_id:76de97c74f6945e9
redis_mode:standalone
os:Windows
arch_bits:64
multiplexing_api:WinSock_IOCP
atomicvar_api:pthread-mutex
process_id:5324
run_id:e80e12a295d0733a7e33b8d7f78619bbafe32b9d
tcp_port:6379
uptime_in_seconds:81905
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:5521244
executable:C:\Program Files\Redis\"c:\program files\redis\redis-server.exe"
config_file:C:\Program Files\Redis\redis.windows-service.conf

# Clients
connected_clients:1
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0

# Memory
used_memory:724384
used_memory_human:707.41K
used_memory_rss:682128
used_memory_rss_human:666.14K
used_memory_peak:724408
used_memory_peak_human:707.43K
used_memory_peak_perc:100.00%
used_memory_overhead:710342
used_memory_startup:660392
used_memory_dataset:14042
used_memory_dataset_perc:21.94%
allocator_allocated:5898008
allocator_active:432013312
allocator_resident:457179136
total_system_memory:0
total_system_memory_human:0B
used_memory_lua:37888
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:73.25
allocator_frag_bytes:426115304
allocator_rss_ratio:1.06
allocator_rss_bytes:25165824
rss_overhead_ratio:0.00
rss_overhead_bytes:-456497008
mem_fragmentation_ratio:1.00
mem_fragmentation_bytes:0
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:49950
mem_aof_buffer:0
mem_allocator:jemalloc-5.2.1-redis
active_defrag_running:0
lazyfree_pending_objects:0

# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1616117339
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:0
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0
aof_current_size:90
aof_base_size:90
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0

# Stats
total_connections_received:5
total_commands_processed:30
instantaneous_ops_per_sec:0
total_net_input_bytes:1227
total_net_output_bytes:65190
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:57084
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0

# Replication
role:master
connected_slaves:0
master_replid:eb41d45f5df47dce112c1d0496ca61bb66b3206f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
used_cpu_sys:0.328125
used_cpu_user:0.343750
used_cpu_sys_children:0.000000
used_cpu_user_children:0.000000

# Cluster
cluster_enabled:0

# Keyspace
127.0.0.1:6379>

rdb_changes_since_last_save 表明上次RDB保存以后改变的key次数

rdb_bgsave_in_progress 表示当前是否在进行bgsave操作,1表示正在进行;0表示没有进行

rdb_last_save_time 上次保存RDB文件的时间戳

rdb_last_bgsave_time_sec 上次保存的耗时

rdb_last_bgsave_status 上次保存的状态

rdb_current_bgsave_time_sec 目前保存RDB文件已花费的时间

修复错误的Rdb,如果服务器断电时或者重启/关机时,Rdb的save工作正在进行,且并未完成,这是的dump.rdb就可能出错,如果dump出错了,那么整个Redis服务也就挂了,那么当Rdb损坏或者错误时,我们怎么修复Rdb文件呢?

修复的原则是先备份,后修复

 

 

 在Redis的安装目录下,我们可以看到有>redis-check-rdb.exe 和 redis-check-aof.exe,这两个可执行程序是依据Redis的过滤规则,规律掉Rdb或Aof中错误的部分,然后重新生成正确的文件。

一、AOF的持久化【Append only File】

AOF持久化方式在Redis.conf中默认是关闭的,因此,我们需要将appendonly:No 改成 appendonly:Yes

执行如下指令:

C:\Users\chenwolong>redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> config set appendonly yes
OK
127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "yes"
127.0.0.1:6379>

AOF的优缺点:

AOF模式中数据的完整性要由于Rdb模式,但执行效率性能方面要低于Rdb,因此,如果对数据的完整性要求比较高,建议会用Aof的方式。

AOF的工作模式:

在AOF模式中,有三种模式

Redis 目前支持三种 AOF 保存模式,它们分别是:

AOF_FSYNC_NO :不保存。

AOF_FSYNC_EVERYSEC :每一秒钟保存一次。

AOF_FSYNC_ALWAYS :每执行一个命令保存一次。

在这里,我们使用默认值:每一秒保存一次。这样,就会出现一个问题,文件:appendonly.aof 将会越来越大,Redis针对appendonly.aof文件有一个默认的瘦身策略,如下:

 修改配置文件,可以通过管理员方式直接修改redis.windows-service.conf,修改完成后,重启redis服务即可生效

这里的意思是:当文件大于64M或者当前大小的一倍时,Redis会启动瘦身策略。在实际生产环境中,Redis的默认最小大小设置为64MB是不够的,因此每进行一次瘦身,就会消耗一次服务器IO资源,所有有比较将此值设大点

设置瘦身的大小
C:\Users\chenwolong>redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> config set auto-aof-rewrite-min-size 128MB
OK
127.0.0.1:6379> config get auto-aof-rewrite-min-size
1) "auto-aof-rewrite-min-size"
2) "134217728"
127.0.0.1:6379>

最后,借用别人的内容,如下:

redis 持久化 aof和rdb的加载顺序问题

如果开启 aof 和 rdb 。在redis重启后, 是先加载哪个文件?

查了很多资料都说是先加载aof, 但是也说了 如果 aof文件不存在,则加载 rdb文件

但经过测试,如果 aof不存在(手动删除aof文件),貌似会创建一个新的 空的 aof文件,并没有去用 rdb文件

这是咋回事?(我的版本是Redis 5.0.8)

回答

1.aof和rdb都开启,只会加载aof,因为aof最能保证数据的完整性
2.关于你的疑问,其实很好解释,加载的顺序,取决于你的配置文件是否开启了aof,而不是说去判断aof文件是否存在!!所以配置很重要!!

主要是看到这么一张图,看着画的挺细的

 

 最最后,祝福大家快乐每一天。

 @天才卧龙的博客

 

posted @ 2021-03-25 14:32  天才卧龙  阅读(505)  评论(0编辑  收藏  举报