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

abi*_*kay 5 spring redis spring-data-redis spring-boot spring-cache

我是缓存事物的新手,并为我的 Spring Boot 应用程序学习一些不同的解决方案。我正在研究 Spring Cache,它是比我看到的 redis 缓存更简单的缓存机制(这就是我所寻找的)。而且还有很多像“spring+redis缓存”这样的资源。当我查看简单用法时,我发现没有任何区别。即使注释是相同的(Cacheable、CacheEvict、CachePut 等),除了额外的 redis 配置和 redis docker 容器等之外,我看不到用法上的差异...而且这些spring+redis 缓存文章都没有告诉我们有什么区别介于 spring 缓存和 spring+redis 缓存之间。

redis缓存相对于spring缓存有什么优势?或者你能告诉一个简单的用例,我肯定需要使用 redis 缓存,而我无法使用 spring 缓存实现它吗?

Joh*_*lum 20

从实现的角度来看,不存在“Spring 缓存”这样的东西。然而,Spring 的 Cache Abstraction提供了通用的缓存功能,它起源于核心 Spring 框架。

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

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

每个缓存提供者都必须提供Spring 缓存抽象定义的Cache和接口的实现,以便能够插入到框架中以实现缓存目的。通过这种方式,每个缓存提供程序都可以使用 Spring 的缓存 API(或注释,甚至JCache 注释)进行一般处理,这样您就可以 1) 不依赖于任何特定的缓存提供程序,然后 2) 允许您将缓存提供程序交换为您的应用程序用例或需求发生变化。CacheManager

到目前为止有意义吗?

当没有其他缓存提供程序(例如 Redis)时,Spring(Boot)开箱即用地将缓存实现配置为插入框架的缓存提供程序ConcurrentMap(请参见此处,然后此处源代码),最后,此处紧随其后存在于应用程序类路径中。

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

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

尽管大多数缓存提供程序都能够进行复杂的逐出(LRU、LFU)和过期,但Spring 的缓存抽象 并未指定这些功能的约定。您可以根据您选择的缓存提供程序来决定和配置。

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

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

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

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