遇到番石榴缓存问题

Facing issue with Guava Cache

我正在使用 Google 番石榴缓存 + Spring 缓存抽象用于缓存目的。 我正在尝试使用 Guava 的 Loading Cache 接口。

我知道 Spring 提供对 Guava Cache 的支持,但我想知道我是否可以利用 spring 的可缓存注释和加载缓存?

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

请帮忙。谢谢。

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

假设您有一个服务 class 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;
    }
}

再创建一个 class 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.删​​除缓存class.
2. 将bean config 更改为return 实际实现对象而不是缓存实现对象。

P.S。您可以为用户检索、文章检索等不同行为定义多个加载缓存。

  1. 番石榴缓存已弃用。如果你有现有代码,那是另一回事,但对于新代码,请使用 Caffeine.

  2. 在要为其缓存 return 值的方法上放置一个 @Cacheable("myCacheName")

  3. 如果使用 Spring 引导,请在您的应用程序 class 上放置一个 @EnableCaching,否则在某些 @Configuration class.

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

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

大功告成。