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的缓存。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值