springboot redis自定义KeyGenerator----单机版
这个自定义在单机情况正常,集群情况下不能很好的对同一接口生成一样的hash key,需要考虑所缓存的方法有固定类参数,比如这个方法参数为User.class,或者Student.class。
public class MCacheKeyGenerator implements KeyGenerator {
public static final Logger LOGGER = LoggerFactory.getLogger(MCacheKeyGenerator.class);
// custom cache key
public static final int NO_PARAM_KEY = 0;
public static final int NULL_PARAM_KEY = 53;
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder key = new StringBuilder();
Cacheable cacheable = method.getAnnotation(Cacheable.class);
if (null!=cacheable && StringUtils.isNotBlank(cacheable.value().toString())){
key.append(cacheable.value());
}
LOGGER.info("Cache Key cacheable'value: {}", cacheable.value()[0]);
key.append(cacheable.value()[0] + "::");
if (params.length == 0) {
key.append(NO_PARAM_KEY);
LOGGER.info("params's length is 0 Cache Key: {}", key);
} else {
if (params.length == 1) {
Object param = params[0];
if (param == null) {
key.append(NULL_PARAM_KEY);
LOGGER.info("param is null Cache Key: {}", key);
} else if (!param.getClass().isArray()) {
key.append(param);
LOGGER.info("param is not array Cache Key: {}", key);
}
} else {
//注意这个调用的deepHashCode,可能会有在不同机器产生不同hash的情况
key.append(Arrays.deepHashCode(params));
LOGGER.info("deepHashCode(params) Cache Key: {}", key);
}
}
return key.toString();
}
}
注意一下:
因为deepHashCode方法,可能会出现,同一类不同机器生成的代理类不一致,所以会生成不同的key,导致同一接口,不同机器缓存生成不一样的情况。
具体看这个文章:https://blog.csdn.net/Mint6/article/details/83859194
假如同一接口访问到机器1生成hash key,接口再访问到机器2生成的是另外一个hash key,机器2就用不到机器1的缓存。
还没有评论,来说两句吧...