WildFly 11 / Java EE 7 / JSR 107:缓存 - 什么是缓存信息并让它自动过期的最佳方法?

时间:2017-10-14 22:47:24

标签: java caching wildfly cdi java-ee-7

建议的存储数据的方法是什么,让它从Java EE / WebApp容器中自动过期?我可以使用会话持久性机制,但我的http会话通常比我希望保留这些信息的时间长很多。

是否有Java EE 7或CDI提供的内容? JCache规范JSR 107的一些初步变体?还有其他好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

我不确定这是“最好的”方式,但我一直在使用Wildfly中的Google Guava cache(8到10但仍然适用)。对我来说,由于auth服务器非常慢,我正在缓存Oauth令牌。我的代码看起来像:

private static LoadingCache<String, MyPrincipal> tokenCacheMap;

@PostConstruct
private void postConstruct() {
    tokenCacheMap = CacheBuilder.newBuilder()
            .expireAfterAccess(15, TimeUnit.MINUTES)
            .build(
                    new CacheLoader<String, MyUserPrincipal>() {
                        @Override
                        public MyUserPrincipal load(String token) {
                            MyUserPrincipal myUserPrincipal = getUserFromToken(token);

                            if( myUserPrincipal != null ) {
                                myUserPrincipal.setToken(token);
                                return myUserPrincipal;
                            }

                            throw new SecurityException("token is not valid");
                        }
                    }
            );
}

//
// later in the code...
//
MyUserPrincipal myUserPrincipal = tokenCacheMap.get(token);

基本上这样做是设置一个缓存,令牌生存15分钟。如果需要,调用load()方法,在这种情况下,获取身份验证令牌和用户。根据需要缓存填充缓存 - 第一次调用将获得获取令牌的开销,但之后它将全部存储在内存中。

还有其他选项,例如,根据缓存中的项目数量逐出旧信息。文档非常好,应该让你去。

缺点是这不是JEE标准,但它在过去对我有用。

答案 1 :(得分:1)

如果要使用JCache API,可以使用infinispan-jcacheInfinispan是一个可扩展,高度可用的键/值数据存储included in WildFly

To use it,将infinispan-jcache添加到pom.xml

<dependency>
    <groupId>org.infinispan</groupId>
    <artifactId>infinispan-jcache</artifactId>
    <version>...</version> <!-- e.g. 9.1.4.Final -->
</dependency>

并访问缓存as follows

import javax.cache.Cache;
import javax.cache.CacheManager;
import javax.cache.Caching;
import javax.cache.configuration.MutableConfiguration;
import javax.cache.spi.CachingProvider;

...

// Construct a simple local cache manager with default configuration
CacheManager cacheManager = Caching.getCachingProvider().getCacheManager();
MutableConfiguration<String, String> configuration = new MutableConfiguration<>();
configuration.setTypes(String.class, String.class);

// create a cache using the supplied configuration
Cache<String, String> cache = cacheManager.createCache("myCache", configuration);

// Store a value, the entry will expire in 2 seconds
cache.put("key", "value", 2, TimeUnit.SECONDS);
// Retrieve the value and print it out
System.out.printf("key = %s\n", cache.get("key"));

// Stop the cache manager and release all resources
cacheManager.close();

请注意,Infinispan有great docs