【发布时间】:2018-04-03 21:06:57
【问题描述】:
我目前正在使用 Spring MVC4 和 hibernate 4 开发应用程序。我已经实现了 hibernate 二级缓存 以提高性能。如果我使用 Redis,它是一种内存数据结构存储,用作数据库、缓存等,性能会有所提高,但会不会有很大的变化?
【问题讨论】:
标签: java spring hibernate caching redis
我目前正在使用 Spring MVC4 和 hibernate 4 开发应用程序。我已经实现了 hibernate 二级缓存 以提高性能。如果我使用 Redis,它是一种内存数据结构存储,用作数据库、缓存等,性能会有所提高,但会不会有很大的变化?
【问题讨论】:
标签: java spring hibernate caching redis
如果您缓存应该缓存的内容并避免缓存根本不应该缓存的数据,您可能会预料到会有很大的不同。就像美丽在旁观者的眼中一样,表演也是如此。在使用 hibernate AS 二级缓存提供程序时,您应该牢记以下几个方面:
无自定义序列化 - 占用大量内存
如果您使用二级缓存,您将无法使用 Kryo 等快速序列化框架,并且必须坚持使用 java 可序列化,这很糟糕。
除此之外,对于每个实体类型,您将拥有一个单独的区域,并且在每个区域内,您将拥有每个实体的每个键的条目。 就内存效率而言,这是低效的。
缺乏存储和分发丰富对象的能力
大多数现代缓存还提供计算网格功能,将您的对象分成许多小块,这会降低您执行分布式任务的能力,并保证数据共存。这在一定程度上取决于 Grid 提供者,但对许多人来说是一个限制。
次优性能
根据您需要多少性能以及您使用休眠二级缓存的应用程序类型可能是一个好或坏的选择。就即插即用而言很好......“有点......”不好,因为你永远不会挤压你将获得的性能。此外,设计丰富的模型意味着更多的前期工作和更多的 OOP。
缓存本身的查询功能有限
这取决于缓存提供者,但有些提供者确实不擅长使用与 ID 不同的 Where 子句进行 JOIN。例如,如果您尝试为 Hazelcast 上的查询构建内存索引,您就会明白我的意思。
【讨论】:
是的,如果您使用 Redis,它将提高您的性能。
不,这不会是一个巨大的变化。 :)
https://memorynotfound.com/spring-redis-application-configuration-example/
http://www.baeldung.com/spring-data-redis-tutorial
以上链接将帮助您了解redis与您的项目的集成方式。
【讨论】:
这取决于运动。
如果您每秒有 1000 个或更多请求并且您的 RAM 不足,那么是的,请在其他机器上使用 redis 节点来占用一些空间。它将大大提高您的 RAM 和请求速度。
但如果不是这样,请不要使用它。
请记住,您可以在稍后看到 RAM 和数据库连接池使用情况时使用此方法。
【讨论】:
您的问题已在此处讨论过。检查此链接:Application cache v.s. hibernate second level cache, which to use?
这是最被接受的答案,我同意:
这实际上取决于您的应用程序查询模型和流量 要求。
- 使用 Redis/Hazelcast 可能会产生最佳性能,因为不会 不再是到 DB 的任何往返行程,但你最终会得到一个标准化的 数据库中的数据和缓存中的非规范化副本将施加压力 在您的缓存更新策略上。因此,您在 每当持久化数据时实施缓存更新的成本 变化。
- 使用二级缓存更容易设置,但它只存储 id 实体。还有一个查询缓存,存储由 a 返回的 id 给定查询。所以二级缓存是一个两步的过程,你 需要微调以获得最佳性能。当你执行 投影查询二级对象缓存对您没有帮助,因为它 仅在实体负载上运行。二级缓存的主要优点是 更容易在数据发生变化时保持同步,尤其是 如果你的所有数据都被休眠了。
所以,如果你需要终极 性能,你不介意实现你的缓存更新逻辑 确保最小的最终一致性窗口,然后使用 外部缓存。
如果您只需要缓存实体(通常不会改变 经常)并且您主要通过 Hibernate 实体访问它们 加载,那么二级缓存可以帮助你。
希望对你有帮助!
【讨论】: