手写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 cacheimport ("encoding/json""os""sync""time"
)type inMemoryCache struct {c map[string][]bytemutex sync.RWMutexStat StatsaveMutex sync.Mutex // 为了避免并发保存时的冲突saveFile string
}func (c *inMemoryCache) Set(k string, v []byte) error {c.mutex.Lock()defer c.mutex.Unlock()tmp, exist :&#