redis持久化探究
redis支持两种持久化方式,一种是RDB方式,另一种是AOF方式。redis3.0windows版本默认关闭AOF(appendonly no),而开启RDB,当达到一定条件时,redis就会将内存中的所有数据生成一份副本并存储到硬盘上。
RDB持久化:
RDB持久化会在dir目录下产生一个以.rdb为后缀名的文件,在配置文件中配置dir目录及文件名,默认dir目录是跟目录,文件名是dump.rdb。
redis在4种情况下会进行RDB持久化:
1.根据配置规则自动进行RDB持久化:
默认配置文件是这样写的:
save 900 1
save 300 10
save 60 10000
每一行第一个数是多少毫秒的意思,第二个数是被更改的键的数量。这三行条件是或的关系,无论达到哪一个条件,redis就会自动RDB持久化。比如说第一行,如果在900秒内有1个键被更改,redis就会自动RDB持久化。可以根据项目需要,更改此配置规则。
2.主动执行持久化命令:
这样的命令有2个,save(对应jedis.save()方法)、bgsave(对应jedis.bgsave()方法),这两个命令一执行,不管配置文件中有没有配置自动持久化的条件,都会RDB持久化。但是值得注意的是,save命令是同步的持久化,会阻塞客户端的请求,不应避免在生产环境中用。bgsave命令是异步的持久化,不会阻塞客户端的请求。
3.执行清库命令:
执行flushall命令(对应jedis.flushAll()方法)时,只要在配置文件中配置了自动RDB持久化的条件,即使达不到其中任何一条条件,也会进行RDB持久化。
4.主从复制时:
当设置了主从模式时,即使没有设置自动RDB持久化的条件,也会在复制初始化时进行RDB持久化。
AOF持久化:
AOF是append only file,字面意思是往文件追加,其实就是把每一条写命令保存到硬盘上的一个文件上(读命令不会保存),文件名和文件路径在配置文件中配置,默认也在根目录,文件名是appendonly.aof。
redis默认关闭AOF,需要我们修改配置文件来开启AOF:appendonly yes,这样在redis服务一启动的时候就会在dir目录里创建aof文件,如果有的话(人为复制进去),就会读取aof文件内容,加载数据到内存。
将写命令保存到aof文件中的频率是可以在配置文件中配置的,默认是appendfsync everysec即每秒保存一次,这也是最好的方式。配置文件中还有另外两种可以选,appendfsync always即是每执行一条写命令就保存到文件中,这种方式是最安全的,但是要知道执行一条命令的速度是毫秒级的,所以这种方式是也是最耗费性能的。还有一种appendfsync no,最不常用,意思是由操作系统来决定,这简直是扯淡,不确定性太大。
aof文件还可以重写,为什么重写?比如说执行了100条写命令,但这些写命令都是对同一个键操作的,可能第100条命令就把前99条的结果覆盖了,这时候实际上只需要第100条命令就好了。aof文件重写可以自动重写,也可以调用命令直接重写。
自动重写条件可以在配置文件中配置,默认是
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb,即aof文件大小超过上次重写后的100%时会重写,但是文件大小要最少达到64M。
手动重写命令是bgrewriteaof(对应jedis.bgrewriteaof()),当执行了这个命令之后,aof文件就会立刻重写。
如果没有开启AOF,那么redis启动后redis会在dir目录中找rdb文件。如果有(在第一次启动时,人为添加一个rdb文件也可以),则读取rdb文件并加载数据到内存中,之后按照配置的规则来进行RDB持久化。如果没有(可能被人为删掉了),则在第一次RDB持久化的时候创建rdb文件,此后还是按照配置的规则来进行RDB持久化。
如果开启了AOF,那么redis就会在启动的时候读取aof文件的内容加载数据到内存中,即使aof文件内容为空,也不会去读取rdb文件。如果没有(可能redis上次运行的时候没有进行操作或者aof文件被人为的删掉了),则新建,之后按照配置的规则往文件里写数据。运行过程中,如果人为删掉aof文件,也不会再创建了,重启之后就会丢数据。
redis持久化探究的更多相关文章
- redis持久化RDB和AOF
Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AO ...
- Redis持久化
Redis持久化 快照(默认) 将内存中的数据以快照的方式写入到二进制文件中,默认文件名是dump.rdb. 配置自动化做快照持久化(如redis在n秒内如果超过m个key被修改就自动做快照) sav ...
- redis——持久化篇
众所周知,redis是内存数据库,它把数据存储在内存中,这样在加快读取速度的同时也对数据安全性产生了新的问题,即当redis所在服务器发生宕机后,redis数据库里的所有数据将会全部丢失. 为了解决这 ...
- redis持久化机制
redis持久化 redis的数据存在内存中,所以存取性能好.但是存在内存中的数据存在一个问题,一旦机器重启,内存数据消失.为了解决这个问题,redis支持持久化.持久化就是为了解决内存数据丢失时恢复 ...
- Redis-cluster集群【第二篇】:redis持久化
Redis持久化原理: Redis支持两种持久化:RDB和AOF模式 一.名词解释: RDB:持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot).AOF ...
- Redis持久化实践及灾难恢复模拟
参考资料: Redis Persistence http://redis.io/topics/persistence Google Groups https://groups.google.com/f ...
- Redis持久化-数据丢失及解决(转载)
本文转载自 Redis持久化-数据丢失及解决 感谢原作者 Redis的数据回写机制 Redis的数据回写机制分同步和异步两种, 同步回写即SAVE命令,主进程直接向磁盘回写数据.在数据 ...
- Redis持久化-数据丢失及解决
Redis的数据回写机制 Redis的数据回写机制分同步和异步两种, 同步回写即SAVE命令,主进程直接向磁盘回写数据.在数据大的情况下会导致系统假死很长时间,所以一般不是推荐的. 异步回写即BGSA ...
- 关于Redis持久化
Redis有两种持久化的方式:快照(RDB文件)和追加式文件(AOF文件) RDB持久化方式是在一个特定的间隔保存某个时间点的一个数据快照. AOF(Append only file)持久化方式则会记 ...
随机推荐
- Java版冒泡排序和选择排序
一.理解说明 1.理解和记忆 冒泡排序:依次定位数组元素,每次只和相邻的且符合条件的元素交换位置. 选择排序:依次在数组的每个位置,通过逐个对比选择出最大或最小的元素. 2.知识点说明 (1)数组是引 ...
- 解决larave-dompdf中文字体显示问题
1.安装laravel-dompdf依赖. Packagist:https://packagist.org/packages/barryvdh/laravel-dompdf composer requ ...
- AVAudioPlayer的锁屏播放控制和锁屏播放信息显示
在设置这个锁屏之前,首先得设置应用支持后台音乐播放,TAGETS->Info->Required background modes->App plays audio or strea ...
- Java Swing 如何实现记事本中“编辑”菜单下的 剪切,复制,粘贴,删除,全选 功能
这篇文字将要学习以下知识点: 1.如何给JButton按钮添加鼠标点击事件监听器 #1.addMouseListener(MouseListener l) 给JButton添加一个鼠标点击监听器l ...
- 4. printf 命令
1. printf 命令的语法 printf format-string [arguments...] 参数说明: format-string: 为格式控制字符串 arguments: 为参数列表. ...
- Spring MVC(一)
MVC这种设计模式,不光运用于Web领域,而且也能用于非Web领域,MVC特指一种表现层设计模式,不限于Java语言 spring mvc属于spring框架的后续产品,用在基于MVC的表现层开发,类 ...
- HSDFS fs命令
fs命令 -help [cmd] //显示命令的帮助信息 -ls(r) <path> //显示当前目录下所有文件 -du(s) <path> //显示目录中所有文件大小 ...
- selenium自动化遇见Cannot find class in classpath问题
今天遇见了Cannot find class in classpath的问题, org.testng.TestNGException: Cannot find class in classpath: ...
- input 和raw_input
---恢复内容开始--- 因为看python2 和 3 混了,所以两者里面的东西有点乱input 和raw_input 今天终于搞明白了,在这里记录一下: 1.python 2 中raw_input ...
- oracle 删除当前用户下所有的表、索引、序列...
select 'drop table "' || table_name ||'";'||chr(13)||chr(10) from user_tables; --delete t ...