实现 Guava 缓存作为 EHCache 的后备
Posted
技术标签:
【中文标题】实现 Guava 缓存作为 EHCache 的后备【英文标题】:Implement Guava cache as a fallback for EHCache 【发布时间】:2021-07-30 23:19:32 【问题描述】:我想在我的 springboot 应用程序中实现 Guava 缓存作为 EHcache 2.10 的后备。如果 EH 缓存以某种方式失败或崩溃,系统必须回退到 Guava 缓存并获取结果。请指导我如何操作。
【问题讨论】:
【参考方案1】:在这种情况下,可以使用**内置**注解,以便您可以自行检查和构建所有逻辑。
你总是可以定义 DAO(Data Access Object) 层,这将与 EHCahe 和 Guava 缓存进行通信。
interface UserDao
Optional<User> findById(int id);
...
实现 UserDao
class UserDaoImpl implements UserDao
@Autowired @Qualifier("ehCacheManager") private CacheManager ehCacheManager;
@Autowired @Qualifier("cacheManager") private CacheManager cacheManager;
@Autowired UserRepository userRepository;
private Cache ehCache;
private Cache guavaCache;
@PostConstruct
public void init()
ehCache = ehCacheManager.get("userCache");
guavaCache = cacheManager.get("userCache");
@Override
public Optional<User> findById(int id)
User user = null;
boolean ehCacheError;
try
user = ehCache.get(id, User.class);
catch (Exception e)
user = guavaCache.get(id, User.class);
ehCacheError = true;
if( user == null )
// query db to fetch User as all cache has miss
Optional<User> optUser = userRepository.findById( id );
if(optUser. isPresent())
user = optUser.get();
// cache miss
if(!ehCacheError)
ehCache.put( id, user) ;
guavaCache.put(id, user);
return Optional.ofNullable(user);
一个奇怪的问题,你为什么要反向,你应该总是执行 Guava 缓存查找,如果有缓存未命中,你应该咨询 EHCache,这里你应该添加一个失败案例来查询 db。
【讨论】:
以上是关于实现 Guava 缓存作为 EHCache 的后备的主要内容,如果未能解决你的问题,请参考以下文章