当前位置: 首页 > news >正文

手写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 :&#

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SuccBI+低代码文档中心 — 可视化分析(仪表板)(下)
  • Linux-Shell入门-05
  • 白骑士的Matlab教学实战项目篇 4.3 控制系统设计
  • 保研考研机试攻略:第一章——从零开始
  • 怎样才算精通 Excel?
  • linux之网络子系统-GRO机制分析
  • 09正弦稳态电路的分析
  • C语言学习笔记 Day10(指针--中)
  • 13.StringRedisTemplete使用
  • 巧用Array.forEach:简化循环与增强代码可读性;Array.forEach怎么用;面对大量数据时怎么提高Array.forEach的性能
  • C语言:字符函数,字符串函数
  • 《计算机网络 - 自顶向下方法》阅读笔记
  • 28. Hibernate 中的常见坑
  • webassembly初探
  • llama3.1本地部署方式
  • “大数据应用场景”之隔壁老王(连载四)
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Codepen 每日精选(2018-3-25)
  • ECMAScript6(0):ES6简明参考手册
  • JAVA之继承和多态
  • Laravel 实践之路: 数据库迁移与数据填充
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • windows下使用nginx调试简介
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 每天一个设计模式之命令模式
  • 实战|智能家居行业移动应用性能分析
  • 思否第一天
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 白色的风信子
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # 数据结构
  • #define、const、typedef的差别
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (19)夹钳(用于送货)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C语言)二分查找 超详细
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (第27天)Oracle 数据泵转换分区表
  • (力扣)循环队列的实现与详解(C语言)
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (一)Docker基本介绍
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • .NET CLR基本术语
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Project Open Day(2011.11.13)
  • .NET6 命令行启动及发布单个Exe文件
  • .net反混淆脱壳工具de4dot的使用
  • .NET技术成长路线架构图