数据缓存,可以尝试RocksDB了

2024-05-13 09:20
文章标签 数据 尝试 缓存 rocksdb

本文主要是介绍数据缓存,可以尝试RocksDB了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。
个人IP:shigen

shigen在最近的学习中,接触到了一款新的缓存数据库RocksDB,起因是在学习公司内部的一款产品DRM动态配置,其中的底层就用到了这一款RocksDB数据库。但是我当时想到的就是既然是缓存,为什么不去用redis或者guava呢?为此,借助周末,我研究一下了RocketsDB的相关使用。

首先学习的话,肯定是得借助于RocksDB官网了,官网对于它的解释是:

RocksDB是Facebook的一个实验项目,目的是希望能开发一套能能在服务器压力下,真正发挥高速存储硬件(特别是Flash存储)性能的高效数据库系统。这是一个C++库,允许存储任意长度二进制kv数据。支持原子读写操作。

RocksDB依靠大量灵活的配置,使之能针对不同的生产环境进行调优,包括直接使用内存,使用Flash,使用硬盘或者HDFS。支持使用不同的压缩算法,并且有一套完整的工具供生产和调试使用。

RocksDB大量复用了levedb的代码,并且还借鉴了许多HBase的设计理念。原始代码从leveldb 1.5 上fork出来。同时Rocksdb也借用了一些Facebook之前就有的理念和代码。

巴拉巴拉一大堆,概括起来就是:

  1. 高速存储的数据库
  2. 灵活的配置,可以保存在内存、闪存、Flash、HDFS
  3. 数据二进制压缩

对比起来Redis,顿时觉得这个高级在它的高速存储和灵活的配置了。手已经有点痒痒了,准备开始适用一下了。

参照rocksDB的使用文档,我写了如下的代码进行测试:

结合springboot实现单元测试出现了一点问题:

集合springboot出现的问题

目前还没有找到解决方案。代码如下:

配置:

@Configuration
public class RocksDBConfig {@Value("${rocksdb.path}")private String dbPath;@Bean(destroyMethod = "close")public RocksDB rocksDB() throws Exception {Options options = new Options().setCreateIfMissing(true);return RocksDB.open(options, dbPath);}
}

其中,我的配置如下:

rocksdb:
path: ~/rocksdb_data

Service层:

@Service
public class RocksDBService {@Resourceprivate RocksDB rocksDB;public void putData(String key, String value) throws RocksDBException {rocksDB.put(key.getBytes(), value.getBytes());}public String getData(String key) throws RocksDBException {byte[] valueBytes = rocksDB.get(key.getBytes());return valueBytes != null ? new String(valueBytes) : null;}public void updateData(String key, String value) throws RocksDBException {rocksDB.put(key.getBytes(), value.getBytes());}public void deleteData(String key) throws RocksDBException {rocksDB.delete(key.getBytes());}
}

很奇怪的操作,那就先来看下理论的知识吧。借助GPT,我总结了它和redisguava之间的区别:

特征RocksDBRedisGuava Cache
类型持久化键值存储引擎内存键值存储引擎内存缓存引擎
存储引擎LSM树哈希表内存哈希表
内存使用低(可配置)中等
持久性
事务支持
数据结构键值对键值对键值对
支持数据类型字符串、字节流、字节数组等字符串、哈希、列表、集合、有序集合等任何Java对象
缓存策略不适用(持久化存储)LRU、TTL等LRU、最大条目数、定时过期等
分布式支持可以通过RocksDB的其他工具实现是,通过集群和主从复制
优势适合大规模数据、高吞吐量、低延迟速度快、支持丰富的数据结构轻量级、易于集成、适合单机应用
劣势配置和维护复杂内存受限、不支持持久化不支持持久化、不适合大规模数据

其中,涉及到管理、LSM Tree的原理可以参看文章:RocksDB零基础学习

最后,还是借助工具对于RocksDB和redis进行了一波总结:

  • 如果你需要在本地文件系统中持久化存储大量数据,并且对数据的读写性能有较高的要求,那么可以选择RocksDB。
  • 如果你需要在内存中存储数据,并且对数据的实时性要求较高,或者需要支持复杂的数据结构和功能,那么可以选择Redis。

总结就是:读写性能——RocksDB,实时性——redis

与shigen一起,每天不一样!

这篇关于数据缓存,可以尝试RocksDB了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/985305

相关文章

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池