博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis持久化
阅读量:7025 次
发布时间:2019-06-28

本文共 2687 字,大约阅读时间需要 8 分钟。

1 persistence原理

  redis databse在指定的时间间隔内生成数据集的时间点快照。比如,磁盘刷入频率为5m,0.00分redis会把数据持久化成一个文件。0.05分,再次把新的数据持久化成一个新的文件,完成后,把0.00分的文件删掉。这样,就保证得到的都是完整的数据。但只要宕机,这5分钟之内的数据就没了。

  append only file:只允许追加不允许修改。就是redis把所有的写操作记录到appendonly.aof的末尾,当redis启动时把里面的操作再执行一遍。它的恢复效率比RDB低,但是安全性更高。

Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。

  官方建议两种方法一起用,恢复时,优先使用数据完整的aof。

  如果不使用持久化,就和memcache一样,纯内存数据库。

 

2 RDB快照

  save和bgsave命令

  save命令会生成rdb文件,但是会阻塞服务器进程,使redis不相应任何请求。bgsave会fock一个子进程去完成rdb操作,父进程会继续相应请求。

  

  磁盘保存策略:

#   save 
## Will save the DB if both the given number of seconds and the given# number of write operations against the DB occurred.## 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 sec if at least 10000 keys changed## Note: you can disable saving completely by commenting out all "save" lines.## It is also possible to remove all the previously configured save# points by adding a save directive with a single empty string argument# like in the following example:## save ""save 900 1save 300 10save 60 10000

   磁盘保存地址和文件名(地址原为"./"  ,在此我改为/redisbak)

# The filename where to dump the DBdbfilename dump.rdb# The working directory.## The DB will be written inside this directory, with the filename specified# above using the 'dbfilename' configuration directive.## The Append Only File will also be created inside this directory.## Note that you must specify a directory here, not a file name.dir /redisbak

   触发实验:

  当我连续有5次写入操作,就满足了save 900 1的条件,redis就会在/redisbak里生成dump.rdb文件,size为146b。

[root@redis1-20 ~]# ll /redisbak/dump.rdb-rw-r--r--. 1 root root 146 Mar 16 09:50 /redisbak/dump.rdb

   当我再次有10次写入操作,就满足了save 300 10的条件,查看dump文件size。

  触发的命令为bgsave,属于后台执行,不会阻塞服务器进程。

[root@redis1-20 ~]# ll /redisbak/dump.rdb-rw-r--r--. 1 root root 216 Mar 16 09:59 /redisbak/dump.rdb

   这时重启redis,redis会自动加载rdb文件,会发现数据已经被恢复。

  另外,当服务被关闭时,也会触发:

85869:M 20 Mar 14:00:54.219 * Saving the final RDB snapshot before exiting.85869:M 20 Mar 14:00:54.286 * DB saved on disk

 

3 rdb文件分析

  清空db并刷入rdb快照

127.0.0.1:6379> FLUSHALLOK127.0.0.1:6379> saveOK

  分析dump文件。od为dump出八进制(octal)格式文件。  -c为format type为char。

  redis为识别字符,redis用这个字符来识别这个文件是否为rdb文件。0006为版本号。下面的8个字符为完整性校验。由于为空文件,没有db数据。

[root@centos7 ~]# od -c /redisbak/dump.rdb 0000000   R   E   D   I   S   0   0   0   6 377 334 263   C 360   Z 3340000020 362   V0000022

 

4 rdb持久化性能消耗

在一个正常量级的redis应用中,总会频繁的触发持久化操作,这时就是有一个子进程在运行,一般持续1m后进程消失。

它们对系统性能的消耗是很厉害的,消耗和主进程相同大小的内存,和100%的单核cpu。

所以,在设计redis服务器时,必须考虑性能富余。不然,必然导致持久化操作拖累主进程正常运行。

 

转载于:https://www.cnblogs.com/jabbok/p/8578482.html

你可能感兴趣的文章
SubareaOpr
查看>>
Beta阶段项目总结
查看>>
个人使用unity3d过程中遇到的一些小问题集合之有时候在场景中创建光源会有一条虚线...
查看>>
POJ2774:Long Long Message——题解
查看>>
2018-2019 20165226 网络对抗 Exp1 PC平台逆向破解
查看>>
javascript作用域与预解析
查看>>
unity 代码有调整,重新导出 iOS 最烦的就是 覆盖导出后项目不能打开
查看>>
C# 中的拓展方法,以StringBuilder加上IndexOf方法举例
查看>>
[转载]部署Office Web Apps Server并配置其与SharePoint 2013的集成
查看>>
第41件事 创新设计的4种方法
查看>>
python学习===计算字符串中子串出现的次数。
查看>>
页面在谷歌浏览器和IE浏览器顶部多出空白行,火狐显示正常
查看>>
CSS子元素设置margin-top作用于父容器?
查看>>
VS Code
查看>>
做了6年开发,工资涨不上去,怎么办?
查看>>
微信5.2
查看>>
C++运算符重载笔记
查看>>
Android中数据库和安装包分离
查看>>
Android调用系统功能
查看>>
关于chorme 通知功能
查看>>