数据缓存,可以尝试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

相关文章

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I