spring - 如果只做简单缓存,Redis 缓存比 Spring 缓存有优势吗?

标签 spring spring-boot redis spring-data-redis spring-cache

我是缓存事物的新手,并为我的 spring boot 应用程序学习了一些不同的解决方案。我在看 Spring Cache,它比我看到的 redis 缓存更简单的缓存机制(这就是我所寻找的)。而且像“spring+redis缓存”这样的资源非常多。当我查看简单用法时,我看不出有什么区别。甚至注释都是相同的(Cacheable、CacheEvict、CachePut 等),除了额外的 redis 配置和 redis docker 容器等之外,我看不出用法上的差异...而且这些都不是 spring+redis 缓存 文章讲述了 spring 缓存和 spring+redis 缓存之间的区别。

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

最佳答案

从实现的角度来看,没有“Spring 缓存”这样的东西。但是,有 Spring's Cache Abstraction提供通用缓存设施,它起源于核心 Spring 框架。

缓存抽象 基本上是一个 Adapter使不同的缓存提供程序能够插入到框架中,并通常用于缓存目的。缓存可以应用于 Spring [Boot] 应用程序的任何层,例如数据访问层或服务层等。缓存甚至可以同时应用于多个层。毕竟,缓存是一个横切关注点,并且并非巧合地通过Spring AOP 实现。 .

抽象提供了一个外观,包括 API连同 Annotations对于最常见的缓存操作(例如: Cache.put(key, value)Cache.get(key)Cache.evict(key) 等)。这些缓存操作在大多数缓存提供程序实现(例如 Redis、Hazelcast、Apache Geode,甚至 Java 的 MapConcurrentMap 实现;缓存实际上是一个 Map - 类似数据结构)。

每个缓存提供者 都必须提供 Cache 的实现和 CacheManagerSpring 的缓存抽象 定义的接口(interface),以便能够插入框架以进行缓存。通过这种方式,可以使用 Spring 的缓存 API(或注解,甚至是 JCache annotations)对每个缓存提供者进行一般处理,这样您 1)不绑定(bind)到任何特定的缓存提供者,然后 2)允许您交换缓存提供者随着您的应用程序用例或需求的变化。

到目前为止有意义吗?

开箱即用,Spring (Boot) 配置 ConcurrentMap 缓存实现(参见 here,然后是 here(source),最后是 here,然后是this ) 作为在应用程序类路径上没有其他缓存提供程序(例如 Redis)时插入框架的缓存提供程序。

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

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

即使大多数缓存提供程序都能够进行复杂的逐出(LRU、LFU)和过期,Spring 的缓存抽象 does not specify这些能力的契约(Contract)。这留给您根据您选择的缓存提供程序来决定和配置。

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

免责声明:我是 Spring for Apache Geode 产品背后的 Spring Data 工程师,因此我将给您留下 chapter。我在 Apache Geode 的 Spring Boot 引用指南中致力于“缓存”。

希望这篇文章能给您足够的时间来咀嚼一段时间。

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

关于spring - 如果只做简单缓存,Redis 缓存比 Spring 缓存有优势吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72092382/

相关文章:

spring - 基于 Restful 的视频流

c# - 堆栈溢出、Redis 和缓存失效

java - MySQl 和 autoReconnect=true 仍然给我异常

Spring @Cacheable 不缓存

java - 从配置服务器获取客户端端口

java - 如何将对象从注册表传输到 Controller 以写入数据库并分配角色?

远程服务器上的 Redis 批量插入

redis - 如何使用 servicestack 类型的客户端将对象存储到 Redis Hash 中?

java - Spring重定向请求映射

java - 使用 Spring Security 检查额外参数