guava本地缓存CacheLoader使用

最近代码里看到有部分关于guava写本地缓存的,学习记录一下。

首先guava的本地缓存可以理解成一个缓存map,以kv的形式存数据,不会持久化,没有支持分布式。比redis使用起来方便,不用引入额外的组件。如果是单机缓存的话,可以首先选择使用这种缓存方式。

Guava cache的设计来源于CurrentHashMap,是线程安全的,可以按照多种策略来清理存储在其中的缓存值且保持很高的并发读写性能。常见应用场景:对性能有非常高的要求、不经常变化、占用内存不大、有访问整个集合的需求、数据允许不时时一致。

Guava cache的优点

多种清理和淘汰策略
支持并发(采用Segment做分区,线程安全)
更新锁定(对同一个key,只让一个请求去读源并回填缓存,其他请求阻塞等待)
集成数据源(一般我们在业务中操作缓存,都会操作缓存和数据源两部分GuavaCache的get可以集成数据源,在从缓存中读取不到时可以从数据源中读取数据并回填缓存)

使用方法

引入依赖

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.1.1-jre</version>
        </dependency>

抽象类

//引入数据库DAO

//定义缓存的map格式
public LoadingCache<Long,String> testCache

//初始化
@PostConstruct
private void init(){
	testCache = CacheBuilder.newBuilder()
	 		// 初始大小
            .initialCapacity(1000)
	 		// 缓存池大小
            .maximumSize(1000)
            // 设置时间对象没有被读/写访问则对象从内存中删除
            .expireAfterWrite(100, TimeUnit.MINUTES)
            //设置时间刷新缓存
            .refreshAfterWrite(60,TimeUnit.SECONDS)
            // 移除监听器
            .removalListener(
                new RemovalListener<Long, String>() {
                  @Override
                  public void onRemoval(RemovalNotification<Long, String> rn) {
                    handleRemove.accept(rn.getKey());
                  }
                })
            .recordStats()
            .build(
                new CacheLoader<Long, String>() {
                //第一次加载
                  @Override
                  public String load(Long aLong) throws Exception {
                    return handleNotExist.apply(aLong);
                  }
                  
                //异步刷新(过期刷新机制,调用LoadingCache.refresh优先调用这里,未重写则调上面load)
             	@Override
             	public ListenableFuture<String> reload(Long aLong, String oldValue) throws Exception {
             	ListenableFuture<String> task = ListenableFutureTask.creat( new Callable<String>(){
             	public String call(){
             	//请求数据库
             		return querySqlDAO(key);
             		}
                });
                refreshTaskExecutor.execute(task);
                return task;
                }
               }
    log.info("初始化缓存");
);

实现类,直接继承抽象类后,写对应的query和refresh函数,参数判断,异常处理等。调用定义缓存LoadingCache的get/refresh方法,其中入参都是缓存的key,刷新会优先调用重写的reload去更新缓存,一般都重写为异步加载。如果reload没有被重写,则调用load走第一次加载的逻辑。

使用的时候直接调用实现类中对应缓存的方法即可。

参考:
https://blog.csdn.net/ABestRookie/article/details/119901114

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Guava本地缓存是Google Guava提供的一个缓存框架,它可以帮助我们在应用程序中高效地缓存数据。使用Guava本地缓存需要以下步骤: 1. 导入Guava依赖 在项目中导入Guava依赖,可以通过Maven或Gradle等方式进行导入。 2. 创建缓存对象 使用CacheBuilder来创建一个缓存对象,可以设置缓存的大小、过期时间等参数,例如: ``` Cache<String, Object> cache = CacheBuilder.newBuilder() .maximumSize(100) .expireAfterAccess(10, TimeUnit.MINUTES) .build(); ``` 3. 将数据放入缓存 使用put方法将数据放入缓存中,例如: ``` cache.put("key1", "value1"); cache.put("key2", "value2"); ``` 4. 从缓存中获取数据 使用get方法从缓存中获取数据,例如: ``` Object value1 = cache.getIfPresent("key1"); Object value2 = cache.getIfPresent("key2"); ``` 5. 删除缓存中的数据 使用invalidate方法从缓存中删除数据,例如: ``` cache.invalidate("key1"); ``` 以上就是使用Guava本地缓存的基本步骤。需要注意的是,Guava本地缓存是线程安全的,可以在多线程环境中使用。同时,Guava本地缓存也提供了一些高级特性,例如缓存的回收策略、缓存的加载方式等,可以根据实际需求进行设置。 ### 回答2: Guava本地缓存是一种Google提供的使用简单且高效的缓存实现方式。下面是使用Guava本地缓存的步骤: 1. 首先,我们需要添加Guava库的依赖,确保项目中有Guava的jar包。 2. 创建一个缓存对象,可以使用CacheBuilder类的静态方法来创建一个新的缓存实例。例如: ```java Cache<String, String> cache = CacheBuilder.newBuilder() .maximumSize(100) .expireAfterWrite(10, TimeUnit.MINUTES) .build(); ``` 上述代码创建了一个最大容量为100的缓存实例,并且设置了写入10分钟后过期。 3. 往缓存中存储数据,可以使用put方法将键值对存储到缓存中。例如: ```java cache.put("key1", "value1"); cache.put("key2", "value2"); ``` 上述代码将键值对(key1, value1)和(key2, value2)存储到缓存中。 4. 从缓存中获取数据,可以使用get方法根据键来获取对应的值。例如: ```java String value1 = cache.get("key1", () -> "default value"); ``` 上述代码尝试从缓存中获取键为key1的值,如果缓存中存在该键,则返回对应的值;如果缓存中不存在该键,则通过提供的回调函数生成一个默认值,并将该值存储到缓存中,然后返回该默认值。 5. 判断缓存中是否存在某个键,可以使用方法约束containsKey。例如: ```java boolean contains = cache.containsKey("key1"); ``` 上述代码判断缓存中是否存在键为key1的键值对。 6. 清空缓存中的所有数据,可以使用方法invalidateAll。例如: ```java cache.invalidateAll(); ``` 上述代码清空缓存中的所有键值对。 7. 在使用缓存后,为了释放资源,可以使用方法invalidate来显式地使缓存无效,并且不会对缓存中的数据造成影响。例如: ```java cache.invalidate("key1"); ``` 上述代码使键为key1的键值对无效,但不会删除缓存中的其他数据。 通过以上步骤,我们可以灵活使用Guava本地缓存来提升程序的性能和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值