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
。