-1

我正在使用 Google Guava Cache + Spring 缓存抽象来进行缓存。我正在尝试使用 Guava 的 Loading Cache 接口。

我知道 Spring 提供了对 Guava Cache 的支持,但我想知道是否可以使用 Spring 的可缓存注释以及 Loading Cache?

基本上我想将业务层与缓存分开。

请帮忙。谢谢。

4

2 回答 2

1
  1. 不推荐使用 Guava 缓存。如果您有现有代码,那将是另一回事,但对于新代码,请使用Caffeine

  2. 将 a@Cacheable("myCacheName")放在要为其缓存返回值的方法上。

  3. @EnableCaching如果使用 Spring Boot,则在您的应用程序类上放置一个,否则在某个@Configuration类上。

  4. application.properties如果使用 Spring Boot,请设置规范,如下所示spring.cache.caffeine.spec=maximumSize=10000,expireAfterWrite=5m:如果不使用 Boot,@PropertySources请在与上述 #3 相同的类上使用注释。

  5. org.springframework.boot:spring-boot-starter-cache将和添加com.github.ben-manes.caffeine:caffeine到您的构建文件中。如果不使用 Boot,则需要以不同方式设置依赖项。

你完成了。

于 2017-07-07T21:43:26.273 回答
0

所以你想要黄油和果酱。好的。我将帮助您使用加载缓存以及保持缓存逻辑分开。

考虑您有一个SampleServiceImpl实现SampleService接口的服务类。

服务接口:

public interface SampleService {
    User getUser(int id);
}

服务实施:

@Service
public class SampleServiceImpl implements SampleService {

    public User getUser(int id) {
        // fetch user from database
        return user;
    }
}

再创建一个类SampleServiceCache

public class SampleServiceCache extends ServiceCacheImpl {

    @Autowired
    public SampleServiceCache(int expiryTime, int maximumSize) {

        loadingCache =
                CacheBuilder.newBuilder().maximumSize(maximumSize).expireAfterAccess(expiryTime, TimeUnit.HOURS).build(
                        new CacheLoader<Integer, User>() {

                            @Override
                            public User load(@Nonnull Integer userId) {
                                return SampleServiceCache.super.getUser(userId);
                            }
                        });
    }
    @Override
    public User getUser(int userId) {
        return loadingCache.getUnchecked(userId);
    }
}

在你的 bean 配置中:

@Bean
public SampleService sampleService() {
    return new SampleServiceCache(expiry, maxSize);
}

想要删除缓存的那一天,你必须做两件事:
1. 删除缓存类。
2. 更改 bean config 以返回实际的实现对象,而不是缓存实现对象。

PS 你可以为不同的行为定义多个加载缓存,比如用户检索、文章检索等。

于 2017-07-07T21:24:12.070 回答