基于Guava的本地缓存

@Slf4j
public class GuavaUtil {

    /**
     * 清除缓存容量
     * 当缓存容量达到配置最大容量时,Guava Cache会基于LRU算法清除缓存
     */
    private static final int MAX_NUM = 100000;

    /**
     * 用户名和token缓存
     * key-用户名value-token
     */
    @SuppressWarnings("UnstableApiUsage")
    private static Cache<String, Boolean> CACHE;

    /**
     * 添加token缓存
     * @param tenantId 租户
     * @param type 开关
     * @return 商户号
     */
    @SuppressWarnings("UnstableApiUsage")
    public static String addCache(String tenantId, Boolean type) {
        if (Objects.isNull(CACHE)) {
            CACHE = CacheBuilder.newBuilder()
                    .maximumSize(MAX_NUM)
                    // 缓存项写入后多久过期
                    .expireAfterWrite(12, TimeUnit.HOURS)
                    .concurrencyLevel(8)
                    .build();
        }
        CACHE.put(tenantId, type);
        return tenantId;
    }

    public static void clearCache(String tenantId) {
        CACHE.invalidate(tenantId);


    }

    /**
     * 从缓存中获取token
     * @param
     * @return 缓存
     */
    @SuppressWarnings("UnstableApiUsage")
    public static Boolean getCache(String tenantId) {
        if (Objects.isNull(CACHE)) {
            return null;
        }
        Boolean value = CACHE.getIfPresent(tenantId);

        return value;
    }
}
### Spring Boot 中 Guava 实现本地缓存的集成与使用 在 Spring Boot 应用程序中,可以利用 Google 的 Guava 缓存库来实现高效的本地缓存解决方案。以下是关于如何配置和使用的详细介绍。 #### 配置依赖项 为了在项目中引入 Guava 缓存功能,需在 `pom.xml` 文件中添加相应的 Maven 依赖项: ```xml <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.1-jre</version> </dependency> ``` 如果使用的是 Gradle 构建工具,则可以在 `build.gradle` 文件中加入如下内容[^2]: ```gradle implementation 'com.google.guava:guava:31.1-jre' ``` #### 创建自定义 CacheManager 类 通过创建一个专门用于管理 Guava 缓存实例的类,能够更方便地控制缓存的行为模式以及生命周期。下面是一个简单的例子展示如何构建此类并初始化缓存对象: ```java import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.util.concurrent.TimeUnit; public class CustomCacheManager { private final Cache<String, Object> cache; public CustomCacheManager(long expireAfterWriteDuration, TimeUnit timeUnit) { this.cache = CacheBuilder.newBuilder() .expireAfterWrite(expireAfterWriteDuration, timeUnit) .maximumSize(500) .build(); } public void put(String key, Object value){ cache.put(key,value); } public Object getIfPresent(String key){ return cache.getIfPresent(key); } } ``` 上述代码片段展示了如何设置最大容量 (`maximumSize`) 和写入后过期时间 (`expireAfterWrite`) 参数[^3]。 #### 将其注册为 Bean 并注入到服务层 为了让整个应用程序都可以访问这个缓存机制,在 Spring 上下文中将其声明成 bean 是非常必要的操作之一。可以通过 @Configuration 注解标记的一个 Java Config 来完成这项工作: ```java @Configuration public class AppConfig { @Bean(name="customCacheManager") public CustomCacheManager customCacheManager(){ return new CustomCacheManager(10L,TimeUnit.MINUTES); // 设置缓存条目活时间为10分钟 } } ``` 之后就可以像其他任何 spring managed beans 一样轻松地将它注入到需要的地方了。 #### 使用示例 假设我们有一个 User 对象储需求,那么可以直接调用之前定义好的方法来进行增删改查等基本操作: ```java @Service public class UserServiceImpl implements UserService{ @Autowired @Qualifier("customCacheManager") private CustomCacheManager customCacheManager; @Override public Optional<User> getUserById(Long id){ String userIdKey = generateUserIdKey(id); User userFromCache = (User)this.customCacheManager.getIfPresent(userIdKey); if(userFromCache != null){ System.out.println("Retrieved from Cache"); return Optional.ofNullable(userFromCache); }else{ System.out.println("Not found in Cache, fetching from DB..."); // Simulate database call here... User fetchedUser = fetchUserFromDatabase(id); if(fetchedUser!=null){ this.customCacheManager.put(generateUserIdKey(id),fetchedUser); } return Optional.ofNullable(fetchedUser); } } private static String generateUserIdKey(Long id){ return "USER_ID_"+id.toString(); } private User fetchUserFromDatabase(Long id){ // Database logic goes here ... return null; } } ``` 以上即是在 Spring Boot 环境下基于 Guava 进行本地缓存的一种典型实践方式[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值