MST

星途 面试题库

面试题:缓存设计之Guava Cache基础使用

请描述Guava Cache中设置过期时间的两种主要方式,并说明它们在实际应用场景中的区别。假设你正在开发一个用户信息查询接口,需要缓存用户信息5分钟,代码示例应该如何编写?
22.0万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

设置过期时间的两种主要方式

  1. 基于写入时间过期(Expire After Write):从数据写入缓存开始计时,当达到设定的过期时间后,该数据会被标记为过期,在下次访问时被清理(或在后台线程定期清理)。适用于数据在写入一段时间后就不再有效的场景,比如一些短期的临时数据,像短信验证码缓存,通常几分钟后就不再有效。
  2. 基于访问时间过期(Expire After Access):从数据最近一次被访问(读或写操作)开始计时,当达到设定的过期时间后,该数据会被标记为过期,后续处理同基于写入时间过期。适用于数据在一段时间没有被访问后就不再需要缓存的场景,例如一些很少被访问的历史文件缓存,如果长时间没人访问,就可以清理掉。

实际应用场景区别

  • 基于写入时间过期:适用于数据本身有固定的有效期,与是否被访问无关的场景。例如限时优惠信息、限时活动数据等,无论用户是否查看,过了设定时间就无效。
  • 基于访问时间过期:适用于数据的有效性与访问频率相关的场景。比如用户的浏览历史缓存,如果用户长时间不再查看,缓存就可以清理以节省空间。

代码示例

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.concurrent.TimeUnit;

public class UserInfoCacheExample {
    private static final Cache<String, String> userInfoCache = CacheBuilder.newBuilder()
           .expireAfterWrite(5, TimeUnit.MINUTES)
           .build();

    public static String getUserInfo(String userId) {
        String userInfo = userInfoCache.getIfPresent(userId);
        if (userInfo == null) {
            // 模拟从数据库或其他数据源获取用户信息
            userInfo = "User information for " + userId;
            userInfoCache.put(userId, userInfo);
        }
        return userInfo;
    }

    public static void main(String[] args) {
        System.out.println(getUserInfo("123"));
    }
}

上述代码使用CacheBuilderexpireAfterWrite方法设置了缓存数据在写入5分钟后过期。在getUserInfo方法中,先尝试从缓存获取用户信息,如果不存在则从数据源获取并放入缓存。