首页 文章

Ehcache自动密钥生成和@Cacheable spring注释

提问于
浏览
11

有谁知道Ehcache的默认密钥生成是如何工作的?如果我有以下方法:

@Cacheable(cacheName = CACHE_KEY) // CACHE_KEY is static final field.
public List<DataObject> list(
    int firstRecord, int maxRecords, int pageSize, FilterObject filter) {
    ....
}

其中 FilterObject 是自定义POJO,我应该期望什么是实际的缓存键?

我观察的是当使用不同的 FilterObject 实例而不更改我的方法调用的其他参数时,它总是产生相同的结果 - 第一个调用的结果被缓存并返回 .

可能是导致行为的 FilterObject POJO - 我认为它是一些序列化,或者是 .toString() 问题,因为我没有覆盖相关方法 .

我仍然无法找到有关如何在Ehcache的网站和 @Cacheable 注释文档中形成此方法的缓存密钥的确切信息 . 我很感激有关此主题的任何信息和建议 .

2 回答

  • 5

    这是默认密钥生成器

    public class DefaultKeyGenerator implements KeyGenerator {
    
    public static final int NO_PARAM_KEY = 0;
    public static final int NULL_PARAM_KEY = 53;
    
    public Object generate(Object target, Method method, Object... params) {
        if (params.length == 1) {
            return (params[0] == null ? NULL_PARAM_KEY : params[0]);
        }
        if (params.length == 0) {
            return NO_PARAM_KEY;
        }
        int hashCode = 17;
        for (Object object : params) {
            hashCode = 31 * hashCode + (object == null ? NULL_PARAM_KEY : object.hashCode());
        }
        return Integer.valueOf(hashCode);
    }
    
    }
    

    如您所见,它结合了每个方法参数的哈希码 .

  • 13

    一切都在Spring reference documentation中解释,即:

    28.3.1.1默认密钥生成:

    [...]如果给出了更多的参数,则返回从所有参数的哈希计算出的密钥 . 要提供不同的默认密钥生成器,需要实现org.springframework.cache.KeyGenerator接口 . 配置完成后,生成器将用于每个未指定自己的密钥生成策略的声明(见下文) .

    及以下:

    28.3.1.2自定义密钥生成声明:

    [...] @Cacheable注释允许用户通过其键属性指定密钥的生成方式 . 开发人员可以使用SpEL来选择感兴趣的参数[...]

    以及来自文档的示例:

    @Cacheable(value="books", key="#isbn.rawNumber")
    public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
    

    因此,在您的情况下,您应该只为 FilterObject 实现 equals()hashCode() . 体面的IDE可以为您生成它们 .

相关问题