spring - 使用 spring 自定义 ehcache 逐出策略

标签 spring ehcache evict

如果我们想要自定义除 LRU LFU FIFO 之外的逐出策略,文档建议的方法是实现 Policy 接口(interface),然后设置 MemoryStoreEvictionPolicy,如下所示:

manager = new CacheManager(EHCACHE_CONFIG_LOCATION);
cache = manager.getCache(CACHE_NAME);
cache.setMemoryStoreEvictionPolicy(new MyPolicy());

但是如果我使用 spring,请使用 @cacheable 和 xml 文件,例如

<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:ehcache.xml" ></property>
</bean>


<!-- cacheManager -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
    <property name="cacheManager" ref="cacheManagerFactory" />
</bean>

如何以 Spring 方式注入(inject)自己的策略?

谢谢大家

最佳答案

您最好实现自己的类,在 Spring 初始化时设置缓存的逐出策略。

例如:

public class MyEvictionPolicySetter implements InitializingBean {

    public static final String CACHE_NAME = "my_cache";

    private CacheManager manager;
    private Policy evictionPolicy;

    @Override
    public void afterPropertiesSet() {
        Cache cache = manager.getCache(CACHE_NAME);
        cache.setMemoryStoreEvictionPolicy(evictionPolicy);
    }

    public void setCacheManager(CacheManager manager) {
        this.manager = manager;
    }

    public void setEvictionPolicy(Policy evictionPolicy) {
        this.evictionPolicy = evictionPolicy;
    }
}

然后在你的 Spring 配置中:

<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:ehcache.xml" ></property>
</bean>

<!-- Specify your eviction policy as a Spring bean -->
<bean id="evictionPolicy" class="MyPolicy"/>

<!-- This will set the eviction policy when Spring starts up -->
<bean id="evictionPolicySetter" class="EvictionPolicySetter">
    <property name="cacheManager" ref="cacheManagerFactory"/>
    <property name="evictionPolicy" ref="evictionPolicy"/>
</bean>

关于spring - 使用 spring 自定义 ehcache 逐出策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20449303/

相关文章:

java - 使用 Spring boot 执行 Google Cloud App 时出现问题

grails - grails 中的缓存方法

java - Hibernate 在 JTA 事务期间从池中获取多个 JDBC 连接

asp.net-mvc - NHibernate 缓存问题 - 何时调用 Evict?

Java 8 读取文件列表,但文件保持打开状态,直到服务器卡住

java - 使用 SAML 1.1 的 Spring Security

java - ehcache中eternity和maxElementsInMemory的作用?

kubernetes - 如何在 Kubernetes 集群 (minikube) 上强制驱逐

Spring Redis缓存不驱逐

java - 使用 JPA 和 derby 数据库启动 Spring Boot 应用程序时出现表未找到错误