应用程序缓存vs hibernate二级缓存,使用哪个?

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

手动将对象缓存到分发的memcached / redis集群

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

使用哪个更好?

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

  1. 使用Redis / Hazelcast可能会产生最佳性能,因为不再有任何往返DB的往返,但您最终在数据库中存在标准化数据并在缓存中出现非规范化副本,这将对缓存更新策略施加压力。 因此,只要持久数据发生更改,您就会以实现缓存更新为代价获得最佳性能。
  2. 使用二级缓存更容易设置,但它只按id存储实体。 还有一个查询缓存,用于存储给定查询返回的ID。 因此,二级缓存是一个两步过程,您需要进行微调以获得最佳性能。 执行投影查询时,第二级对象缓存对您没有帮助,因为它只对实体加载进行操作。 二级缓存的主要优点是,只要数据发生变化,就更容易保持同步,尤其是当所有数据都由hibernate持久化时。

因此,如果您需要最终性能并且不介意实现缓存更新逻辑以确保最小的最终一致性窗口,那么请使用外部缓存。

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