使用Google Guava Cache来做缓存

Source
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Mesiary_Z/article/details/101472867


Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。

添加依赖

在pom.xml文件中添加依赖:

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

代码示例

新建一个缓存实例

/**
 * 学生信息缓存
 */
private static LoadingCache<String, Optional<Student>> studentCache = CacheBuilder.newBuilder()
	// 设置缓存数据在访问3分钟后过期
	.expireAfterAccess(3, TimeUnit.SECONDS)
	.build(new CacheLoader<String, Optional<Student>>() {
		// 设置缓存的value值
		 @Override
		 public Optional<Student> load(String s) throws Exception {
		 	return Optional.ofNullable(getStudent(s));
		 }
	});

/**
 * 学号
 */
private static long stuNo = 1L;

/**
 * 返回相应学生信息
 * @param name 姓名
 * @return
 */
private static Student getStudent(String str) {
    Student st = Student.builder()
            .name(str)
            .sex(0)
            .age(10)
            .studentId(stuNo++)
            .build();
    System.out.println("写缓存【" + str +"】");
    return st;
}

由于LoadingCache<K, V>V的值为null时,会报错,所以程序中的V使用了Optional<T>类型的数据。具体的Optional<T>类说明可查看其源码。

在示例中只对缓存进行了过期时间的设置,其他的常用方法还包括:

  1. 设置可缓存的最大实体数量:maximumSize(long maximumSize);
  2. 缓存数据首次创建或最近一次值修改后的过期时间:expireAfterWrite(long duration, TimeUnit unit);
  3. 设置内部哈希表的最小总大小:initialCapacity(int initialCapacity)

测试

下面的代码将对缓存数据进行测试:

private static void test() throws ExecutionException, InterruptedException {
    System.out.println("firstTime:");
    for(int i = 0; i < 2; i++) {
        studentCache.get("name" + i);
    }

	// 休眠3秒
    Thread.sleep(3000);
    System.out.println("secondTime:");
    for(int i = 0; i < 2; i++) {
        studentCache.get("name" + i);
    }

	// 休眠2秒,少于过期时间
    Thread.sleep(2000);
    System.out.println("thirdTime:");
    for(int i = 0; i < 2; i++) {
        studentCache.get("name" + i);
    }
    System.out.println("End.");
}

以上代码的执行结果为:

firstTime:
写缓存【name0】
写缓存【name1】
secondTime:
写缓存【name0】
写缓存【name1】
thirdTime:
End.

从上面的结果不难发现,第一次访问的时候还没有数据,此时会直接添加;第二次由于数据已经过期,所以也需要重新写入;但第三次访问时,由于数据有缓存在内存中,所以直接从缓存中获取数据而没有新建。

上面是最近工作中的一点收获,记录一下。