java:Redis持久化
一.redis持久化的介绍?Redis的持久化指的是将内存中redis数据库运行的数据 , 写到硬盘文件上 。
?Redis持久化的意义主要在于故障恢复 , 比如你部署一个Redis , 作为缓存有可能里边有一些比较重要的数据 , 如果没有持久化的时候 , redis遇到灾难性故障的时候就会丢失所有的数据 。
Redis持久化的两种方式:
RDB:RedisDataBase默认的持久化方式 , 以二进制的方式将数据写入文件中,每隔一段时间写入一次 。 AOF:AppendOnlyFile以文本文件的方式记录用户的每次操作 , 数据还原时候 , 读取AOF文件 。
?在redis.conf配置文件中默认有此下配置:
save9001?#在900秒(15分钟)之后 , 如果至少有1个key发生变化 , Redis就会自动触发BGSAVE命令创建快照 。 save30010?#在300秒(5分钟)之后 , 如果至少有10个key发生变化 , Redis就会自动触发BGSAVE命令创建快照 。 save6010000?#在60秒(1分钟)之后 , 如果至少有10000个key发生变化 , Redis就会自动触发BGSAVE命令创建快照 。
?当满足条件时,redis需要执行RDB的时候服务器会执行以下操作:
redis调用系统的fork()函数创建一个子进程子进程将数据集写入一个临时的RDB文件当子进程完成对临时的RDB文件的写入时 , redis用新的RDB文件来替换原来旧的RDB文件 , 并将旧的RDB文件删除redis在进行快照的过程中不会对RDB文件进行修改 , 只有快照结束后才会将旧快照替换成新快照 , 也就是说任何时候RDB都是完整的
?与快照持久化相比 , AOF持久化的实时性更好 , 因此已成为主流的持久化方案 。 默认情况下Redis没有开启AOF(appendonlyfile)方式的持久化 , 可以在redis.conf配置文件通过appendonly参数开启:
appendonlyyes
在Redis的配置文件中存在三种不同的AOF持久化方式 , 它们分别是:
appendfsyncalways?#每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度appendfsynceverysec?#每秒钟同步一次 , 显示地将多个写命令同步到硬盘appendfsyncno?#让操作系统决定何时进行同步
?为了兼顾数据和写入性能 , 用户可以考虑appendfsynceverysec选项 , 让Redis每秒同步一次AOF文件 , Redis性能几乎没受到任何影响 。 而且这样即使出现系统崩溃 , 用户最多只会丢失一秒之内产生的数据 。 当硬盘忙于执行写入操作的时候 , Redis还会优雅的放慢自己的速度以便适应硬盘的最大写入速度 。
?redis中的数据是有一定限量的 , 不可能说redis中的数据无限增长 , 进而导致AOF文件无限增长 。 内存大小是一定的 , 等到了一定大小,redis会采用淘汰策略自动将内存中的数据清除掉 。 ?AOF是存放每条写命令的 , 所以会不断的增大 , 当大到一定程度时 , AOF会做rewrite操作,rewrite操作就是基于当时redis的数据重新构造一个小的AOF文件 , 然后将大的AOF文件删除 。
不要仅仅使用RDB这样会丢失很多数据 。 也不要仅仅使用AOF , 因为这样会有两个问题 , 第一通过AOF做冷备没有RDB做冷备恢复的速度快;第二RDB每次简单粗暴生成数据快照 , 更加健壮 。 综合AOF和RDB两种持久化方式 , 用AOF来保证数据不丢失 , 作为恢复数据的第一选择;用RDB来做不同程度的冷备 , 在AOF文件都丢失或损坏不可用的时候 , 可以使用RDB进行快速的数据恢复 。
?为了解决AOF文件体积膨胀的问题 , Redis提供了AOF重写功能:Redis服务器可以创建一个新的AOF文件来替代现有的AOF文件 , 新旧两个文件所保存的数据库状态是相同的 , 但是新的AOF文件不会包含任何浪费空间的冗余命令 , 通常体积会较旧AOF文件小很多 。
?AOF重写是一个有歧义的名字 , 该功能是通过读取数据库中的键值对来实现的 , 程序无须对现有AOF文件进行任何分析操作 。
4.2.2AOF重写触发的方式
a.手动触发:用户通过调用bgrewriteaof手动触发
b.自动触发:如果全部满足的话 , 就触发自动的AOF重写操作:
?没有RDB持久化/AOF持久化在执行 , 没有bgrewriteaof在进行;?当前AOF文件大小要大于redis.conf配置的auto-aof-rewrite-min-size大小;?当前AOF文件大小和最后一次重写后的大小之间的比率等于或者等于指定的增长百分比(在配置文件设置了auto-aof-rewrite-percentage参数 , 不设置默认为100%)【java:Redis持久化】?#redis.conf配置文件中的相关设置auto-aof-rewrite-percentage100?#大于原来的100%就自动重写auto-aof-rewrite-min-size64m?#自动重写的最小尺寸
推荐阅读
- Java|软件开发平台之争:NET VS Java,谁是更好的选择?
- Java|办公小技巧:超凡业绩 从完美的KPI仪表板开始
- 阿里巴巴|学Java前,我一直以为阿里巴巴就是卖货的
- Java|面向对象之构造方法、成员变量 Java记录07
- 照相机|基于Excel和Java自动化工作流程实例:发票生成器
- Java|阿里中间件/百度/蚂蚁中间件Java岗面试究竟有多难?你亲自体验下
- 阿里巴巴|他仅仅是个Java1年经验,面试16K的外派支付宝,你们说香吗
- 让这个Java语言的开源商城系统火起来
- 操作系统|java类加载机制
- 给我1万字,也讲Java不清内存排查。1万不行来2万~.
