Java 当Hibernate已经存在并使用缓存时使用memcached

Java 当Hibernate已经存在并使用缓存时使用memcached,java,hibernate,caching,redis,memcached,Java,Hibernate,Caching,Redis,Memcached,我想知道,由于市场上存在hibernate ORM,其中包含了缓存功能,可以减少应用程序中的数据库负载,那么像Redis/Memcached这样的外部缓存系统还有什么可用性,因为它们还提供缓存机制 由于我们的对象已经在应用程序中使用hibernate进行缓存,那么外部缓存系统的可用性如何呢。它们对应用程序性能有何帮助 当hibernate已经将类对象保存在内存中时,我们是否也应该将类对象存储在memcached/redis中?或者memcached是否应该仅用于存储通常不会更改的列表结果,而不是

我想知道,由于市场上存在hibernate ORM,其中包含了缓存功能,可以减少应用程序中的数据库负载,那么像Redis/Memcached这样的外部缓存系统还有什么可用性,因为它们还提供缓存机制

由于我们的对象已经在应用程序中使用hibernate进行缓存,那么外部缓存系统的可用性如何呢。它们对应用程序性能有何帮助


当hibernate已经将类对象保存在内存中时,我们是否也应该将类对象存储在memcached/redis中?或者memcached是否应该仅用于存储通常不会更改的列表结果,而不是可以从hibernate缓存中获取的对象?

hibernate ORM提供了两个级别的缓存

-一级缓存:与每个会话对象关联的进程内缓存,限于会话级别,即每个会话都有自己的一级缓存

-二级缓存:需要配置的可插拔缓存。它是会话工厂级缓存,即在多个会话之间共享

缓存解决方案,如memcached/redis,或例如,为hibernate提供了二级缓存提供程序,可在hibernate应用程序中配置。使用这样的缓存提供程序,您可以在hibernate应用程序中集成分布式缓存功能,比如缓存可以在多个会话之间共享,也可以在使用同一数据库的多个应用程序之间共享

请记住,当使用分布式缓存作为hibernate二级缓存时,您只需配置缓存提供程序并将实体配置为可缓存,hibernate本身将使用该提供程序进行缓存。e、 g.您可以看到如何使用Hibernate配置Tayzgrid。同样,您可以配置任何其他缓存解决方案


尽管Hibernate二级缓存提供程序让您很容易将二级缓存合并到Java应用程序中,但请记住,您将只获得缓存解决方案功能的子集。但是,如果您通过少量编程工作直接调用缓存解决方案的API,您将获得该解决方案提供的所有功能。与Tayzgrid一样,直接API调用将为您提供额外的功能,如批量操作、组和标记、类似sql的搜索和后置写等。

这取决于应用程序的类型

在现代web应用程序中,有很多缓存源:

  • 优化图像
  • 模板系统中呈现的html片段
  • 由多个数据库对象组合而成的对象
  • 选择不经常更改的列表(国家/地区、租户、客户地址)
  • 完整的搜索结果
如果您有一个“大部分视图”类型的应用程序或高流量的网站,最好在hibernate上有一个缓存层。Hibernate设计用于与数据库的事务一致性,这对性能有很大影响(例如,通过复制对象)。对于“大部分视图”,您不需要强一致性,您可以缓存中间结果,例如HTML片段

使用分布式缓存作为hibernate二级缓存,将消耗大量资源,甚至可能会降低速度。你应该非常仔细地评估这一点。如果你有大量的数据和数据库访问是非常昂贵的,可能是值得的