PUSH_PROMISE
缓存工作正常,但我无法使用@CacheEvict注释。我想在Cacheable方法之后立即调用cacheEvict方法。 在Cachable方法(queryCenterAPI)之后不调用resetOnRequest()方法。
答案 0 :(得分:5)
应该从不同的类调用缓存逐出方法,否则它将不起作用,与带有@Cacheable批注的方法相同。
答案 1 :(得分:1)
替代@CacheEvict 注释的另一种不同方式是使用 CacheManager > https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/cache/CacheManager.html
对于单个值;
public void evictSingleCacheValue(String cacheName, String cacheKey) {
cacheManager.getCache(cacheName).evict(cacheKey);
}
对于所有值;
public void evictAllCacheValues(String cacheName) {
cacheManager.getCache(cacheName).clear();
}
答案 2 :(得分:0)
我认为你需要切换到" aspectj"模式,以使public void DoSomething() {
WriteString(item.Data.Type.ToString());
if (item.Data.Type.ToString().ToLower() == "b")
{
WriteString(item.Data.ItemName);
}
else
{
WriteInteger(item.Data.SpriteId);
if (item.Data.InteractionType == InteractionType.WALLPAPER || item.Data.InteractionType == InteractionType.FLOOR || item.Data.InteractionType == InteractionType.LANDSCAPE)
{
WriteString(item.Name.Split('_')[2]);
}
else if (item.Data.InteractionType == InteractionType.BOT) //Bots
{
WriteString(!PlusEnvironment.GetGame().GetCatalog().TryGetBot(item.ItemId, out var catalogBot) ? "hd-180-7.ea-1406-62.ch-210-1321.hr-831-49.ca-1813-62.sh-295-1321.lg-285-92" : catalogBot.Figure);
}
else if (item.ExtraData != null)
{
WriteString(item.ExtraData ?? string.Empty);
}
WriteInteger(item.Amount);
WriteBoolean(item.IsLimited);
if (item.IsLimited)
{
WriteInteger(item.LimitedEditionStack);
WriteInteger(item.LimitedEditionStack - item.LimitedEditionSells);
}
}
}
正常工作。
从春天more:
处理缓存注释的默认建议模式是" proxy" 它允许仅通过代理拦截呼叫;本地 同一个类中的调用不能以这种方式截获。为一个 更高级的拦截模式,考虑切换到" aspectj" 模式与编译时或加载时编织相结合。
第二个选项是尝试将@CacheEvict
方法移动到另一个类中。
答案 3 :(得分:0)
使用ehcache对我有用,添加下面的Xml文件和Config文件足以进行缓存和缓存逐出。
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"
updateCheck="true"
monitoring="autodetect"
dynamicConfig="true">
<diskStore path="java.io.tmpdir" />
<cache name="apis"
eternal="false"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="1000"
diskSpoolBufferSizeMB="20"
timeToIdleSeconds="200" timeToLiveSeconds="900"
memoryStoreEvictionPolicy="LFU"
transactionalMode="off">
</cache>
public class AppConfig {
@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}
@Bean
public EhCacheManagerFactoryBean ehCacheCacheManager() {
EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
cmfb.setShared(true);
return cmfb;
}
}
我们只需要在xml文件中配置并给出发生缓存驱逐的时间。