如何在Dropwizard中实现Guava缓存?

时间:2018-05-16 13:41:12

标签: java spring caching guava dropwizard

我尝试使用guava设置缓存,使用以下代码:

private List<Profile> buildCache() {
        LoadingCache cache = CacheBuilder.newBuilder()
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .maximumSize(40)
                .build(
                        new CacheLoader<Profile, List<Profile>>() {
                            @Override
                            public List<Profile> load(Profile profile) throws Exception {
                                Profile profile1 = new Profile();
                                Profile.setEmployed(true);
                                return profileDAO.getAllProfiles(Profile1, null);
                            }
                        }
                );
        return (List<Profile>) cache;
    }


public List<Profile> getAllProfiles(Profile profile, Integer size) throws Exception {
        return profileDAO.getAllProfiles(profile, size);
    }

这里的想法是,这将使用get all profile创建一个缓存。该方法使用新的配置文件对象来设置是否雇用该雇员的布尔值。 size变量意味着该方法将返回许多指示。如果为null,则默认为前10位。

我有两个问题: 1.这是我第一次使用缓存,所以我真的不知道我是否正确地使用了缓存。 2.我在文档中找不到有关如何在我的应用程序中实现此功能的任何内容。我怎么称呼这个?我尝试修改getAllProfiles方法以返回它:

public List<Profile> getAllProfiles(Profile profile, Integer size) throws Exception {
        return buildCache();
    }

但是这只会返回一个异常,我无法将缓存强制转换为java列表:

Exception occurred: java.lang.ClassCastException: com.google.common.cache.LocalCache$LocalLoadingCache cannot be cast to java.util.List

如果有任何帮助,我的应用程序也使用spring,所以我也一直在研究它。 springframework.cache.guava和google.common.cache之间有什么区别,还是只是Spring内置的番石榴缓存?

1 个答案:

答案 0 :(得分:1)

好吧,我想我设法搞清楚了:

private LoadingCache<Integer, List<Profile>> loadingCache = CacheBuilder.newBuilder()
            .refreshAfterWrite(10,TimeUnit.MINUTES)
            .maximumSize(100).build(
            new CacheLoader<Integer, List<Profile>>() {
                @Override
                public List<Profile> load(Integer integer) throws Exception {
                    Profile profile= new Profile();
                    if (integer == null) {
                        integer = 10;
                    }
                    return profileDAO.getAllProfiles(profile, integer);
                }
            }
    );

首先,我应该指定传递给LoadingCache的键和值,在本例中为Integer和Profile of List。此外,当我在构建函数中声明新的CacheLoader时,我应该保留键和值的布局。 Finlly,在调用getAll方法时,我应该使用关键字Integer而不是配置文件对象加载。

至于调用函数:

public List<Profile> getAllProfiles(Profile profile, Integer size) throws Exception {
        return loadingCache.get(size);
    }

这用于获取存储在缓存中的某些legnths的列表。如果该长度的列表不在缓存中,则getAll方法将使用您传递给它的可变大小运行。

@Eugene,谢谢你的帮助。您对加载方法的解释确实有助于为我提供缓存。