突然挂了!Redis缓存都在内存中,这下完了!

我是Redis , 一个叫Antirez的男人把我带到了这个世界上 。
突然挂了!Redis缓存都在内存中,这下完了!
文章图片
“快醒醒!快醒醒!” , 隐隐约约 , 我听到有人在叫我 。
慢慢睁开眼睛 , 原来旁边是MySQL大哥 。
“我怎么睡着了?”
“嗨 , 你刚才是不是出现了错误 , 整个进程都崩溃了!害得一大堆查询请求都给我怼过来了!” , MySQL说到 。
刚刚醒来 , 脑子还有点懵 , MySQL大哥扶我起来继续工作 。
“糟了!我之前缓存的数据全都不见了!”
“WTF?你没有做持久化吗?” , MySQL大哥一听脸色都变了 。
我尴尬的摇了摇头 , “我都是保存在内存中的 , 所以才那么快啊”
“那也可以在硬盘上保存一下啊 , 遇到这种情况全部从头再来建立缓存 , 这不浪费时间嘛!”
突然挂了!Redis缓存都在内存中,这下完了!
文章图片
突然挂了!Redis缓存都在内存中,这下完了!】我点了点头 , “让我琢磨一下 , 看看怎么做这个持久化” 。
RDB持久化
没几天 , 我就拿出了一套方案:RDB
既然我的数据都在内存中存放着 , 最简单的就是遍历一遍把它们全都写入文件中 。
为了节约空间 , 我定义了一个二进制的格式 , 把数据一条一条码在一起 , 生成了一个RDB文件 。
突然挂了!Redis缓存都在内存中,这下完了!
文章图片
不过我的数据量有点大 , 要是全部备份一次得花不少时间 , 所以不能太频繁的去做这事 , 要不然我不用干正事了 , 光花时间去备份了 。
还有啊 , 要是一直没有写入操作 , 都是读取操作 , 那我也不用重复备份 , 浪费时间 。
思来想去 , 我决定提供一个配置参数 , 既可以支持周期性备份 , 也可以避免做无用功 。
就像这样:save9001#900秒(15分钟)内有1个写入save30010#300秒(5分钟)内有10个写入save6010000#60秒(1分钟)内有10000个写入
多个条件可以组合使用 , 只要上面一个条件满足 , 我就会去进行备份 。
后来我又想了一下 , 这样还是不行 , 我得fork出一个子进程去做这件事 , 不能浪费我的时间 。
有了备份文件 , 下次我再遇到崩溃退出 , 甚至服务器断电罢工了 , 只要我的备份文件还在 , 我就能在启动的时候读取 , 快速恢复之前的状态啦!
突然挂了!Redis缓存都在内存中,这下完了!
文章图片
MySQL:binlog
我带着这套方案 , 兴冲冲的拿给了MySQL大哥看了 , 期待他给我一些鼓励 。
“老弟 , 你这个方案有点问题啊” , 没想到 , 他竟给我浇了一盆冷水 。
“问题?有什么问题?”
“你看啊 , 你这个周期性去备份 , 周期还是分钟级别的 , 你可知道咱们这服务每秒钟都要响应多少请求 , 像你这样不得丢失多少数据?” , MySQL语重心长的说到 。
突然挂了!Redis缓存都在内存中,这下完了!
文章图片
我一下有些气短了 , “可是 , 这个备份一次要遍历全部数据 , 开销还是挺大的 , 不适合高频执行啊”
“谁叫你一次遍历全部数据了?来来来 , 我给你看个东西” , MySQL大哥把我带到了一个文件目录下:mysql-bin.000001mysql-bin.000002mysql-bin.000003···
“看 , 这些是我的二进制日志binlog , 你猜猜看里面都装了些什么?” , MySQL大哥指着这一堆文件说到 。
我看了一眼 , 全是一堆二进制数据 , 这哪看得懂 , 我摇了摇头 。