应用缓存与休眠二级缓存,该使用哪个?

lov*_*ing 1 java memcached hibernate jpa redis

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

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

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

使用哪个更好?

Vla*_*cea 5

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

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

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

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