ToB企服应用市场:ToB评测及商务社交产业平台

标题: Guava Cache 介绍 [打印本页]

作者: 悠扬随风    时间: 2023-12-15 19:51
标题: Guava Cache 介绍
Guava 是 Google 提供的一套 Java 工具包,而 Guava Cache 是该工具包中提供的一套完善的 JVM 级别高并发缓存框架;本文主要介绍它的相关功能及基本使用,文中所使用到的软件版本:Java 1.8.0_341、Guava 32.1.3-jre。
1、简介

缓存在很多情况下非常有用。例如,当某个值的计算或检索代价很高,并且你需要在特定输入下多次使用该值时,就应该考虑使用缓存。
Guava Cache 与 ConcurrentMap 类似,但并不完全相同。最基本的区别在于,ConcurrentMap 会一直保存所有添加到其中的元素,直到显式地将它们删除。而 Guava Cache 通常会配置自动删除条目,以限制其内存占用。在某些情况下,即使不删除条目,LoadingCache 也很有用,因为它具有自动加载条目的功能。
通常情况下,Guava Cache 适用于以下情况:
如果你的情况符合上述每一点,那么 Guava Cache 可能适合你。
注意:如果你不需要缓存的特性,ConcurrentHashMap 在内存效率方面更高——但是使用任何 ConcurrentMap 几乎不可能复制大多数 Guava Cache 的特性。
2、数据加载

使用 Guava Cache 时,首先要问自己一个问题:是否有合理的默认函数来加载或计算需缓存的数据?如果是这样,应该使用 CacheLoader。如果没有,或者需要覆盖默认函数,但仍然希望具有原子的“如果不存在则计算并获取”语义,你应该将一个 Callable 对象传递给 get 方法。可以直接使用 Cache.put 方法插入元素,但更推荐自动加载数据,因为这样可以更容易地推断所有缓存内容的一致性。
2.1、CacheLoader

LoadingCache 是一个带有 CacheLoader 的缓存。创建 CacheLoader 很容易,只需要实现方法 V load(K key) throws Exception 即可。
  1. LoadingCache<Long, String> loadingCache = CacheBuilder.newBuilder()
  2.         .maximumSize(1000)
  3.         .build(new CacheLoader<Long, String>() {
  4.             @Override
  5.             public String load(Long key) throws Exception {
  6.                 //TODO: 根据业务加载数据
  7.                 return RandomStringUtils.randomAlphanumeric(10);
  8.             }
  9.         });
  10. try {
  11.     log.info(loadingCache.get(1L));
  12. } catch (ExecutionException e) {
  13.     e.printStackTrace();
  14. }
复制代码
LoadingCache 使用 get(K) 方法来获取数据。该方法要么返回已缓存的值,要么使用 CacheLoader 来原子地加载一个新值到缓存中。由于 CacheLoader 可能会抛出异常,LoadingCache.get(K) 方法会抛出 ExecutionException 异常。(如果 CacheLoader 抛出未经检查异常,get(K) 方法将抛出包装异常 UncheckedExecutionException)。也可以选择使用 getUnchecked(K) 方法,它将所有异常都包装在UncheckedExecutionException 中,但如果底层的 CacheLoader 抛出已检查异常,这可能导致意外行为。
  1. LoadingCache<Long, String> loadingCache = CacheBuilder.newBuilder()
  2.         .maximumSize(1000)
  3.         .build(new CacheLoader<Long, String>() {
  4.             @Override
  5.             public String load(Long key) {//抛出未检查异常
  6.                 //TODO: 根据业务加载数据
  7.                 return RandomStringUtils.randomAlphanumeric(10);
  8.             }
  9.         });
  10. log.info(loadingCache.getUnchecked(1L));
复制代码
可以使用 getAll(Iterable




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4