【问题标题】:Spring ehcache - Not able to retrieve value based on custom keySpring ehcache - 无法根据自定义键检索值
【发布时间】:2017-10-31 03:46:51
【问题描述】:

我在缓存组件时使用KeyGenerator 生成自定义密钥。 这是可缓存的方法:

@CachePut(value = "cacheOne", keyGenerator = "keyGenerator") public CachedObject cacheMeta(final Object obj1, final Object obj2, final CachedObject cachedObject) { return cachedObject; }

这里是KeyGenerator 的实现:

public Object generate(Object o, Method m ,Object ... params){ StringBuilder s=new StringBuilder(); return s.append(params[0].hashCode()).append(params[1].hashCode()); }

在从缓存中检索值时,我正在生成密钥:

StringBuilder s= new StringBuilder(); s.append(obj1.hashCode().append(obj2.hashCode())); Element elt=CacheManager.getInstance("cacheOne").get(s)

但它总是返回 null。

【问题讨论】:

    标签: spring ehcache spring-cache


    【解决方案1】:

    问题是您使用StringBuilder 作为缓存键。 StringBuilder 没有定义 equalshashCode。所以它依赖于Object上定义的那些。

    这基本上意味着用于获取缓存条目的get与放置条目的get不匹配。

    使用toString() 放置

    StringBuilder s = new StringBuilder();
    return s.append(params[0].hashCode()).append(params[1].hashCode()).toString();
    

    得到

    StringBuilder s = new StringBuilder();
    s.append("a".hashCode()).append("b".hashCode());
    Cache.ValueWrapper wrapper = cache.get(s.toString());
    

    解决了。

    但我有话要说。

    首先,在这里使用StringBuilder 是没有用的,因为使用字符串连接会让编译器在后台添加StringBuilder,但更易于阅读。所以你可以这样做

    return params[0].hashCode() + "" + params[1].hashCode();
    

    Cache.ValueWrapper wrapper = cache.get("a".hashCode() + "" + "b".hashCode());
    

    它将完美运行并具有相同的性能。

    那么,依靠哈希码来创建密钥是不安全的。哈希码可能有冲突。即使附加两个哈希码。因此,您可能会在给定键上混合条目。

    【讨论】:

      猜你喜欢
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多