总结了Redis的基础知识以及如何使用Redis在Spring Boot中集成缓存。
首先是依赖:
<dependency> |
使用MySQL作为我的主要数据库,所以我使用 MySQL 连接器,还有 Spring Data Redis (access+driver) 依赖项在我们的项目中用作 Java Redis 客户端,这允许我们的应用程序启用 Redis 缓存机制。
现缓存时常用的注解如下:@CachePut、@CacheEvict、@Cacheable、@Caching,我们将看到我们在哪里以及如何使用这些注解。
@Entity |
启用
@SpringBootApplication |
只要通过@EnableCaching注释启用缓存支持,Spring Boot 就会自动配置缓存基础结构。
查询
在控制器中,我们必须在每个 API 之上添加不同的注释来缓存特定记录。
@GetMapping("/{id}") |
在 GET 方法之上,我们使用@Cacheablewhich 表示每次调用该方法时,都会应用缓存行为,检查是否已经为给定的参数调用了该方法。
value="{category}"指定数据需要存储在哪个类别下。对于不同的控制器,我们可以使用不同的值。
一个合理的默认值只是使用方法参数来计算键,但我们也可以指定键以及使用key="#{value}"哪个将用于识别特定记录。
如果在缓存中找不到计算键或指定键的值,则将调用目标方法并将返回值存储在关联的缓存中。返回类型会自动处理,如果存在,它们的内容存储在缓存中。
保存
@PutMapping |
在PUT 方法之上,我们使用@CachePut. 我们也可以使用@CachePut本身来保存新用户,即POST 方法。
如果condition() 和unless() 表达式相应地匹配,则它始终会导致调用该方法并将其结果存储在关联的缓存中。Condition() 是 Spring 表达式语言 (SpEL) 表达式,用于有条件地进行缓存放置操作。由于 put 操作的性质,该表达式在调用方法后计算,因此可以引用方法的调用结果。
删除
@DeleteMapping("/{id}") |
在 DELETE 方法之上,我们使用@CacheEvict它允许我们删除 Redis 中特定键的数据。allEntries指定是否应删除缓存中的所有条目。默认情况下,仅删除关联键下的值。请注意,不允许将此参数设置为 true 并指定键。
应用程序属性
我们可以通过不同的属性在我们的应用程序中配置 Redis 缓存,我使用了以下属性,如下所示:
spring.redis.host=localhost |
默认情况下,会根据需要创建缓存,但您可以通过设置该cache-names属性来限制可用缓存的列表。
我们可以用来在Spring中配置 Redis 缓存的属性如下所示:
- spring.cache.redis.cache-null-values : 允许缓存空值。默认 true
- spring.cache.redis.enable-statistics : 是否开启缓存统计。默认 false
- spring.cache.redis.key-prefix : 键前缀。
- spring.cache.redis.time-to-live: 入境过期。默认情况下,条目永不过期。
- spring.cache.redis.use-key-prefix : 写入Redis时是否使用key前缀。 默认true
- spring.cache.type: 缓存类型。默认情况下,根据环境自动检测。
要记住的要点
- 定义 TTLs :生存时间 (TTL),是您的缓存将删除条目的时间跨度。如果您只想每分钟获取一次数据,只需使用 @Cacheable Annotation 保护它并将 TTL 设置为 1 分钟。
- 实现 Serializable:如果你在 Redis 缓存中添加一个对象,那么该对象应该实现一个 Serializable 接口。
- Redis 缓存限制:当缓存大小达到内存限制时,旧数据将被删除,为新数据腾出空间。尽管 Redis 速度非常快,但在 64 位系统上存储任何数量的数据仍然没有限制。它只能在 32 位系统上存储 3GB 的数据。
- 永远不要从同一个类中调用可缓存方法:原因是 Spring 代理了对这些方法的访问,以使缓存抽象工作。当你在同一个类中调用它时,这个代理机制不会启动。通过这个,你基本上绕过了你的缓存并使其无效。