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());
}
}