问题 使用Redis进行二级缓存 - 它会提高性能吗?


我目前正在开发一个应用程序 Spring MVC4 和 冬眠4。我已经实施了 休眠二级缓存 用于提高性能。如果我使用 Redis的 这是一个内存数据结构存储,用作数据库,缓存等,性能会提高,但会是一个剧烈的变化吗?


1545
2017-10-23 10:34


起源



答案:


如果你缓存好缓存的内容并避免缓存根本不应该缓存的数据,你可能会有很大的差异。就像美女在旁观者的眼中一样,表现也是如此。在使用hibernate AS二级缓存提供程序时,您应该记住以下几个方面:

无自定义序列化 - 内存密集型
如果你使用二级缓存,你将无法使用快速序列化框架作为Kryo,并将不得不坚持Java序列化,这很糟糕。

除此之外,对于每个实体类型,您将拥有一个单独的区域,并且在每个区域内,您将拥有每个实体的每个键的条目。 就内存效率而言,这是低效的。

缺乏存储和分发富对象的能力
大多数现代缓存还提供计算网格功能,将您的对象分割成许多小块,降低了执行分布式任务的能力,同时保证了数据的共存。这在一定程度上取决于Grid提供商,但对许多人来说这将是一个限制。

次优性能
使用hibernate二级缓存可能是一个好的或坏的选择,具体取决于您需要多少性能以及您使用的应用程序类型。很好的说它是即插即用....“有点......”很糟糕,因为你永远不会挤压你会获得的表现。设计丰富的模型意味着更多的前期工作和更多的OOP。

缓存本身有限的查询功能
这取决于缓存提供程序,但是一些提供程序实际上并不是在使用与ID不同的Where子句进行JOIN。例如,如果您尝试在Hazelcast上为查询构建内存索引,您将看到我的意思。


7
2017-09-06 14:42





是的,如果你使用 Redis的,它会提高你的表现。

不,这不会是一个剧烈的变化。 :)

https://memorynotfound.com/spring-redis-application-configuration-example/

http://www.baeldung.com/spring-data-redis-tutorial

以上链接将帮助您找到与项目集成redis的方法。


2
2017-10-23 13:12





这取决于运动。

如果您每秒有1000个或更多请求且RAM不足,则是,使用其他计算机上的redis节点进行一些使用。它将大大提高您的RAM和请求速度。

但如果不是,那就不要使用它。

请记住,稍后您将看到RAM和数据库连接池的使用情况时,可以使用此方法。


1
2017-09-10 09:58





你的问题已在这里讨论过。检查此链接: 应用程序缓存v.s. hibernate二级缓存,哪个使用?

这是最受欢迎的答案,我同意这一点:

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

  1. 使用Redis / Hazelcast可能会产生最佳性能,因为没有   是任何往返DB的往返,但你最终有一个规范化   DB中的数据和缓存中的非规范化副本会产生压力   在缓存更新策略上。所以你获得了最好的表现   每当持久数据执行缓存更新的成本   变化。
  2. 使用二级缓存更容易设置,但它只存储   id的实体。还有一个查询缓存,存储由a返回的id   给定查询。所以二级缓存是一个两步过程   需要微调才能获得最佳性能。当你执行   投影查询第二级对象缓存对你没有帮助,因为它   仅适用于实体负载。二级缓存的主要优点是   每当数据发生变化时,更容易保持同步,尤其是   如果你的所有数据都是由hibernate持久化的。

所以,如果你需要终极   性能,您不介意实现缓存更新逻辑   确保最小的最终一致性窗口,然后使用   外部缓存。

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

希望能帮助到你!


1
2017-09-06 14:36