Redis的多种持久化方式总结

话题:Redis的多种持久化方式:

Redis是个支持持久化的内存数据库,redis需要经常将内存中的数据同步到磁盘来保证持久化。



1、RDB方式(Snapshotting默认快照方式):

1.1)配置:

save 900 1       #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10      #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000    #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。


1.2)工作原理:

1.2.1)Redis使用fork函数复制一份当前进程(父进程)的副本(子进程);

1.2.2)父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件;

1.2.3)当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成。


1.3)查看dump.rdb:

127.0.0.1:7000> config get dir
1) "dir"
2) "/usr/local/redis/db"
127.0.0.1:7000>


1.4)优点:

1.4.1)RDB是个非常紧凑的文件,保存了redis在某个时间点上的数据集,使得我们可以通过定时备份RDB文件来实现Redis数据库备份和灾难恢复,也可以将其传送到其他的数据中心用于保存。

1.4.2)RDB可以最大化redis的性能,执行RDB持久化时只需要fork一个子进程,并由子进程进行持久化工作,父进程不需要处理任何磁盘I/O操作。

1.4.3)RDB在恢复大数据集时比AOF要快,启动效率要高许多。

1.4.4)RDB文件是经过压缩(可以配置rdbcompression参数以禁用压缩节省CPU占用)的二进制格式,所以占用的空间会小于内存中的数据大小,更加利于传输。


1.5)缺点:

1.5.1)每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步增数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。

1.5.2)快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改,有一些数据丢失的风险。

1.5.2)client的save或者bgsave命令通知redis做一次快照持久化不推荐。

127.0.0.1:7000> save
OK
127.0.0.1:7000>

原因:save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有 client的请求,这种方式会阻塞所有client请求。所以不推荐使用。


2、Append-only file(缩写aof)的方式:

2.1)配置

appendonly yes  
#开启aof
appendfilename "appendonly.aof"  
#名字
# appendfsync always   
# 每次执行写入都会执行同步,最安全也最慢
appendfsync everysec   
# 每秒执行一次同步操作
# appendfsync no #不主动进行同步操作,而是完全交由操作系统来做(即每30秒一次),最快也最不安全。
#配置写入AOF文件后,要求系统刷新硬盘缓存的机制
auto-aof-rewrite-percentage 100  
# 当目前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据
auto-aof-rewrite-min-size 64mb   
# 允许重写的最小AOF文件大小

2.2)工作原理:

2.2.1)redis调用fork ,现在有父子两个进程

2.2.2)子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令

2.2.3)父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。

2.2.4.)当子进程把快照内容写入已命令方式写到临时文件中后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件。

2.2.5)现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。

2.3)查看aof

127.0.0.1:7000> config get dir
1) "dir"
2) "/usr/local/redis/db"
127.0.0.1:7000>
[[email protected] db]# ll
总用量 8
-rw-r--r-- 1 root root 146 2月   1 08:36 appendonly.aof
-rw-r--r-- 1 root root  74 2月   1 09:20 dump.rdb
[[email protected] db]#

2.4)优点:

2.4.1)该机制可以带来更高的数据安全性,即数据持久性。

2.4.2)由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。

2.4.3)如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。

2.4.4) AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,也可以通过该文件完成数据的重建。

2.5:缺点:

2.5.1)对于相同数量的数据集而言,AOF文件通常要大于RDB文件,持久化文件会变的越来越大。

2.5.2) 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。


3、其它

虚拟内存方式和diskstore方式。:(不建议,而且虚拟内存据说2.4版本后弃用,diskstore也不常用)

相关配置

持久化文件会变的越来越大。
vm-enabled yes          
#开启vm功能
vm-swap-file /tmp/redis.swap   
#交换出来的value保存的文件路径/tmp/redis.swap
vm-max-memory 1000000  
#redis使用的最大内存上限,超过上限后redis开始交换value到磁盘文件中
vm-page-size 32        
#每个页面的大小32个字节
vm-pages 134217728     
#最多使用在文件中使用多少页面,交换文件的大小 = vm-page-size * vm-pages
vm-max-threads 4       
#用于执行value对象换入换出的工作线程数量,0表示不使用工作线程



总结:

1、Redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易。重新启动Redis后Redis会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少。


2、读写分离 通过复制可以实现读写分离以提高服务器的负载能力。在常见的场景中,读的频率大于写,当单机的Redis无法应付大量的读请求时(尤其是较耗资源的请求,比如SORT命令等)可以通过复制功能建立多个从数据库,主数据库只进行写操作,而从数据库负责读操作。


3、从数据库持久化 持久化通常相对比较耗时,为了提高性能,可以通过复制功能建立一个(或若干个)从数据库,并在从数据库中启用持久化,同时在主数据库禁用持久化。当从数据库崩溃时重启后主数据库会自动将数据同步过来,所以无需担心数据丢失。而当主数据库崩溃时,需要在从数据库中使用SLAVEOF NO ONE命令将从数据库提升成主数据库继续服务,并在原来的主数据库启动后使用SLAVEOF命令将其设置成新的主数据库的从数据库,即可将数据同步回来。

时间: 2024-08-13 08:07:05

Redis的多种持久化方式总结的相关文章

Redis两种持久化方式(RDB&AOF)

爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Redis并发锁 windows下redis基础操作与主从复制 从而 数据备份和读写分离 Redis两种持久化方式(RDB&AOF) Redis的持久化过程中并不需要我们开发人员过多的参与,我们要做的是什么呢?除了深入了解RDB和AOF的作用原理,剩下的就是根据实际情况来制定合适的策略了,再复杂一点,也就

redis两种持久化方式的优缺点

redis两种持久化的方式 RDB持久化可以在指定的时间间隔内生成数据集的时间点快照 AOF持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,AOF文件中全部以redis协议的格式来保存,新命令会被追加到文件的末尾,redis还可以在后台对AOF文件进行重写,文件的体积不会超出保存数据集状态所需要的实际大小, redis还可以同时使用AOF持久化和RDB持久化,在这种情况下,当redis重启时,它会有限使用AOF文件来还原数据集,因为AOF文件保存的数据集

探究Redis两种持久化方式下的数据恢复

对长期奋战在一线的后端开发人员来说,都知道redis有两种持久化方式RDB和AOF,虽说大家都知道这两种方式大概运作方式,但想必有实操了解得不会太多. 这里是自己实操两种持久化方式的一点点记录. 先看以下摘录自redis官网原文解释(当然原文是English,这里用google翻译过了.) Redis持久性 Redis提供了不同的持久性选项范围: RDB持久性按指定的时间间隔执行数据集的时间点快照. AOF持久性会记录服务器接收的每个写入操作,这些操作将在服务器启动时再次播放,以重建原始数据集.

Redis:两种持久化方式RDB和Aof对比(3)

一.RDB快照 1.概念 默认的持久化方案. 在指定时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中. 在指定目录下生成一个dump.rdb文件. 重启会通过加载dump.rdp文件恢复数据. 2.对应配置参数 save <seconds> <changes> eg: save 900 1 save 300 10 save 60 10000 若不想用RDB方案,则为save "" # 时间策略save 900 1 save 300 10 save

Redis学习之持久化方式和配置

1. 快照的方式持久化到磁盘 自动持久化规则配置 save 900 1 save 300 10 save 60 10000 上面的配置规则意思如下: #   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

Redis的多种启动方式比较!

有感: Redis玩了许久时间,真心感觉启动方式还是自己定义的方便! 1)直接启动和关闭:(配置文件默认) 开启:redis-server &(&后台运行) #daemonize yes(也可配置文件修改此参数) 关闭:redis-cli shutdown or killall -9 redis-server   2)指定配置文件启动: redis-server /etc/redis.conf(配置文件可自己定义) 如果更改了redis默认端口: redis-cli shutdown (-

[转载] redis 的两种持久化方式及原理

转载自http://www.m690.com/archives/371 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能.所以Redis也可以被看成是一个数据结构服务器.Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”):也可以把每一次数据变化都写入到一个app

redis的持久化方式

redis有两种持久化方式,第一种是基于快照的持久化方式,第二种是基于文件追加的持久化方式 一.基于快照的持久化 1.修改redis.conf配置文件,开启基于快照的持久化方式 2.修改持久化文件存放的位置 3.重启服务,测试 二.基于文件追加的持久化方式 1.修改redis.conf配置文件,开启基于文件追加的持久化方式 2.修改备份的周期 3.重启服务,测试 杀掉redis服务,模拟断电效果,然后重启redis服务,获取之前保存的数据,也可以获取到

Redis持久化方式RDB与AOF详解

前言 Redis提供了两种数据存储方式,分别是:cache-only && persistence:cache-only顾名知义,是用与缓存服务的,数据在服务器终止后将消失,在此模式下将不存在"数据恢复"的方式,是一种安全性低.效率高.易扩展的模式:persistence即内存中的数据持久备份至磁盘文件中,在服务重启之后能够恢复数据,这种模式下数据的安全性大大提高.cache-only没有什么讲的,这里主要说明Redis的持久化存储模式.对于persistence持久化