【问题标题】:Best way to store big complex java class objects in Redis?在 Redis 中存储大型复杂 java 类对象的最佳方法?
【发布时间】:2017-06-21 05:55:09
【问题描述】:

在 Redis 中存储嵌套的复杂 java 对象的最佳方法是什么。我们的做法如下。

我们正在使用Redisson Java 客户端库进行 Redis 交互。请看下面的代码:

   try{
        Config conf = new Config();
        conf.useSingleServer().setTimeout(3600000);
        conf.useSingleServer().setRetryInterval(3600000);
        conf.useSingleServer().setAddress("redis://127.0.0.1:6379");
        RedissonClient redisson = Redisson.create(conf);
        RMap<String,Object> map = redisson.getMap("myCache");
        MyClass myObject; // This is the big complex object.
        map.put("key", myObject);
        redisson.shutdown();
    }catch (Exception ex) {
        ex.printStackTrace();
    }

同样,我们使用 get 从 redis 填充我们的 myObject,而不是 put。

由于大数据存储在redis中,我们增加了超时,我们得到了以下异常:

命令的命令执行超时:(EVAL) with params...

请同时回答以下问题:

  1. 这是将巨大的复杂 java 对象放入 Redis 的最佳方式吗? (数据可能在 1GB 左右)
  2. 我们的团队是Redis的新手,我们已经阅读了Redis给出的良好性能,我们应该使用它来存储复杂的数据还是仅在小的单个String作为值的情况下才好? (如果是,对我们的用例有什么建议)

谢谢。

【问题讨论】:

    标签: java redis redisson


    【解决方案1】:

    我认为你的问题实际上是两个问题放在一起:复杂对象和巨大对象。

    所以让我分解并一一讨论:

    1. 对于复杂的 Java 对象问题,您可以将其与其嵌套的自定义类型一起转换为 Redisson Live Objects。它通过将类的所有字段映射到 Redis 哈希来工作。它还以与 Java 相同的方式处理对象引用,前提是它也是 Redisson 对象或 Live Object。当您调用 myObject.getField1() 时,if 只会从 Redis 中获取一个字段,而不是像您的示例中所示的整个对象。

    在 DZone 上有两篇文章可以帮助您更多地了解 Redisson Live Object:Introducing Redisson Live Objects (Object Hash Mapping)(我自己写的)和A Look at the Java Distributed In-Memory Data Model (Powered by Redis)(Nikita Koksharov 写的)

    1. 对于大对象问题,如果大对象是由类中的一个或几个字段组成的,就是一个不可破坏的大对象,如字节数组、图像或大文件。您可以将每个这些字段转换为 Redisson 二进制流。您可以对其进行读取或分块写入,而无需担心超时或阻塞 Redis 服务。

    Redisson 二进制流是通过将数据映射到 Redis 字符串对象来实现的,它会在必要时将数据拆分成块。您可以在项目 wiki 页面找到 Redisson 二进制流的用法。

    【讨论】:

    猜你喜欢
    • 2015-05-10
    • 2019-01-03
    • 2010-11-30
    • 2020-03-25
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    相关资源
    最近更新 更多