guava做本地缓存

package tool;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import java.util.Optional;
import java.util.Random;
import java.util.concurrent.TimeUnit;

public class GuavaTest {

    private static Integer generateNewMsgCode(String phone) {
        Integer msgCode = (new Random()).nextInt(1000000 - 100000) + 100000;
        System.out.println("generate new Msg code. phone=" + phone + ",msgCode=" + msgCode);
        return msgCode;
    }

    private static LoadingCache<String, Optional<Integer>> msgCodeCache =
        CacheBuilder.newBuilder()
            .maximumSize(1000L)
            .expireAfterWrite(5, TimeUnit.SECONDS)//5s过期
            .concurrencyLevel(10)
            .build(new CacheLoader<String, Optional<Integer>>() {
                @Override
                public Optional<Integer> load(String phone) throws Exception {
                    return Optional.ofNullable(generateNewMsgCode(phone));
                }
            });

    private static Integer getMsgCodeByPhone(String phone){
        return msgCodeCache.getUnchecked(phone).orElse(0);
    }

    public static void main(String[] args) throws InterruptedException {

        String phone = "13100000000";

        //first
        System.out.println("first .msgCode:" + getMsgCodeByPhone(phone));

        Thread.sleep(1000);
        //second
        System.out.println("second .msgCode:" + getMsgCodeByPhone(phone));

        Thread.sleep(5000);
        //third
        System.out.println("third .msgCode:" + getMsgCodeByPhone(phone));

    }
}

"com.google.guava:guava:$guavaVersion"

欢迎大家关注我的微信公众号,购物优惠券
在这里插入图片描述

### 如何使用Guava实现本地缓存 为了展示如何通过Guava实现本地缓存,下面提供了一个具体的例子。此示例展示了创建`LoadingCache`的过程,该过程允许定义最大条目数并指定当某个键未命中时应加载什么值。 #### Maven依赖配置 首先,在项目的pom.xml文件中加入如下Maven依赖以引入Guava库: ```xml <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency> ``` #### 缓存实例化与自定义加载器 接着,可以通过`CacheBuilder`来构建一个带有自定义`CacheLoader`的`LoadingCache`对象。这里设置的最大容量为1000个条目,并且每当尝试访问不存在于缓存中的键时会触发`load()`方法执行昂贵的操作(比如数据库查询),并将结果存储回缓存供后续快速检索[^3]。 ```java import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; public class LocalCacheExample { private static final int MAX_CACHE_SIZE = 1000; public static void main(String[] args) { LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() .maximumSize(MAX_CACHE_SIZE) .build(new CacheLoader<Key, Graph>() { @Override public Graph load(Key key) throws AnyException { return createExpensiveGraph(key); } }); // 获取本地缓存的数据 try { System.out.println(graphs.getUnchecked(someKey)); } catch (Exception e) { // 处理异常情况... } } private static Graph createExpensiveGraph(Key key) throws AnyException { // 实现复杂的图形创建逻辑... return null; } } ``` 上述代码片段中,`graphs.getUnchecked(someKey)`用于从缓存中获取对应key的对象,如果找不到则自动调用`createExpensiveGraph()`函数生成新对象并将其放入缓存中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值