redis自动持久化到mysql,redis笔记-数据库之持久化策略
2018-1-17 by Atlas
redis持久化
将redis在内存中的数据库状态保持到磁盘里面,避免数据意外丢失。
RDB持久化
既可以手动执行,也可以根据服务器配置选项定期执行。
生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。
RDB文件载入时,服务器一直处于阻塞状态,直到完成。
命令SAVE、BGSAVE
SAVE命令会阻塞redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求。
BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求。
AOF文件更新频率通常比RDB文件更新频率高。
so -->
如果开启AOF,服务器优先使用AOF文件还原数据库;
只有AOF关闭,服务器才会使用RDB文件还原数据库。
BGSAVE命令执行时的服务器状态:
(1)BGSAVE执行期间,客户端发送的SAVE命令会被服务器拒绝。
(2)BGSAVE执行期间,客户端发送的BGSAVE命令会被服务器拒绝。
(3)BGSAVE和BGREWRITEAOF不能同时执行:
如果BGSAVE正在执行,那么客户端发送的BGREWRITEAOF会被延迟到BGSAVE后执行;
如果BGREWRITEAOF正在执行,那么客户端发送的BGSAVE会被服务器拒绝。
SAVE保存条件
save 900 1 服务器在900秒之内,对数据库进行了至少1次修改
save 300 10 服务器在300秒之内,对数据库进行了至少10次修改
save 60 10000 服务器在60秒之内,对数据库进行了至少10000次修改
struct redisServer {
// ...
// 记录保存条件的数组
struct saveparam *saveparams;
// 修改计数器
long long dirty;
// 上次执行保存的时间
time_t lastsave;
// ...
}
struct saveparam {
// 秒数
time_t seconds;
// 修改数
int changes;
}
ServerCron 函数检查保存条件的过程
RDB文件结构将和JAVA CLASS文件一同讨论。
AOF持久化
AOF持久化是通过保存redis服务器所执行的 写命令 来记录数据库状态的。
AOF文件内容是纯文本格式。
e.g.
redis> SET msg "hello"
ok
AOF文件内容(SELECT命令是服务器自动添加的):
2\r\n$6\r\nSELECT\r\n$1\r\n0\r\n3\r\n$3\r\n$3\r\nSET\r\n$3\r\nmsg\r\n$5\r\nhello\r\n
AOF持久化实现步骤:
命令追加 --> 文件写入 --> 文件同步
命令追加是将执行的写命令追加到服务器状态的aof_buf缓存区的末尾:
struct redisServer {
// ...
// AOF缓冲区
sds aof_buf;
// ...
}
文件的写入与同步
flushAppendOnlyFile()函数考虑是否要将aof_buf中的内容写入和保存到AOF文件里面,行为由服务器配置的appendfsync选项的值来决定。
appendfsync配置:
always:AOF持久化效率最慢,安全性来说最安全,故障只会丢失一个命令数据。
everysec:AOF持久化效率足够快,安全性来说,故障只会丢失一秒钟的命令数据。
no:AOF持久化效率最快,安全性来说,故障会丢失上次同步AOF文件之后的所有写命令数据。
AOF 文件载入过程
AOF文件重写,解决AOF文件体积膨胀问题。
AOF文件重写原理:
AOF文件重写并不需要对现有的AOF文件进行读取、分析或者写入操作,而是通过读服务器当前的数据库状态来实现的。
AOF文件重写首先从数据库中读取键现在的值,然后用一条命令记录键值对,代替之前记录这个键的多条命令。
如果元素数量超过redis.h/REDIS_AOF_REWRITE_ITEMS_PER_CMD常量的值,那么重写多条命令记录键的值。
AOF文件后台重写过程(BGREWRITEAOF原理)
参考文献:《redis设计与实现》
redis自动持久化到mysql,redis笔记-数据库之持久化策略相关推荐
- redis持久化到mysql的方案_redis实现持久化存储的两种方案
一.简单说明 redis是非关系型数据库,是一种内存型数据库.数据存储在内存中,所以当我们关掉软件,或者拔掉电源时,内存中的数据就会丢失.针对此场景,这里提出持久化的方案.它的核心就是将内存中的数据存 ...
- redis springmvc mysql_SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置
项目环境: 在SpringMVC + MyBatis + Mysql.Redis部署在Linux虚拟机. 1.整体思路 参考Ehcache实现MyBatis二级缓存代码(Maven引用对应jar查阅) ...
- MySQL学习笔记数据库学习【二】
查询练习 一.查询练习的准备 准备创建 几个表: 学生表(Student):学号.姓名.性别.出生年月日.班级 课程表(Course):课程号.课程名称.教师编号 成绩表(Score) :学号.课程号 ...
- MySQL学习笔记——数据库的创建、修改与删除
目录 一.数据库的创建和管理 1.基础知识 1.1 数据储存过程 1.2 标识符的命名规则 1.3 MySQL中的数据类型: 2.创建和管理数据库 2.1 创建数据库 2.2 管理数据库 2.3 修改 ...
- 填坑利器?Redis如何弥补传统MySQL架构的不足
对于技术人来说,Redis最成功的一点就是可以补充和扩展生态系统中的其他数据库.虽然使用新的后端数据库来替换旧的后端数据库,往往会被认为风险巨大.价格昂贵,但是原有的数据库可能很难进行线性扩展以满足用 ...
- java redis 下载_redis Java源代码 redis.rar - 下载 - 搜珍网
压缩包 : redis.rar 列表 redis/.classpath redis/.mymetadata redis/.project redis/.settings/.jsdtscope redi ...
- 笔记【Redis数据结构、常用命令、key淘汰及持久化策略】
文章目录 简要介绍 服务安装 数据结构 通用命令 字符串类型命令 散列类型命令 列表类型命令 集合类型命令 有序集合类型命令 HyperLogLog命令 GeoHash命令(地图坐标) 排序命令 事务 ...
- redis持久化到mysql的方案_纯干货|深度解析Redis持久化策略
设为"星标",好文章不错过! 全是干货的技术号:本文已收录在github,欢迎 star/fork:https://github.com/Wasabi1234/Java-Inter ...
- 数据库—MySql—Redis—MongoDB—Http协同流程
目录 MySql Mysql中char和varchar有什么区别? Mysql中float和double的区别是什么? Mysql中date和datetime类型的区别? Mysql中sql语句执⾏的 ...
最新文章
- PyTorch机器学习自动化:自动框架搜索、超参优化
- NLP领域“学霸”太多,一年前标准已过时,新跑分标准SuperGLUE出炉
- notepad++的NppFTP插件远程连接linux操作系统
- 存储变革 IBM V5000四大优势助用户破旧立新
- service 层 拼接的html 代码如何直接返回_代码分层的设计之道
- java hashmap实例_java HashMap详解及实例代码
- CSS光标cursor
- t3修改计算机后就无法登录了,电脑更换系统后,用友T3登录不上了,一直显示这个,怎么处理,这个怎么解决...
- 郫都区计算机老师周俊老师,教师节,带你走进郫都教师背后的故事
- Chrome 20对于HTML5最新支持的动态:颜色输入,网络信息API,CSS着色器
- ASP.NET Ajax 实现无刷新分页
- 现代操作系统 第一章 引论 习题
- 美股个股熔断机制[博]
- linux打印机无法识别usb设备,linux支持usb打印机,不用驱动
- 向日葵深度linux,完美使用向日葵远程软件
- 免费域名注册 freenom
- 魔窗研发副总裁沈哲:移动端SDK的优化之路
- AopAutoConfiguration matched: - @ConditionalOnProperty (spring.aop.auto=true) matched (OnPrope.
- 手机怎么使用涂鸦?分享几个手机视频怎么添加涂鸦的妙招
- 5G NR 网络切片是什么意思