Redis持久化

RDB

采用RDB持久化方式,redis会定期把数据快照保存到一个rdb文件中,并在启动时加载rdb文件,恢复之前保存的数据,可以在配置文件中设置保存数据的时间:

save {second} {change}

例子:save 60 100

意识是redis会每60s检查一次数据变更的情况,如果发生了100次的数据变化,则进行一次rdb快照保存,可以配置多条保存规则,redis是默认开启rdb快照的,默认的配置如下:

save 900 1

save 300 10

save 60 10000

也可以通过BG save来手动保存快照

RDB的优点:

1,对性能影响最小。

2,每次快照都会生成一个完整的数据快照文件,所以可以辅助其他手段保存多个时间点的快照(例如通过用脚本每天把快照备份到其他地方去),可作为灾难恢复手段。

3,使用RDB文件进行数据恢复比使用AOF要快很多。

RDB的缺点:

1,快照是定期生成的,所以Redis crash(紧急)时或多或少都会丢一些数据

2,如果数据集非常大而且服务器配置并不是很高,redis会在fork子进程的时候可能会消耗相对较长的时间,影响这期间客户端的请求。

AOF

采用AOF持久化方式时,redis会把每一个请求都记录在一个日志文件里面,在redis重启时,会把AOF文件所记录的的所有写操作重新执行一边,确保数据最新。

AOF默认是关闭的,如需开启,请在配置文件中修改:

appendonly yes

AOF提供了三种fsync配置,always|everysec|no三种,可以通过appendfsync指定:

1,appendfsync no:不进行fsync,将flush文件的时间交给os决定,速度最快

2,appendfsync always:每写入一条日志就进行一次fsync操作,数据安全性最高,但是速度最慢。

3,appendfsync everysec:折中的做法,交由后台线程每秒fsync一次

随着AOF不断地记录写操作日志,必定会出现一些无用的日志,例如某个时间点执行了set key1 "123",然后又在某个时间点执行了set key1 "456",那么第一条命令是没有用的,大量的无用日志会让AOF文件过大,变得臃肿,也会让恢复数据的时间更长。所以redis提供了AOF rewrite功能,可以重写AOF文件,只保留能够把数据恢复到最新状态的最小写操作集。

AOFrewrite可以通过BGREWRITEAOF命令执行,也可以配置redis定期自动执行:

auto-aof-rewrite-percentage 200

auto-aof-rewrite-min-size 128MB

这两条配置的意思是,redis在每次AOF重写时,会记录完成重写后的AOF日志大小,当AOF日志大小在该基础上增长了200%的时候,会自动进行AOF,同时,如果增长的大小没有达到128MB,就不会进行重写。

AOF的优点:

1,最安全,在启用了appendfsync always时,任何已经写入的数据都不会丢失,使用在启用appendfsync everysec也最多只会丢失1秒的数据

2,AOF文件在发送断电,宕机等问题时也不会损坏,即使出现了某条日志写入了一般的情况,也可以使用redis-check-aof工具修复

3,AOF文件易读,可修改,在进行了某些错误的数据清楚操作后,只要AOF文件没有重写,就可以把AOF备份出来,把错误的命令删除,然后恢复数据

AOF的缺点:

1,AOD文件通常比RDB文件更大

2,性能消耗比RDB高

3,数据恢复数据比RDB慢

Redis数据持久化引发的延迟有哪些:

1,网络通信的延迟

2,慢查询命令引起的响应延迟

3,fork引起的响应延迟

4,页交换引起的响应延迟

5,AOF和磁盘IO引起的响应延迟

6,过期数据引起的响应延迟

数据持久化引发的延迟:

redis的数据持久化工作本身就会带来延迟,需要根据数据的安全级别和性能要求制定合理的持久化计划:

1,AOF+fsync always的设置虽然能够绝对确保数据安全,但是每个操作都会出发一次fsync,会对redis的性能有比较明显的影响

2,AOF+fsync every second是比较好的方案,每秒fsync一次

3,AOF+fsync never会提供AOF持久化方案下的最优性能

4,使用RDB持久化通常会提供比使用AOF更高的性能,需要注意的是RDB的参数配置

5,每一次RDB快照和AOF重写都需要Redis主进程进行fork操作,fork操作本身可能会产生较高的耗时,与服务器CPU和Redis所占用的内存大小有关。根据具体的情况合理配置RDB快照和AOF重写时机,避免太过频繁的fork带来的延迟。

可以用一些常用的命令来检查

1,这个所谓的慢是可以通过参数slowlog-log-slower-than设定的,默认10000us,也就是10

ms

redis>slowlog get num

2,查看当前实例中那些key比较占用空间(redis-cli的参数)

redis-cli -bigkeys

3,查看redis相关的监控信息

redis>info 相关命令(memory cpu replication stats clients)

注意:客户端连接数默认限制为10000,total_commands_processed,instantaneous_ops_per_sec,net_io_in_per_sec,net_io_out_per_sec,total_commands,connected_clients,used_memory_human,used_memory_peak_human这些指标都需要关注。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

简析60度CMS的Cookies欺骗漏洞

前言 本篇文章只是为了和大家分享漏洞的挖掘经验和思路,同时让大家认识到 Cookies 欺骗漏洞的危害和严重性。 漏洞发现时间:2017.8.16,因产商无回应...

2538
来自专栏Laoqi's Linux运维专列

Redis的持久化-AOF

2958
来自专栏三杯水

Redis3.2.9/4.0.1集群部署配置优化

http://www.redis.cn/topics/cluster-spec.html

2122
来自专栏Porschev[钟慰]的专栏

.NET4.0下web应用程序用UrlRewriter.dll重写无后缀路径

示例环境:VS2010 要求:               重写前:http://localhost:13275/Default.aspx?username=w...

2099
来自专栏IT可乐

Redis详解(七)------ AOF 持久化

  上一篇文章我们介绍了Redis的RDB持久化,RDB 持久化存在一个缺点是一定时间内做一次备份,如果redis意外down掉的话,就会丢失最后一次快照后的所...

1050
来自专栏菩提树下的杨过

[原创]web application中使用Profile应该注意的问题

1.如何在web application中正确使用Profile web application与website的一个不同之处在于,web applicat...

1978
来自专栏散尽浮华

redis持久化策略梳理及主从环境下的策略调整记录

redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。可以不定期的通过异步方式保存到磁盘上(即“半持久化模式”...

37410
来自专栏张善友的专栏

让Response.Redirect页面重定向更有效率

用 Redirect 方法可将浏览器重定向到另一个 URL,而不是将内容发送给用户。 这里有一篇文章介绍使用Redirect《Using Response.Re...

2116
来自专栏玩转JavaEE

Redis之AOF持久化

上篇文章和小伙伴们聊了使用快照的方式实现redis数据的持久化,这只是持久化的一种方式,本文我们就来看看另一种持久化方式,AOF(append-only fil...

710
来自专栏武培轩的专栏

Redis持久化

Redis是内存型数据库,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。 Redis支持两种持久化的方式,一...

4025

扫码关注云+社区