我实现了Spring缓存,如下所示
@Component
public class KPCacheExample {
private static final Logger LOG = LoggerFactory.getLogger(KPCacheExample.class);
@CachePut(value="kpCache")
public String saveCache(String userName, String password){
LOG.info("Called saveCache");
return userName;
}
@Cacheable(value="kpCache")
public String getCache(String userName, String password){
LOG.info("Called getCache");
return "kp";
}
}
和Java Config文件
@Configuration
@ComponentScan(basePackages={"com.kp"})
public class GuavaCacheConfiguration {
@Bean
public CacheManager cacheManager() {
GuavaCacheManager guavaCacheManager = new GuavaCacheManager("kpCache");
guavaCacheManager.setCacheBuilder(CacheBuilder.newBuilder().expireAfterAccess(2000, TimeUnit.MILLISECONDS).removalListener(new KPRemovalListener()));
return guavaCacheManager;
}
}
默认情况下,spring在缓存接口中使用put方法来更新/放置缓存中的值。如何强制spring使用putifabsent方法进行调用,这样我可以在错过缓存时获取null值,或者在其他病毒中首先使用唯一用户名和密码请求方法应该返回null并随后请求该用户名和密码应该返回用户名。
答案 0 :(得分:2)
好吧,看看Spring的Cache Abstraction源代码,似乎没有配置设置(切换)来默认@CachePut使用“原子”putIfAbsent操作。
您可以使用来模拟“putIfAbsent”,除非(或条件)属性@CachePut注释,类似于(基于番石榴impl)...
@CachePut(value="Users", key="#user.name" unless="#root.caches[0].getIfPresent(#user.name) != null")
public User save(User user){
return userRepo.save(user);
}
另请注意,我没有测试这个表达式,并且使用不同的Cache impl它不会是“原子的”或可移植的。表达式(“#root.caches [0] .get(#user.name)!= null”)可能更具可移植性。
放弃“原子”属性可能并不理想,所以你也可以扩展(Guava)CacheManager来返回一个“自定义”缓存(基于GuavaCache),它会覆盖put操作以委托给“putIfAbsent”代替。
class CustomGuavaCache extends GuavaCache {
CustomGuavaCache(String name, com.google.common.cache.Cache<Object, Object> cache, boolean allowNullValues) {
super(name, cache, allowNullValues);
}
@Override
public void put(Object key, Object value) {
putIfAbsent(key, value);
}
}
有关详细信息,请参阅GuavaCache课程。
则...
class CustomGuavaCacheManager extends GuavaCacheManager {
@Override
protected Cache createGuavaCache(String name) {
return new CustomGuavaCache(name, createNativeGuavaCache(name), isAllowNullValues());
}
}
有关详细信息,请参阅GuavaCacheManager,具体来说,请查看line 93和createGuavaCache(String name)。
希望这会有所帮助,或至少为您提供更多想法。