Java 应用程序缓存v.s.hibernate二级缓存,使用哪种缓存?

Java 应用程序缓存v.s.hibernate二级缓存,使用哪种缓存?,java,hibernate,jpa,redis,memcached,Java,Hibernate,Jpa,Redis,Memcached,我可以选择使用应用程序缓存 即手动将对象缓存到分布式memcached/redis群集 或者让hibernate二级缓存执行缓存工作(对于那些应用程序对象) 用哪一个更好 这实际上取决于您的应用程序查询模型和流量需求 使用Redis/Hazelcast可能会产生最好的性能,因为不再有任何到DB的往返,但最终在DB中有一个规范化的数据,在缓存中有一个非规范化的副本,这将给缓存更新策略带来压力。因此,只要持久化数据发生更改,就可以实现缓存更新,从而获得最佳性能 使用二级缓存更容易设置,但它只按id存

我可以选择使用应用程序缓存

即手动将对象缓存到分布式memcached/redis群集

或者让hibernate二级缓存执行缓存工作(对于那些应用程序对象)


用哪一个更好

这实际上取决于您的应用程序查询模型和流量需求

  • 使用Redis/Hazelcast可能会产生最好的性能,因为不再有任何到DB的往返,但最终在DB中有一个规范化的数据,在缓存中有一个非规范化的副本,这将给缓存更新策略带来压力。因此,只要持久化数据发生更改,就可以实现缓存更新,从而获得最佳性能
  • 使用二级缓存更容易设置,但它只按id存储实体。还有一个查询缓存,存储给定查询返回的id。因此,第二级缓存是一个两步过程,您需要对其进行微调以获得最佳性能。当您执行投影查询时,第二级对象缓存不会帮助您,因为它只在实体加载时运行。第二级缓存的主要优点是,无论何时数据发生更改,都可以更轻松地保持同步,尤其是在所有数据都由hibernate持久化的情况下
  • 所以,如果您需要终极性能,并且不介意实现缓存更新逻辑以确保最小的最终一致性窗口,那么可以使用外部缓存


    如果您只需要缓存实体(通常不会频繁更改),并且主要通过Hibernate实体加载来访问这些实体,那么二级缓存可以帮助您。

    这实际上取决于您的应用程序查询模型和流量需求

  • 使用Redis/Hazelcast可能会产生最好的性能,因为不再有任何到DB的往返,但最终在DB中有一个规范化的数据,在缓存中有一个非规范化的副本,这将给缓存更新策略带来压力。因此,只要持久化数据发生更改,就可以实现缓存更新,从而获得最佳性能
  • 使用二级缓存更容易设置,但它只按id存储实体。还有一个查询缓存,存储给定查询返回的id。因此,第二级缓存是一个两步过程,您需要对其进行微调以获得最佳性能。当您执行投影查询时,第二级对象缓存不会帮助您,因为它只在实体加载时运行。第二级缓存的主要优点是,无论何时数据发生更改,都可以更轻松地保持同步,尤其是在所有数据都由hibernate持久化的情况下
  • 所以,如果您需要终极性能,并且不介意实现缓存更新逻辑以确保最小的最终一致性窗口,那么可以使用外部缓存


    如果您只需要缓存实体(通常不会频繁更改),并且主要通过Hibernate实体加载来访问这些实体,那么二级缓存可以帮助您。

    在我看来,这两种方法有明显的优点和缺点,因此,在不基于意见的情况下,可以给出充分的答案。我不认为这个问题应该结束。我同意@AlexandarPetrov的观点,但这个问题可能需要更新一些细节。我认为这两种方法都有明显的优点和缺点,因此,在不基于意见的情况下,可以给出充分的答案。我不认为这个问题应该结束。我同意@AlexandarPetrov,但这个问题可能需要更新一些细节