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 条评论
登录 后参与评论

相关文章

来自专栏IT技术精选文摘

精讲Redis:持久化

从这篇文章开始,将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。

1033
来自专栏Java架构师学习

精讲Redis持久化前言一、Redis高可用概述二、Redis持久化概述三、RDB持久化四、AOF持久化五、方案选择与常见问题六、总结

1975
来自专栏崔庆才的专栏

一文详细揭秘 Redis 持久化,了解一下?

Redis 是一个开源( BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持的数据类型很丰富,如字符串、链表、集 合、以及散...

582
来自专栏Java架构沉思录

Redis持久化方案该如何选型

这篇文章主要介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。

1122
来自专栏自然语言处理

GitHub简明操作指南

GitHub的是版本控制和协作代码托管平台。它可以让你和其他人的项目从任何地方合作。Git也是目前世界上最先进的分布式版本控制系统(没有之一)。最初编写用作Li...

642
来自专栏非著名程序员

每个人都该学git,最新GitHub与Git指令快速上手

写在前面:最近后台有人跟我说需要git上手教程,但是我又没时间写,就给大家找了一篇不错的上手文章,希望能够帮到大家,而且我还提供了一份关于git的视频教程,就在...

1958
来自专栏杂七杂八

vscode中使用git

vscode简介 VSCode是微软推出的一款轻量编辑器,采取了和VS相同的UI界面,搭配合适的插件可以优化前端开发的体验。 布局:左侧是用于展示所要编辑的...

3627
来自专栏吴裕超

github import repository创建github仓库

现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。 首先,登陆GitHub,创建一个新的仓库,名字叫blog 1.先创建一个项目仓库 2...

2726
来自专栏云计算教程系列

如何在Ubuntu 14.04上使用Ghost和Nginx创建博客

Ghost是一个轻量级(~7.5MB)的开源博客平台,非常易于使用。Ghost是完全可定制的。互联网上有很多可供Ghost使用的免费或付费的主题。

490
来自专栏企鹅号快讯

g4e基础篇#4 了解Git存储库

Git 存储库看上去就是一个文件夹,只是在这个文件夹中不仅仅保存了所有文件的当前版本,也同时保存了所有的历史记录,这些额外的信息都保存在当前文件夹下面的.git...

1966

扫码关注云+社区