java key 字符串,【Java】Spring @Cacheable 的key可以任意指定字符串吗?

该博客探讨了如何确保缓存Key的合法性,包括长度限制、禁止使用特定字符,以及提供了一个用于创建符合memcached要求的Key的方法。通过示例代码展示了如何验证和转换Key,确保它们符合缓存系统的要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我看到key好像只能诸如key=”#id”这样,取参数值或者参数的field或者类的信息,我想自定义一些字符串,譬如listAll()方法的key定义为诸如“all”,有可能吗?

回答

key="#root.methodName"就是方法名

注解上应该有一个keyGenerator属性,自定义键值生成器,具体见文档

8bf8e34e9a58549977458e176886b11c.png

什么字符可以用做Key取决于Cache具体实现, 以memcache为例, 最长250字符, 不能有空白字符(空格,换行,tab)等

参考下面的代码

import java.util.List;

import java.util.Map;

import org.apache.commons.lang.StringUtils;

import org.apache.commons.lang.builder.ToStringBuilder;

import org.apache.commons.lang.builder.ToStringStyle;

public class CacheUtils {

private static final int MAX_KEY_LENGTH = 250;

public static void validateKey(String key) {

byte[] keyBytes = key.getBytes();

if (keyBytes.length > MAX_KEY_LENGTH) {

throw new IllegalArgumentException("Key is too long (maxlen = "

+ MAX_KEY_LENGTH + ")");

}

if (keyBytes.length == 0) {

throw new IllegalArgumentException(

"Key must contain at least one character.");

}

// Validate the key

for (byte b : keyBytes) {

if (b == ' ' || b == '\n' || b == '\r' || b == 0) {

throw new IllegalArgumentException(

"Key contains invalid characters: ``" + key + "''");

}

}

}

/**

* @see memcache对键的要求

* @param src 输入

* @return 返回符合memcached要求的字符标识

*/

public static String makeValidKey(String src){

return StringUtils.mid(src.replaceAll("\\p{Cntrl}]|\\p{Space}|", ""),0, MAX_KEY_LENGTH);

}

public static String makeValidKey(Object src){

if(src instanceof Map){

return makeValidKey(ConvertUtils.mapToString((Map)src));

}

if(src instanceof List){

return makeValidKey(ConvertUtils.listToString((List>)src));

}

return makeValidKey(ToStringBuilder.reflectionToString(src, ToStringStyle.SIMPLE_STYLE));

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值