在 Redis 中存储大型复杂 java class 对象的最佳方式?
Best way to store big complex java class objects in Redis?
在 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...
请同时回答以下问题:
- 这是将巨大的复杂 java 对象放入 Redis 的最佳方式吗? (数据可以在1GB左右)
- 我们组刚接触Redis,看过Redis的性能不错,应该用它来存储复杂的数据,还是只在小的单个String作为值的情况下才好? (如果是,对我们的用例有何建议)
谢谢。
我觉得你的问题实际上是两个问题放在一起:Complex object 和 Huge object。
所以让我分解一下,一一说说:
- 对于复杂的 Java 对象问题,您可以将其连同其嵌套的自定义类型一起转换为 Redisson Live Objects。它通过将 class 的所有字段映射到 Redis 哈希来工作。它还以与 Java 相同的方式处理对象引用,前提是它也是 Redisson 对象或活动对象。当您调用
myObject.getField1()
时,if 只会从 Redis 中获取一个字段,而不是像示例中所示的整个对象。
DZone 上有两篇文章可以帮助您更深入地了解 Redisson Live Object:Introducing Redisson Live Objects (Object Hash Mapping)(written by myself) and A Look at the Java Distributed In-Memory Data Model (Powered by Redis)(作者:Nikita Koksharov)
- 对于大对象问题,如果大对象是由class中的一个或几个字段组成的,那么大对象是一个不可破坏的大对象,如字节数组、图像或大文件。您可以将每个字段转换为 Redisson 二进制流。您可以从中读取或写入块,而不必担心超时或阻塞 Redis 服务。
Redisson二进制流是通过将数据映射到Redis字符串对象来实现的,它会在必要时将数据分割成块。 Redisson binary stream的使用可以在项目wiki页面找到。
在 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...
请同时回答以下问题:
- 这是将巨大的复杂 java 对象放入 Redis 的最佳方式吗? (数据可以在1GB左右)
- 我们组刚接触Redis,看过Redis的性能不错,应该用它来存储复杂的数据,还是只在小的单个String作为值的情况下才好? (如果是,对我们的用例有何建议)
谢谢。
我觉得你的问题实际上是两个问题放在一起:Complex object 和 Huge object。
所以让我分解一下,一一说说:
- 对于复杂的 Java 对象问题,您可以将其连同其嵌套的自定义类型一起转换为 Redisson Live Objects。它通过将 class 的所有字段映射到 Redis 哈希来工作。它还以与 Java 相同的方式处理对象引用,前提是它也是 Redisson 对象或活动对象。当您调用
myObject.getField1()
时,if 只会从 Redis 中获取一个字段,而不是像示例中所示的整个对象。
DZone 上有两篇文章可以帮助您更深入地了解 Redisson Live Object:Introducing Redisson Live Objects (Object Hash Mapping)(written by myself) and A Look at the Java Distributed In-Memory Data Model (Powered by Redis)(作者:Nikita Koksharov)
- 对于大对象问题,如果大对象是由class中的一个或几个字段组成的,那么大对象是一个不可破坏的大对象,如字节数组、图像或大文件。您可以将每个字段转换为 Redisson 二进制流。您可以从中读取或写入块,而不必担心超时或阻塞 Redis 服务。
Redisson二进制流是通过将数据映射到Redis字符串对象来实现的,它会在必要时将数据分割成块。 Redisson binary stream的使用可以在项目wiki页面找到。