Java 如何缓存复杂对象,如地图<;字符串,列表<;汽车>&燃气轮机;在Spring启动应用程序中

Java 如何缓存复杂对象,如地图<;字符串,列表<;汽车>&燃气轮机;在Spring启动应用程序中,java,spring-boot,caching,redis,Java,Spring Boot,Caching,Redis,我的spring boot应用程序有很多复杂的对象,我喜欢把它们缓存在某个地方 我不想在程序中使用静态变量,因为如果应用程序将在负载平衡器后面运行,每个实例可能从其自己的内存缓存中获得不同的结果,并且一个应用程序中的更改将不会在另一个应用程序中生效 所以我在看,但似乎我们只能在类型为的地图中缓存项目,而不能缓存更复杂的项目 我也选择了这个选项,但看起来这个复杂的对象并没有被缓存。请参阅下面的代码示例 我想知道什么是缓存如此复杂的项目的正确方法 这是@Cacheable尝试中的代码: pu

我的spring boot应用程序有很多复杂的对象,我喜欢把它们缓存在某个地方

我不想在程序中使用静态变量,因为如果应用程序将在负载平衡器后面运行,每个实例可能从其自己的内存缓存中获得不同的结果,并且一个应用程序中的更改将不会在另一个应用程序中生效

所以我在看,但似乎我们只能在类型为
的地图中缓存项目,而不能缓存更复杂的项目

我也选择了这个选项,但看起来这个复杂的对象并没有被缓存。请参阅下面的代码示例

我想知道什么是缓存如此复杂的项目的正确方法

这是
@Cacheable
尝试中的代码:

    public class ComplexObject implements Serializable {... getters & setters ...}
在服务类中:

    @Cacheable(value = "customerCars", key = "#customerName")
    public ComplexObject buildCoblexObject(String customerName, CarsRepository carRepository) {
    ...
    System.out.printlin("here") // printed every time method is called with the same customerName
    }
在属性文件中:(simple或redis都不缓存该项):

在应用程序类中:

@SpringBootApplication
@EnableCaching
 public class MyApplication {....

可能的解决方案之一是使用Redis哈希。它的键是复杂对象的名称。其属性的键将是地图的键。和
List
可以用JSON序列化


如果您经常需要在所有这些映射中进行迭代,那么您可以将所有
map
序列化为JSON并存储为单个键。但是,更新此对象将花费大量时间。

您不能只存储
列表
,为什么要存储密钥?但似乎此复杂对象未被缓存,请显示不起作用的代码以及缓存的配置。@riorio您解决问题了吗?我在缓存复杂地图对象时遇到了同样的问题这里的问题是:我使用Crudepository从redis保存和加载实体。我有一个带有映射的实体(@RedisHash),列表项存储为单字节值,而不是字符串本身。在Redisson中,我认为这个用例有一种特殊的类型,但在SpringDataRedis中,我还没有找到任何关于这一点的东西。请帮助是的,当我在类上使用RedisHash时,列表可以序列化并与spring数据redis一起保存。但是地图不能用redis直接保存,只存储了一个字节而不是正确的对象。@Holger我看不出问题。你能看看这里吗?我正在存储
Map
很好。但您无法在redis中将其保存为RedisHash;)
@SpringBootApplication
@EnableCaching
 public class MyApplication {....