springboot redis自定义KeyGenerator单机版

2022-08-16 09:58:42

这个自定义在单机情况正常,集群情况下不能很好的对同一接口生成一样的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的缓存。

  • 作者:Mint6
  • 原文链接:https://blog.csdn.net/Mint6/article/details/83861598
    更新时间:2022-08-16 09:58:42