java - 实现自定义 EhCache

标签 java spring-boot ehcache-3

我们要求每个 userId-sessionID 对最多缓存 2 个类别的请求。我们计划使用 EhCache 来实现这种方法。该项目是一个 Spring Boot 应用程序。

@Cacheable(value="products")
ProductList getProducts(String userID, String sessionID, String categoryID) {
   return getProductListForThisUserAndSessionAndCategory(userId, sessionId, categoryId;) 
}

问题是,当每个用户和 session ID 对可能有多个类别时,如何将每个 userID-sessionId 最多 2 个缓存元素的限制设置为?
一种方法: 设置 sessionId 和 userID 的部分键并创建自定义缓存,每个 sessionID-userID 键最多可接受两个值。 EhCache如何支持自定义Cache?
还有其他方法吗?

最佳答案

如果我的问题正确,您将更改要缓存的最大映射数,您可以像这样配置

import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.expiry.Duration;
import org.ehcache.expiry.Expirations;
import org.ehcache.jsr107.Eh107Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PreDestroy;
import java.util.concurrent.TimeUnit;


@Configuration
@EnableCaching
public class CacheConfiguration {

    private final Logger log = LoggerFactory.getLogger(CacheConfiguration.class);
    private final javax.cache.configuration.Configuration<Object, Object> jcacheConfiguration;


    @PreDestroy
    public void destroy() {
        log.info("Remove Cache Manager metrics");
        log.info("Closing Cache Manager");
    }

    public CacheConfiguration(JHipsterProperties jHipsterProperties) {

        jcacheConfiguration = Eh107Configuration.fromEhcacheCacheConfiguration(
                CacheConfigurationBuilder.newCacheConfigurationBuilder(Object.class, Object.class,
                        ResourcePoolsBuilder.heap(2))
                        .withExpiry(Expirations.timeToLiveExpiration(Duration.of(3600, TimeUnit.SECONDS)))
                        .build()
        );
    }

    @Bean
    public JCacheManagerCustomizer cacheManagerCustomizer() {
        log.debug("Starting Ehcache");

        return cm -> {
            cm.createCache("products", jcacheConfiguration);
        };
    }

}

关于java - 实现自定义 EhCache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47696091/

相关文章:

java - 自 Java 1.7 以来的助记符行为(在 1.8.0.121 中仍然存在)

java - 如何为ehcache初始化对象列表<>?

java - 静态字段每次使用时都会被调用/加载吗?

java - [Java、Picasso、构建错误、Android]

java - 从 Java 中的给定树中检索所有节点

java - 如何使用编程配置在 spring boot 中设置 ehcache3 中的最大深度超出行为?

java - EHCache 3.5 获取所有缓存键/条目

java - 为什么无限循环在加载数据时 hibernate

tomcat - Spring 启动 : Tomcat Embedded with HTTP/2 and TLS

spring-boot - 为什么 Flux 启动后不能使用 concatWith