我对缓存的东西和学习一些不同的解决方案,我的春季启动应用程序。我看的是Spring,它是一个简单的缓存机制(这就是我所寻找的),而不是我看到的redis缓存。还有很多资源,比如"spring+redis缓存“。当我看简单的用法时,我看不出有什么不同。即使是注释也是相同的(缓存、CacheEvict、CachePut等),除了额外的redis配置和redis停靠容器等,我看不到使用上的不同。而这些spring+redis缓存文章都没有说明仅仅spring缓存和spring+redis缓存之间有什么区别。
与spring缓存相比,redis缓存的优势是什么?或者,您能告诉一个简单的用例,我确实需要使用redis缓存,而我不能用spring缓存来实现它?
发布于 2022-05-09 17:53:59
从实现的角度来看,没有所谓的"Spring缓存“。但是,https://docs.spring.io/spring-framework/docs/current/reference/html/integration.html#cache提供了通用的缓存功能,它起源于核心的Spring框架。
缓存抽象从根本上说是一个适配器,允许将不同的缓存提供程序插入到框架中,并用于缓存目的。缓存可以应用于Spring应用程序的任何层,例如数据访问层或服务层,等等。缓存甚至可以同时应用于多层。毕竟,缓存是一个横切的关注点,而且不是巧合地用春季AOP实现的。
抽象为最常见的缓存操作提供了一个包括API接口和注解的外观(例如:Cache.put(key, value)
、Cache.get(key)
、Cache.evict(key)
等)。这些缓存操作在大多数缓存提供程序实现(例如Redis、Hazelcast、Apache,甚至是Java的Map
和ConcurrentMap
实现;缓存实际上是类似于地图的数据结构)中是相当标准和常见的。
每个缓存提供程序都必须提供由Spring的缓存抽象定义的Cache
和CacheManager
接口的实现,以便能够插入到框架中进行缓存。通过这种方式,每个缓存提供程序都可以使用Spring的缓存API (或者注释,甚至是JCache注解)进行一般的处理,这样您就不需要与任何特定的缓存提供程序绑定,这就允许您在应用程序用例或需求更改时交换缓存提供程序。
到目前为止还算合理吗?
开箱即用的Spring (Boot)配置ConcurrentMap
缓存实现(请参阅这里,然后是这里 (来源),最后是这里,然后是这),当应用程序类路径上没有其他缓存提供程序(例如Redis)时,缓存提供程序插入到框架中。
但是,ConcurrentMap
缓存实现与Redis实现有很大的不同。后面的插件位于Redis客户机中,可以远程连接到Redis服务器集群。这意味着,从本质上说,您可以拥有一个“分布式”缓存,假设您正确地配置了您的缓存提供程序(如Redis ),负载可以均匀分布。
并非所有缓存提供程序都是相同的。有些还提供了许多额外的服务,还有一些,比如Apache Geode,甚至可以作为整个应用程序的记录系统(SoR),甚至可能最终取代您的关系数据库管理系统。
即使大多数缓存提供程序都能够进行复杂的驱逐(LRU、LFU)和过期,Spring的缓存抽象仍然是这些功能的契约。这将留给您根据您选择的缓存提供程序来决定和配置。
像Apache和Hazelcast这样的完全分布式缓存提供程序还提供内存管理功能(毕竟,键/值都存储在内存中)。它们甚至可以配置为持久性(因此是SoR UC),支持不同的拓扑:客户机/服务器、广域网(多站点)、嵌入式,并支持不同的缓存模式(缓存-旁白、内联缓存、近缓存等)以及不同的缓存UC (例如(HTTP)会话状态缓存)。
免责声明:我是Spring产品背后的Spring数据工程师,所以我将在参考指南中给您留下一个专门用于“缓存”的第二章。
希望这篇文章能给你足够的时间来思考。
如果您有其他问题,请在评论中提出。
https://stackoverflow.com/questions/72092382
复制相似问题