关于springBoot中的@Cacheable做缓存的参数解析

参数 – value : 缓存的名称,在 spring 配置文件中定义,必须指定至少一个
参数 – key : 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合
参数 – condition : 缓存的条件,可以为空,使用 SpEL 表达式编写,返回 true 或者 false,只有为 true 才进行缓存

想必你一定想知道SpEL 表达式是什么,下面我们简单的介绍一下:
SpEL 表达式:Spring 3引入了Spring表达式语言( Spring Expression Language,SpEL),它能够以一种强大和简洁的方式将值装配到bean属性和构造器参数中,在这个过程中所使用的表达式会在运行时计算得到值
更深入的了解请点击这里,SpEL 表达式深入理解

@Cacheable的语法 :

@Cacheable(value=”缓存的名称”,key=”#xxx”)

redis命令行客户端使用hset的语法是:

hset key field value

使用@Cacheable注解,调用的是redis的set函数,生成的value和key用::来进行连接,结果如下图:
测试类的结果

测试类试试:
创建一个service:

package com.tanhua.server.test;

import com.tanhua.model.db.UserInfo;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserInfoCacheService {

    //根据id查询
    @Cacheable(value = "user",key = "#userId")
    public UserInfo queryById(Long userId) {
        //从数据库查询
        System.out.println("从数据库查询");
        UserInfo user = new UserInfo();
        user.setId(userId);
        user.setNickname("ceshi");
        return user;
    }
}

创建测试类:

package com.tanhua.server.test;

import com.tanhua.server.AppServerApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest(classes = AppServerApplication.class)
@RunWith(SpringRunner.class)
public class CacheTest {

    @Autowired
    private UserInfoCacheService userInfoCacheService;

    @Test
    public void test1() {
        for (int i = 1; i <= 5; i++)
            System.out.println(userInfoCacheService.queryById(1l));
    }
}

第一次执行的结果:
在这里插入图片描述
第二次执行的结果:
在这里插入图片描述
从这里我们可以看出,数据已经进行缓存了,而redis中生成了一个文件,文件结构如图:
在这里插入图片描述
user是value 1则是key
在这里插入图片描述
如有错误请指正

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
@Cacheable注解是Spring框架提供的缓存注解,用于标记方法的返回结果可被缓存。它可以应用在方法级别或类级别。当方法被调用时,Spring会首先从缓存查找方法的返回结果,如果缓存存在,则直接返回缓存值,不再执行方法体内的逻辑。如果缓存不存在,则执行方法体内的逻辑,并将返回结果存入缓存。 @Cacheable注解默认是使用方法的参数作为缓存key,所以相同参数调用的方法返回结果会被缓存起来。但是默认情况下,如果在缓存找不到对应的结果,Spring会执行方法体内的逻辑,并将返回结果存入缓存。这样会导致并发调用时出现缓存穿透问题,即多个线程同时请求同一个参数值,导致每个线程都执行了方法体内的逻辑,没有从缓存获取到结果。 为了解决缓存穿透问题,可以使用热加载机制。热加载是指在缓存失效期间,只有一个线程去执行方法体内的逻辑,其他线程等待该线程执行完毕后直接从缓存获取结果。 实现热加载可以通过在@Cacheable注解设置sync属性为true。这样在缓存失效期间,只有一个线程去执行方法体内的逻辑,其他线程等待该线程执行完毕后直接从缓存获取结果。示例代码如下: ```java @Cacheable(value = "myCache", key = "#param", sync = true) public String getData(String param) { // 执行业务逻辑 } ``` 需要注意的是,设置sync属性为true会导致性能损失,因为其他线程在等待期间无法直接从缓存获取结果。因此,只有在必要的情况下才应该使用热加载机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Donne_CN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值