ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于guava之LoadingCache的一点

2020-03-30 18:58:45  阅读:316  来源: 互联网

标签:Optional cache value 关于 key guava CacheLoader LoadingCache


原文链接:https://clclcl.fun/2020/03/28/java/LoadingCache-null-value/

Google的guava是个很好的项目,提供了诸如集合、缓存、并发、String工具类等等,实乃Java开发利器。这里简单说一下LoadingCache使用的一点注意事项。ifeve.com有翻译cache相关的介绍,在这里

使用Cache时,我们优先读取缓存,当缓存不存在时,则从实际的数据存储获取,如DB、磁盘、网络等,即get-if-absent-compute。guava提供了CacheLoader机制,允许我们通过设置Loader来自动完成这一过程。如:

Cache<String, User> cache = CacheBuilder.newBuilder().expireAfterAccess(5, TimeUnit.MINUTES);
user = cache.get(name, () -> {
    User value = query(key);//from databse, disk, etc.
    return value;
});

或者使用LoadingCache:

 LoadingCache<String, User> cache = CacheBuilder.newBuilder().expireAfterAccess(5, TimeUnit.MINUTES).build(
     new CacheLoader<String, User>() {
        @Override
        public User load(String name) throws Exception {
        User value = query(key);//from databse, disk, etc.
        return value;
        }
    }
);

这可比自己写一个Map来缓存数据方便多了,而且还可以设置超时时间自动帮我们清理过期的数据。

不过需要注意一点的是,CacheLoader不允许返回的数据为NULL,否则会抛出异常:CacheLoader returned null for key。所以我们需要保证查找的数据必须存在,或者抛出异常外部处理。在某些情况下,我们的数据可能确实不在,比如用户管理模块,我们在新增数据前,要查询原来是否已经存在该用户,那么这时候抛出异常也不合适,此时可以使用Optional来优化CacheLoader:

 LoadingCache<String, Optional<User>> cache = CacheBuilder.newBuilder().expireAfterAccess(5, TimeUnit.MINUTES).build(
     new CacheLoader<String, Optional<User>>() {
        @Override
        public Optional<User> load(String name) throws Exception {
        User value = query(key);//from databse, disk, etc.
        return Optional.ofNullable(value);
        }
    }
);

这样我们保证了CacheLoader返回值不为NULL,而业务数据是否存在,只需要判断Optional.ifPresent()就行了,同时Optional的其他函数在业务逻辑中也是非常有用的。

标签:Optional,cache,value,关于,key,guava,CacheLoader,LoadingCache
来源: https://www.cnblogs.com/ofyou/p/guava-loading-cache.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有