数据缓存,可以尝试用RocksDB了

简介: `shigen`,一个专注于Java、Python、Vue和Shell的博主,探讨了为何在学习阿里云DRM产品时选择RocksDB而非Redis或Guava。RocksDB是一个高速、可配置的存储系统,适用于Flash和HDFS,支持数据压缩。与Redis相比,RocksDB在高速存储和灵活性上更具优势。在尝试使用RocksDB与SpringBoot集成时遇到问题,目前尚未解决。他还对比了RocksDB、Redis和Guava Cache的特性,强调RocksDB适合大规模、高性能场景,而Redis适合内存存储和实时性需求。

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 {
   
   

    @Resource
    private 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,我总结了它和redis、guava之间的区别:

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

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

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

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

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

与shigen一起,每天不一样!

目录
相关文章
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
658 1
|
Web App开发 存储 缓存
如何精准清除特定类型或标签的缓存数据?
如何精准清除特定类型或标签的缓存数据?
1046 57
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
276 2
数据的存储--Redis缓存存储(二)
|
存储 缓存 监控
一次缓存引发的文件系统数据不一致问题排查与深度解析
本文详述了一次由自研分布式文件系统客户端 EFC 的缓存架构更新所引发的严重数据不一致问题的完整排查过程。
一次缓存引发的文件系统数据不一致问题排查与深度解析
|
缓存 NoSQL Java
Redis 缓存与数据库数据不一致问题
Redis 缓存与数据库数据不一致问题
554 3
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
440 32
|
缓存 监控 前端开发
处理页面缓存中数据不一致的问题
【10月更文挑战第9天】
747 122
|
机器学习/深度学习 人工智能 缓存
MHA2MLA:0.3%数据微调!复旦团队开源推理加速神器,KV缓存狂降96.87%
MHA2MLA是复旦大学、华东师范大学、上海AI Lab等机构联合推出的数据高效微调方法,通过引入多头潜在注意力机制(MLA),显著优化基于Transformer的LLM推理效率,降低推理成本。
745 1
MHA2MLA:0.3%数据微调!复旦团队开源推理加速神器,KV缓存狂降96.87%
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
447 5