Guava之Supplier缓存使用示例

简介: 使用guava作内存缓存,大多数小伙伴应该都使用过,通过CacheBuilder创建LoadingCache一个kv格式的缓存,如果我们需要缓存的只是一个value呢?针对这种场景,接下来介绍一种基于Supplier来实现的缓存方式

使用guava作内存缓存,大多数小伙伴应该都使用过,通过CacheBuilder创建LoadingCache一个kv格式的缓存,如果我们需要缓存的只是一个value呢?


针对这种场景,接下来介绍一种基于Supplier来实现的缓存方式


1. Supplier使用姿势



guava的Supplier与jdk的Supplier从接口定义上来看没什么区别,对外只提供了一个get()方法


@FunctionalInterface
@GwtCompatible
public interface Supplier<T> extends java.util.function.Supplier<T> {
    @CanIgnoreReturnValue
    T get();
}
复制代码


重点需要关注的是Supplier创建的姿势,借助Suppliers来实现


下面是几个常见的创建姿势:


  • memoize:  delegate为具体的获取值的委托类,需要注意的是,delegate的具体实现只会在首次时调用;这种方式相当于持久缓存
  • memoizeWithExpiration:delegate的返回值,会缓存一段时间;缓存时间过后,会重新调用一下delegate来获取返回值
  • ofInstance: 直接传参
public static <T> Supplier<T> memoize(Supplier<T> delegate)
public static <T> Supplier<T> memoizeWithExpiration(Supplier<T> delegate, long duration, TimeUnit unit)
public static <T> Supplier<T> ofInstance(@Nullable T instance)
复制代码


基于上面的方法描述,如果我们想实现一个10s缓存,那么可以选择memoizeWithExpiration来实现


AtomicInteger atomicInteger = new AtomicInteger(1);
Supplier<Integer> cache = Suppliers.memoizeWithExpiration(this::ret, 10, TimeUnit.SECONDS);
private int ret() {
    System.out.println("------- 更新 value --------");
    return atomicInteger.getAndAdd(2) ;
}
复制代码


上面定义了一个内存缓存cache, 缓存10s,调用时若缓存失效,会重新调用ret()刷新缓存


测试case就比较简单了

@Test
public void testSupplier() throws InterruptedException {
    for (int i = 0; i < 10; i++) {
        System.out.print(cache.get() + " | ");
    }
    System.out.println();
    Thread.sleep(10000);
    System.out.println(cache.get());
}
复制代码


输出如下

------- 更新 value --------
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 
------- 更新 value --------
3
复制代码


2. 缓存刷新



使用Supplier当缓存时,需要注意的一点就是没有缓存失效的方法可供调用;对于LoadingCache若是想失效缓存,可以通过调用 invalidate来主动失效指定的缓存,那么Supplier 可以怎么整?


  • 直接重新赋值


比如当我们希望刷新时,可以直接覆盖就的supplier即可


public void refresh() {
    cache = Suppliers.memoizeWithExpiration(this::ret, 10, TimeUnit.SECONDS);
}



相关文章
|
7月前
|
缓存 Java
【JAVA】基于Guava实现本地缓存
【JAVA】基于Guava实现本地缓存
108 0
|
4月前
|
缓存 NoSQL Java
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
|
4月前
|
存储 缓存 监控
Java本地高性能缓存实践问题之在EncacheTest示例中正确移除一个缓存实例的问题如何解决
Java本地高性能缓存实践问题之在EncacheTest示例中正确移除一个缓存实例的问题如何解决
|
5月前
|
缓存 Java Spring
Guava缓存工具类封装和使用
Guava缓存工具类封装和使用
130 0
|
5月前
|
存储 缓存 监控
Redis问题之如何使用Guava Cache来监控缓存的加载/命中情况
Redis问题之如何使用Guava Cache来监控缓存的加载/命中情况
|
5月前
|
存储 缓存 监控
Redis问题之使用Guava Cache相比自己设计本地缓存有哪些优势
Redis问题之使用Guava Cache相比自己设计本地缓存有哪些优势
|
7月前
|
存储 缓存 NoSQL
Guava 缓存详解及使用
Guava Cache 是`Google Fuava`中的一个内存缓存模块,用于将数据缓存到JVM内存中。 本文主要介绍下Guava缓存的配置详解及相关使用 缓存分为本地缓存与分布式缓存。本地缓存为了保证线程安全问题,一般使用`ConcurrentMap`的方式保存在内存之中,而常见的分布式缓存则有`Redis`,`MongoDB`等。
|
7月前
|
缓存 NoSQL Java
SpringBoot:第五篇 集成Guava(本地缓存+分布式缓存)
SpringBoot:第五篇 集成Guava(本地缓存+分布式缓存)
360 0
|
存储 缓存 监控
真正的缓存之王,Google Guava 只是弟弟(一)
前面刚说到Guava Cache,他的优点是封装了get,put操作;提供线程安全的缓存操作;提供过期策略;提供回收策略;缓存监控。当缓存的数据超过最大值时,使用LRU算法替换。这一篇我们将要谈到一个新的本地缓存框架:Caffeine Cache。它也是站在巨人的肩膀上-Guava Cache,借着他的思想优化了算法发展而来。 本篇博文主要介绍Caffine Cache 的使用方式,以及Caffine Cache在SpringBoot中的使用。
真正的缓存之王,Google Guava 只是弟弟(一)
|
存储 缓存 NoSQL
真正的缓存之王,Google Guava 只是弟弟(二)
真正的缓存之王,Google Guava 只是弟弟(二)