当前位置: 首页 > 知识库问答 >
问题:

如果只用于简单缓存,Redis缓存是否比Spring缓存有优势?

胡越
2023-03-14

我对缓存这件事很陌生,并为我的spring boot应用程序学习了一些不同的解决方案。我在看Spring缓存,它是一种比我看到的redis缓存更简单的缓存机制。还有很多像“spring redis cache”这样的资源。当我看一下简单用法时,我看不出有什么不同。即使注释是相同的(Cacheable、CacheEvict、CachePut等),除了额外的redis配置和redis docker容器等,我看不到使用上的差异。。。这些关于spring redis cache的文章都没有讲述just spring cache和spring redis cache之间的区别。

redis缓存比Spring缓存有什么优势?或者你能告诉一个简单的用例,我肯定需要使用redis缓存,而我不能用Spring缓存实现它吗?

共有1个答案

姚韬
2023-03-14

从实现的角度来看,没有所谓的“Spring缓存”。然而,Spring的缓存抽象提供了通用的缓存设施,它起源于核心Spring框架。

缓存抽象本质上是一个适配器,使不同的缓存提供者能够插入框架并通用地用于缓存目的。缓存可以应用于Spring[Boot]应用程序的任何层,例如,在数据访问层或服务层等。缓存甚至可以同时在多个层中应用。毕竟,缓存是一个跨领域的问题,并且并非巧合地使用Spring AOP实现。

抽象提供了一个外观,包括一个API以及最常见的缓存操作的注释(例如:Cache.put(key,value)缓存)。获取(键)缓存。逐出(键)等)。这些缓存操作在大多数缓存提供程序实现中都是相当标准和常见的(例如Redis、Hazelcast、Apache Geode,甚至Java的Map和ConcurrentMap实现;缓存实际上是一种类似于Map的数据结构)。

每个缓存提供程序都必须提供Spring缓存抽象定义的缓存和缓存管理器接口的实现,以便能够插入到框架中进行缓存。通过这种方式,每个缓存提供程序都可以使用Spring的缓存API(或注释,甚至JCache注释)进行通用处理,因此1)您不必绑定到任何特定的缓存提供程序,2)允许您在应用程序用例或需求更改时交换缓存提供程序。

到目前为止有意义吗?

开箱即用,当应用程序类路径上没有其他缓存提供程序(例如Redis)时,Spring(Boot)将ConloctMap缓存实现(参见此处,然后是此处(源),最后是此处,然后是此处)配置为插入框架的缓存提供程序。

然而,ConloctMap缓存实现和Redis提供程序实现之间有很大的区别。稍后插入Redis客户端,可以远程连接到Redis服务器集群。这意味着,本质上,您可以拥有一个“分布式”缓存,其中负载可以均匀分布,假设您正确配置了缓存提供程序,如Redis。

并非所有缓存提供者都是平等的。有些提供了许多附加服务,有些,如Apache Geode,甚至可以作为整个应用程序的记录系统(SoR),甚至可能最终取代您的RDBMS。

即使大多数缓存提供程序能够进行复杂的逐出(LRU、LFU)和过期,Spring的缓存抽象并没有为这些功能指定契约。这由您根据选择的缓存提供程序来决定和配置。

Apache Geode和Hazelcast等完全分布式缓存提供商也提供内存管理功能(毕竟,键/值存储在内存中)。它们甚至可以配置为持久性(因此是SoR UC),支持不同的拓扑:客户端/服务器、广域网(多站点)、嵌入式,并支持不同的缓存模式(缓存旁路、内联缓存、近缓存等)以及不同的缓存UC(例如(HTTP)会话状态缓存)。

免责声明:我是Spring for Apache Geode产品背后的Spring数据工程师,因此我将在《Spring Boot for Apache Geode参考指南》的第一章中专门介绍“缓存”。

希望这篇文章能给你足够的时间思考。

如果您还有其他问题,请在评论中提问。

 类似资料:
  • 问题内容: 我一直在阅读一些Redis文档,并在http://try.redis-db.com/上尝试了该教程。到目前为止,我看不到Redis和诸如Velocity或Enterprise Library Caching Framework之类的缓存技术之间的任何区别。 您实际上只是在使用唯一键将对象添加到内存数据存储中。似乎没有任何关系语义… 我想念什么? 问题答案: 不,Redis不仅仅是缓存。

  • 实际上,您只是使用唯一键将对象添加到内存中的数据存储中。似乎没有任何关系语义... 我错过了什么?

  • 我一直在研究Redis(完全没有经验,只是研究了理论),在做了一些研究之后,发现它也被用作缓存。例如StackOverfolow it self。 有什么好处吗? 我试图直接浏览这个答案redis-cache-vs-using-memory-,但我想我没有得到答案中的关键行: “基本上,如果您需要您的应用程序在共享相同数据的几个节点上进行扩展,那么将需要类似Redis(或任何其他远程键/值存储)的

  • 问题内容: 它可能是实现细节,但是对于Oracle和IBM JDK而言,至少是对已编译模式进行了缓存,还是作为应用程序开发人员我们需要自己对已编译模式进行缓存? 问题答案: 我不认为结果会被缓存,并且代码或文档中也没有这种行为的证据。自己实现这样的缓存(当然)是比较琐碎的,但是我对这样的缓存很有用的用例感兴趣。 回覆。下面的注释和String.split(),有一种不同的方法,即代码采用简单的1或

  • When users hit the URL of your application they will need to download different assets. CSS, JavaScript, HTML, images and fonts. The great thing about Webpack is that you can stop thinking how you sho

  • 我正在使用注释来缓存我的方法的结果。出于性能原因,我想缓存从方法返回的和非null值。 但是这里的问题是Spring缓存非空值,但由于某种原因没有缓存空值。 这是我的密码: 我什么都试过了。就连我 但这也没什么帮助。有关于这个的指示吗?