1 前言
研究源码 是为了解决实际问题 - 雨夜
先看 思考和应用场景的问题 思考下,然后再继续往下看
结尾都会放上代码
如果可以的话 点个赞/评论下 哈哈 好有点动力 有问题 也请留言
2 背景
内存数据 磁盘化怎么实现 我们正常会听说 mysql WAL / binlog 等机制里面提到有内存数据 需要落到磁盘 防止突然断电导致数据丢失
3 思考
1 如果让你实现有内存数据 需要落到磁盘 你会怎么做
2 你这么做 能保证 断电不丢失数据么
3 如果不能请优化,能的话 请说明为什么能
4 本节内容
mq的 内存数据 落地磁盘是怎么实现的,分析有没有问题
先了解人家是怎么实现的
5 数据持久化
5.2 内存内容 持久化到磁盘文件中
5.2.1 第一次执行的时候 现象
5.2.2 之后执行的时候 现象
5.2.3 代码
public void persistTest01(Map<String, Object> map) {
try {
this.lock.readLock().lockInterruptibly();
try {
String content = JSON.toJSONString(map);
if (null != content) {
//数据进行持久化
MixAll.string2File(content, "filename");
}
} catch (IOException e) {
log.error("persist kvconfig Exception, ", e);
} finally {
this.lock.readLock().unlock();
}
} catch (InterruptedException e) {
log.error("persist InterruptedException", e);
}
}
5.2.4 思路
这是从rocketmq 看到的 保存KVconfig的 使用的方法
适用于 一些配置文件/ 参数配置 等的磁盘化
5.2.5 来源
KVConfigManager 类中 putKVConfig 方法
7 思考题回答
1 如果让你实现有内存数据 需要落到磁盘 你会怎么做 2 你这么做 能保证 断电不丢失数据么 3 如果不能请优化,能的话 请说明为什么能
7.1 如果让你实现有内存数据 需要落到磁盘 你会怎么做
这节这种就可以实现
7.2 你这么做 能保证 断电不丢失数据么
能保证
断电之后 恢复 会和之前一样,因为有读锁保证,不会有数据不一致问题
8 总结:
这只是第一种内存数据 持久化,写代码的时候想要用可以直接copy 用
9 下节预知
现在比较佛系了,会往实际问题和分析上谢谢,有好的建议 可以评论告诉我下
10 目标:
- 随着学习 把一些坑解决 形成一个 redission的基础组件
代码地址: gitee.com/gf-8/yuye-p…
项目: yuye-test-redission
类地址: 对应的test 包之下 PersistenceTest 类
11 思考题
还有其他的数据持久化么?有什么区别,应用场景分别为什么?