Hutool TimedCache 应用

Hutool是一款非常强大的Java工具库,提供了许多便捷的功能和工具类。在Hutool中,TimedCache是一个非常实用的类,用于实现带有时间限制的缓存功能。以下是关于TimedCache应用的详细介绍:

1. 引入Hutool

要使用TimedCache,首先需要确保项目中已经引入了Hutool的依赖。如果是Maven项目,可以在pom.xml中添加如下依赖(以Hutool 5.x版本为例,具体版本可能需要根据实际情况调整):

<dependency>  
    <groupId>cn.hutool</groupId>  
    <artifactId>hutool-all</artifactId>  
    <version>5.x.x</version> <!-- 请替换为实际版本号 -->  
</dependency>

2. 初始化TimedCache

TimedCache提供了多个构造方法,可以根据不同的需求进行初始化。常用的构造方法包括:

  • 无参数构造方法:使用默认的配置创建TimedCache实例。
  • 带缓存大小参数的构造方法:指定缓存大小,用于创建指定大小的TimedCache实例。
    例如:
// 创建一个默认的TimedCache实例  
TimedCache<String, Object> timedCache = new TimedCache<>();  
  
// 创建一个指定大小的TimedCache实例,这里设置为100  
TimedCache<String, Object> timedCacheWithSize = new TimedCache<>(100);

3. 使用TimedCache

添加缓存
可以使用put方法向TimedCache中添加缓存数据,并设置过期时间。过期时间是以毫秒为单位的时间戳,可以通过Hutool的TimeUtil类进行转换。

import cn.hutool.core.util.TimeUtil;  
import cn.hutool.cache.impl.TimedCache;  
  
// 添加一个缓存项,设置过期时间为5秒  
timedCache.put("key1", "value1", TimeUtil.seconds(5));

获取缓存
使用get方法从TimedCache中获取缓存数据。如果数据不存在或已过期,则返回null。

// 从TimedCache中获取key为"key1"的缓存数据  
Object data = timedCache.get("key1");  
System.out.println(data); // 输出:value1(如果数据未过期)或null(如果数据已过期或不存在)

刷新过期时间
在某些情况下,可能希望在每次访问缓存时都刷新其过期时间。这可以通过在get方法中使用特定的逻辑来实现,但需要注意的是,TimedCache本身并不直接提供这样的API。如果需要这种功能,可能需要自定义逻辑或使用其他缓存机制。

不过,Hutool的CacheUtil类提供了一个newTimedCache静态方法,该方法创建的TimedCache实例在默认情况下,每次通过get方法访问缓存时都会刷新过期时间(但这取决于具体的Hutool版本和配置)。

4. 注意事项

  • 过期时间是以毫秒为单位的时间戳。
  • 当缓存数据过期时,TimedCache会自动进行清理操作。如果需要自定义清理逻辑,可以通过实现CacheListener接口来实现。
  • TimedCache支持并发访问,但在多线程环境下使用时需要注意线程安全问题。可以使用synchronized关键字或其他并发控制机制来保证线程安全。

5. 示例

以下是一个简单的示例,展示了如何使用TimedCache:

import cn.hutool.core.util.TimeUtil;  
import cn.hutool.cache.impl.TimedCache;  
  
public class TimedCacheExample {  
    public static void main(String[] args) {  
        // 创建一个TimedCache实例,指定缓存大小为100  
        TimedCache<String, Object> timedCache = new TimedCache<>(100);  
  
        // 向TimedCache中添加数据,过期时间为5秒  
        timedCache.put("key1", "value1", TimeUtil.seconds(5));  
  
        // 从TimedCache中获取数据  
        Object data = timedCache.get("key1");  
        System.out.println(data); // 输出:value1(如果数据未过期)  
  
        // 等待一段时间(例如6秒),然后再次尝试获取数据  
        // 此时数据应该已经过期,因此输出为null  
        try {  
            Thread.sleep(6000);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
  
        data = timedCache.get("key1");  
        System.out.println(data); // 输出:null(如果数据已过期)  
    }  
}

6. 封装Utils

package com.sft.sjzz.core;

import cn.hutool.cache.CacheUtil;
import cn.hutool.cache.impl.TimedCache;
import cn.hutool.core.date.DateUnit;

import java.util.Set;

/**
 * 本地缓存
 * @author mqiqe
 */
public class LocalCache {
    /**
     * 默认缓存时长
     */
    private static final long DEFAULT_TIMEOUT = 5 * DateUnit.MINUTE.getMillis();
    /**
     * 默认清理间隔时间
     */
    private static final long CLEAN_TIMEOUT = 5 * DateUnit.MINUTE.getMillis();
    /**
     * 缓存对象
     */
    private static final TimedCache<String, Object> TIMED_DATA_ID_CACHE = CacheUtil.newTimedCache(DEFAULT_TIMEOUT);
    static {
        //启动定时任务
        TIMED_DATA_ID_CACHE.schedulePrune(CLEAN_TIMEOUT);
    }
    public static void set(String key, Object value) {
        TIMED_DATA_ID_CACHE.put(key, value);
    }

    public static void set(String key, Object value, long expire) {
        TIMED_DATA_ID_CACHE.put(key, value, expire);
    }

    /**
     * 获取并重新计算过期时间
     */
    public static Object getWithUpdateLastAccess(String key) {
        return TIMED_DATA_ID_CACHE.get(key);
    }

    /**
     * 获取
     *
     * @param key KEY
     * @return 值
     */
    public static Object get(String key) {
        return TIMED_DATA_ID_CACHE.get(key, false);
    }
    public static boolean isExist(String key) {
        return TIMED_DATA_ID_CACHE.containsKey(key);
    }
    public static Set<String> keySet() {
        return TIMED_DATA_ID_CACHE.keySet();
    }


    public static void remove(String key) {
        TIMED_DATA_ID_CACHE.remove(key);
    }

    public static void clear() {
        TIMED_DATA_ID_CACHE.clear();
    }
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值