Guava Cache本地缓存介绍及使用

Guava Cache 是一个全内存的本地缓存实现,它提供了线程安全的实现机制。整体上来说 Guava Cache 是本地缓存的不二之选,因为其简单易用,性能好。Guava Cache 不是一个单独的缓存框架,而是 Guava 中的一个模块。

Guava Cache 的优点体现在三个方面:

  • 本地缓存,读取效率高,不受网络因素影响。
  • 拥有丰富的功能,操作简单。
  • 线程安全。

Guava Cache 的不足之处也体现在三个方面:

  • 缓存为本地缓存,不能持久化数据。
  • 单机缓存,受机器内存限制,当应用重启数据时会丢失。
  • 分布式部署时无法保证数据的一致性。

代码示例

下面我们通过 CacheBuilder 构建一个缓存对象,设置写入数据 1 分钟后过期,在 load 方法中加载数据库的数据,然后通过 CacheBuilder 对象的 get 方法获取数据。

如果缓存中存在数据则从缓存中获取数据返回,如果缓存中不存在对应的数据则执行 load 中的逻辑,从数据库中查询数据并缓存,见代码如下。

  1. LoadingCache<String, Person> cahceBuilder = CacheBuilder.newBuilder()
  2. .expireAfterWrite(1, TimeUnit.MINUTES)
  3. .build(new CacheLoader<String, Person>() {
  4. @Override
  5. public Person load(String key) throws Exception {
  6. return dao.findById(id);
  7. }
  8. });
  9. public Person get(String id) throws Exception {
  10. return cahceBuilder.get(id);
  11. }

回收策略

Guava Cache 是本地缓存,对于数据的缓存一定要有限制,不能盲目缓存数据,我们可以通过配置一些回收策略来进行缓存的回收。

CacheBuilder 为基于时间的回收提供了两种方式,具体代码如下所示。

  • expireAfterAccess(long,TimeUnit):当缓存项在指定的时间段内没有被读或写就会被回收。这种回收策略类似于基于容量回收策略。
  • expireAfterWrite(long,TimeUnit):当缓存项在指定的时间段内没有更新就会被回收。如果我们认为缓存数据在一段时间后不再可用,那么就可以使用该种策略。
  1. CacheBuilder.newBuilder()
  2. .expireAfterWrite(1, TimeUnit.MINUTES)
  3. .expireAfterAccess(1, TimeUnit.MINUTES)

CacheBuilder 提供了显示移除的三种方式:

  • CacheBuilder.invalidate(key) 单个移除
  • CacheBuilder.invalidteAll(keys) 批量移除
  • CacheBuilder.invalidateAll() 移除全部

CacheBuilder 还提供了通过设置最大容量来进行移除的方式,当超出指定的容量后缓存将尝试回收最近没有使用或总体上很少使用的缓存项,见如下代码所示。

  1. CacheBuilder.newBuilder().maximumSize(10)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Guava Cache是Google Guava库中提供的一种本地缓存解决方案。它是一个基于内存的缓存,可以在应用程序内部存储数据,提高应用程序性能。 Guava Cache提供了以下特性: 1. 自动加载:当缓存中不存在某个键的值时,可以自动加载生成该值。 2. 自动移除:缓存中的某些条目可以在一定时间内自动过期,或者可以使用大小限制来限制缓存中的条目数。 3. 针对不同的缓存数据设置不同的过期时间、存活时间、最大值、最小值等。 4. 支持同步和异步缓存使用Guava Cache非常简单,只需要按以下步骤操作: 1. 引入Guava库。 2. 创建一个CacheBuilder对象,用于配置缓存。 3. 调用build()方法创建一个Cache对象。 4. 使用put()方法向缓存中添加数据。 5. 使用get()方法从缓存中读取数据,如果缓存中不存在该键对应的值,则可以自动加载。 6. 使用invalidate()方法从缓存中移除数据。 下面是一个简单的示例: ```java import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; public class GuavaCacheExample { public static void main(String[] args) throws ExecutionException { // 创建一个CacheBuilder对象 CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder() .maximumSize(100) // 设置缓存最大条目数 .expireAfterWrite(10, TimeUnit.MINUTES); // 设置缓存过期时间 // 创建一个Cache对象 LoadingCache<String, String> cache = cacheBuilder.build(new CacheLoader<String, String>() { @Override public String load(String key) throws Exception { System.out.println("loading " + key); // 自动加载数据 return "value-" + key; } }); // 添加数据到缓存cache.put("key1", "value1"); cache.put("key2", "value2"); // 从缓存中读取数据 System.out.println(cache.get("key1")); // 输出"value1" System.out.println(cache.get("key3")); // 输出"loading key3"和"value-key3" // 移除缓存中的数据 cache.invalidate("key1"); System.out.println(cache.get("key1", () -> "default")); // 输出"default" } } ``` 在这个示例中,我们使用CacheBuilder对象配置了缓存的最大条目数和过期时间。我们还使用CacheLoader对象创建了一个自动加载的缓存,当缓存中不存在某个键的值时,可以自动加载生成该值。我们使用put()方法向缓存中添加了两个数据,使用get()方法从缓存中读取了两个数据,并使用invalidate()方法从缓存中移除了一个数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智慧浩海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值