hutools实现定时缓存

mtain 2023年05月29日 129次浏览

hutools几个类型的缓存

CacheUtil类是一个可以创建各种类型缓存的工厂类,默认提供了下面6种缓存的创建:

1. FIFOCache: 先进先出缓存

• 元素不停的加入缓存直到缓存满为止,当缓存满时,清理过期缓存对象,清理后依旧满则删除先入的缓存(链表首部对象)
• 优点:简单快速
• 缺点:不灵活,不能保证最常用的对象总是被保留
• API:static <K, V> FIFOCache<K, V> newFIFOCache(int capacity, long timeout)

2. LFUCache: 最少使用率缓存

• 根据使用次数来判定对象是否被持续缓存,使用率是通过访问次数计算的。
• 清理后依旧满的情况下清除最少访问(访问计数最小)的对象并将其他对象的访问数减去这个最小访问数,以便新对象进入后可以公平计数。
• API:static <K, V> LFUCache<K, V> newLFUCache(int capacity, long timeout)

3. LRUCache: 最近最久未使用缓存

• 根据使用时间来判定对象是否被持续缓存 当对象被访问时放入缓存,当缓存满了,最久未被使用的对象将被移除。
• 此缓存基于LinkedHashMap,因此当被缓存的对象每被访问一次,这个对象的key就到链表头部。
• 这个算法简单并且非常快,他比FIFO有一个显著优势是经常使用的对象不太可能被移除缓存。 缺点是当缓存满时,不能被很快的访问。
• API: static <K, V> LRUCache<K, V> newLRUCache(int capacity, long timeout)

4. TimedCache: 定时缓存

• 此缓存没有容量限制,对象只有在过期后才会被移除
• API: static <K, V> TimedCache<K, V> newTimedCache(long timeout)

5. WeakCache: 弱引用缓存

• 对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。
• 丢弃某个键时,其条目从映射中有效地移除。
• API: static <K, V> WeakCache<K, V> newWeakCache(long timeout)

6. NoCache: 不缓存

• 不实现缓存,用于快速关闭缓存。
• API: static <K, V> NoCache<K, V> newNoCache()

定时缓存代码示例

LocalCache.java

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

public class LocalCache {
    /**
     * 缓存时长
     */
    public static final long TIMEOUT = 1 * DateUnit.MINUTE.getMillis();
    /**
     * 缓存对象
     */
    public static final TimedCache<String, Object> CACHE = CacheUtil.newTimedCache(TIMEOUT);

    static {
        //启动定时任务
        CACHE.schedulePrune(TIMEOUT);
    }
}


测试缓存

import cn.hutool.core.util.RandomUtil;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.Set;

@Service
@EnableScheduling
public class ScheduleTask {

    /**
     * 每15秒插入缓存
     * @param
     * @return
     */
    @Scheduled(fixedRate = 50000)
    public void setScheduleTaskTwo(){
        System.out.println("插入缓存:"+ LocalDateTime.now());
        LocalCache.CACHE.put(RandomUtil.randomString(10), RandomUtil.randomBigDecimal());
    }

    /**
     * 每秒获取缓存
     * @param
     * @return void
     */
    @Scheduled(cron = "0/30 * * * * ?")
    public void setScheduleTaskOne(){
        Set<String> caches = LocalCache.CACHE.keySet();
        System.out.println("获取缓存个数:"+ LocalDateTime.now()+"---"+caches.size());
    }
 

}