内存数据持久化 的 实现(一)

319 阅读2分钟

1 前言

研究源码 是为了解决实际问题 - 雨夜

先看 思考和应用场景的问题 思考下,然后再继续往下看

结尾都会放上代码

如果可以的话 点个赞/评论下 哈哈 好有点动力 有问题 也请留言

2 背景

内存数据 磁盘化怎么实现 我们正常会听说 mysql WAL / binlog 等机制里面提到有内存数据 需要落到磁盘 防止突然断电导致数据丢失

3 思考

1 如果让你实现有内存数据 需要落到磁盘 你会怎么做
2 你这么做 能保证 断电不丢失数据么
3 如果不能请优化,能的话 请说明为什么能

4 本节内容

mq的 内存数据 落地磁盘是怎么实现的,分析有没有问题
先了解人家是怎么实现的

5 数据持久化

5.2 内存内容 持久化到磁盘文件中

5.2.1 第一次执行的时候 现象

image.png

5.2.2 之后执行的时候 现象

image.png

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 目标:

  1. 随着学习 把一些坑解决 形成一个 redission的基础组件

代码地址: gitee.com/gf-8/yuye-p…

项目: yuye-test-redission

类地址: 对应的test 包之下 PersistenceTest 类

11 思考题

还有其他的数据持久化么?有什么区别,应用场景分别为什么?