Loading

Spring Cache

1.介绍

Spring Cache是Spring提供的一个缓存框架,基于AOP原理,实现了基于注解的缓存功能,只需要简单地加一个注解就能实现缓存功能,对业务代码的侵入性很小。

1.常用注解

@EnableCaching:开启缓存注解功能
@Cacheable:查询数据时缓存,将方法的返回值进行缓存。
@CacheEvict:用于删除缓存,将一条或多条数据从缓存中删除。
@CachePut:用于更新缓存,将方法的返回值放到缓存中
@Caching:组合多个缓存注解;
@CacheConfig:统一配置
@Cacheable中的value值

2.基本使用

1.导入jar包

基于SpringBoot使用Spring Cache非常简单,首先加入依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
    <version>2.7.10</version>
</dependency>

2.查询数据时缓存

下边使用Cacheable注解实现查询服务信息时对服务信息进行缓存,它的执行流程是:第一次查询服务信息缓存中没有该服务的信息此时去查询数据库,查询数据库拿到服务信息并进行缓存,第二次再去查询该服务信息发现缓存中有该服务的信息则直接查询缓存不再去数据库查询。


添加@EnableCaching:开启缓存注解功能

/**
 * 查询区域服务信息并进行缓存
 * @param id 对应serve表的主键
 * @return 区域服务信息
 */
Serve queryServeByIdCache(Long id);
@Override
public Serve queryServeByIdCache(Long id) {
    return getById(id);
}

Cacheable注解配置的两项参数说明:

value:缓存的名称,缓存名称作为缓存key的前缀。

key: 缓存key,支持SpEL表达式,上述代码表示取参数id的值作为key

最终缓存key为:缓存名称+“::”+key,例如:上述代码id为123,最终的key为:JZ_CACHE:SERVE_RECORD::123

SpEL(Spring Expression Language)是一种在 Spring 框架中用于处理字符串表达式的强大工具,它可以实现获取对象的属性,调用对象的方法操作。

keyGenerator:指定一个自定义的键生成器(实现 org.springframework.cache.interceptor.KeyGenerator 接口的类),用于生成缓存的键。与 key 属性互斥,二者只能选其一。

3.测试

package com.jzo2o.foundations.service;

import com.jzo2o.common.model.PageResult;
import com.jzo2o.foundations.model.domain.Serve;
import com.jzo2o.foundations.model.dto.request.ServePageQueryReqDTO;
import com.jzo2o.foundations.model.dto.response.*;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.Assert;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;

@SpringBootTest
@Slf4j
class IServeServiceTest {

//区域服务查询
@Test
public void test_queryServeByIdCache(){
    Serve serve = serveService.queryServeByIdCache(1693815623867506689L);
    Assert.notNull(serve,"服务为空");
}

4.结果

缓存key:JZ_CACHE:SERVE_RECORD::1693815623867506689

缓存value:serve表的记录

缓存过期时间:-1,表示永不过期

仔细核实内容是否符合我们的预期结果。

在@Cacheable注解中有一个属性为cacheManager,表示缓存管理器,通过缓存管理器可以设置缓存过期时间。

3.扩展

  @Caching(
            cacheable = {
                    @Cacheable(value = RedisConstants.CacheName.SERVE_ICON,key = "#regionId",
                            cacheManager = RedisConstants.CacheManager.FOREVER,unless = "#result.size() == 0"),
                    @Cacheable(value = RedisConstants.CacheName.SERVE_ICON,key = "#regionId",
                            cacheManager = RedisConstants.CacheManager.THIRTY_MINUTES,unless = "#result.size() != 0"),
            }
    )

condition:指定一个 SpEL 表达式,用于决定是否要进行缓存。只有当条件表达式的结果为 true 时,方法的返回值才会被缓存

unless:与 condition 相反,只有当 SpEL 表达式的结果为 false 时,方法的返回值才会被缓存。

这里使用 unless是因为condition没有result

cacheManager设置过期时间

posted @ 2024-10-30 20:58  LL。。。  阅读(54)  评论(0)    收藏  举报