zoukankan      html  css  js  c++  java
  • guava之LoadingCache 利用Optional避免NULL值

    原文链接: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的其他函数在业务逻辑中也是非常有用的。

  • 相关阅读:
    「CF505E」 Mr. Kitayuta vs. Bamboos
    「CF1438D」 Powerful Ksenia
    Kruskal重构树
    20210528模拟赛总结
    20210527模拟赛总结
    20210526模拟赛总结
    20210525模拟赛总结
    CF #722 Div2题解
    洛谷P3652 csh和zzy的战争 题解
    [清华集训2012]模积和 题解
  • 原文地址:https://www.cnblogs.com/ofyou/p/guava-loading-cache.html
Copyright © 2011-2022 走看看