首页 > 文章列表 > Spring Cache中如何使用非常量值作为缓存键?

Spring Cache中如何使用非常量值作为缓存键?

490 2025-04-08

Spring Cache中如何使用非常量值作为缓存键?

Spring Cache:巧用非常量值作为缓存键

在使用Spring Cache和Redis缓存时,经常需要根据动态参数生成不同的缓存键。直接使用变量拼接键值会引发编译器错误:“attribute value must be constant”。本文提供两种解决方法:

方法一:利用Bean管理动态值

创建一个Bean来存储和管理动态变量,例如:

@Service
public class CurrentIdHolder {
    private static ThreadLocal threadLocal = new ThreadLocal<>();

    public void setCurrentId(String currentId) {
        threadLocal.set(currentId);
    }

    public String getCurrentId() {
        return threadLocal.get();
    }
}

在Cache注解中使用@符号引用Bean方法获取动态值:

@Cacheable(value = "shoppingcar", key = "#currentIdHolder.getCurrentId()")
public Object getShoppingCart(String currentId, CurrentIdHolder currentIdHolder) {
    currentIdHolder.setCurrentId(currentId); // 设置当前用户ID
    // ... 获取购物车数据 ...
}

方法二:SpEL表达式拼接键值

利用Spring Expression Language (SpEL)表达式,将动态参数与静态字符串拼接成缓存键:

@Cacheable(value = "mainFieldInfo", key = "#currentId + '_car'")
public void test(String currentId) {
    // ... 业务逻辑 ...
}

这两种方法都能有效解决Spring Cache中使用动态值作为缓存键的问题,实现灵活的缓存策略。 选择哪种方法取决于具体应用场景和代码风格偏好。 方法一更适合需要在多个方法中共享同一个动态值的场景,而方法二则更简洁直接。 注意:方法一需要在方法参数中注入CurrentIdHolder Bean,并正确设置currentId

来源:1739997468