springboot 缓存2_ cacheable的key属性

cacheNames给缓存一个名字,相当于定义了一个容器

cacheNames

key1value1
key2value2
...........

key的命名:

名字

描述

示例

methodName

当前被调用的方法名

#root.methodName

target

当前被调用的目标对象

#root.target

targetClass

当前被调用的目标对象类

#root.targetClass

args

当前被调用的方法的参数列表

#root.args[0]

caches

当前方法调用使用的缓存列表(如@Cacheable(value=

{"cache1", "cache2"})),则有两个cache

#root.caches[0].name

argument name

方法参数的名字. 可以直接 #参数名 ,也可以使用 #p0#a0 的形式,0代表参数的索引;

#iban #a0 #p0

result

方法执行后的返回值(仅当方法执行之后的判断有效,

@CachePut 使用于更新数据后可用)

#result

举例:

package com.cc.springboot.service;

import com.cc.springboot.entities.User;
import com.cc.springboot.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    UserMapper userMapper;

    @Cacheable(cacheNames = "user",key = "#id")
    public User getUserById(Integer id){
        User user=userMapper.getUserById(id);
        return  user;
    }
}

@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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值