手写Redis缓存系统,第三章:持久化-增加可靠性

第3章 数据持久化

3.1 RocksDB 简介

  • RocksDB:一种基于 LevelDB 的开源键值对存储库,由 Facebook 开发,优化了闪存上的读写性能,延迟极低。
  • 特点
    • 支持在闪存或内存中存储大规模数据(TB 级别)。
    • 提供快速存储和性能随 CPU 数量线性扩展的能力。
  • 使用方法
    • RocksDB 的源码可以通过 GitHub 下载,并编译成静态链接库供 Go 程序使用。

3.2 RocksDB 性能测试

  • 目的:在融入缓存服务前,先对 RocksDB 的读写性能进行测试。
  • 测试结果
    • 在数据总量较小时(100MB),RocksDB 表现出高效的写入和读取性能。
    • 随着数据量的增加(1GB 和 10GB),写入操作的平均时间略有增加,吞吐量有所下降。
  • 影响因素
    • 数据量的增加会导致磁盘操作频率增加,影响性能。
    • RocksDB 的写放大系数也会影响写入性能,数据量越大,压缩次数越多,写放大系数越高。

3.3 提升 RocksDB 性能的途径

  • 提高磁盘写入速度:使用更快的硬件如 NVMe 标准的 SSD。
  • 降低写放大系数:通过调优 RocksDB 的配置来减少压缩次数和优化写放大系数。

总结:RocksDB 是一种高性能的键值对存储库,适合作为缓存服务的持久化解决方案。在大规模数据存储时,可能需要通过硬件升级和配置调优来进一步提升其性能。

PS: 放大系数在番外篇最下面有。


原作者用的是 rocksDB进行弥补缓存断电丢失问题, 而我看了一下因为这个程序是教学意义的, 所以我还是采用定时去备份的方案, 触发机制就是通过增删改操作的时候去同步保存

以下是如何实现这一功能的步骤和代码示例:

1. 定义事件触发条件

您可以在缓存达到一定大小或者特定的时间间隔后,触发保存事件。这里假设使用定时器作为触发机制。

2. 实现持久化方法

inMemoryCache 中添加一个方法来将缓存数据序列化为 JSON 并保存到硬盘。

3. 实现定时器

使用 Go 的 time 包来定期触发保存操作。

修改后的代码示例-cache.go

package cache

import (
	"encoding/json"
	"os"
	"sync"
	"time"
)

type inMemoryCache struct {
   
	c         map[string][]byte
	mutex     sync.RWMutex
	Stat      Stat
	saveMutex sync.Mutex // 为了避免并发保存时的冲突
	saveFile  string
}

func (c *inMemoryCache) Set(k string, v []byte) error {
   
	c.mutex.Lock()
	defer c.mutex.Unlock()
	tmp, exist :&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wade_Crab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值