文章目录 前言一、优先级队列PriorityQueue 简介 二、优先级+LRU总结
前言
在项目中遇到了,需要根据 优先级 + LRU 缓存数据;
LRU 优先考虑采用hutool ,然后自己附加搞上 一个优先级就行了
一、优先级队列 PriorityQueue 简介
PriorityQueue是基于优先级堆的无界队列。
PriorityQueue的作用是保证每次取出的都是队列中权值最小的元素,也可以说是最高优先级的元素。
PriorityQueue的元素排序是按照自然排序来进行排序的,在创建时可以给他添加一个给元素排序的比较器。
offer():添加元素到队列中,如果队列已满,则返回false。
poll():检索并删除队列中的最小元素,如果队列为空,则返回null。
remove():检索并删除队列中的最小元素,如果队列为空,则返回null。
add():添加元素到队列中。
peek():检索但不删除队列中的最小元素,如果队列为空,则返回null。
size():返回队列中的元素数目。
iterator():返回一个迭代器,该迭代器可以按排序的顺序遍历队列中的元素。
二、优先级+LRU
由于PriorityQueue 是无界队列,所以需要保证队列长度不超过最大值
由于每次获取的都是优先级最高的元素,所以采用倒叙,也就是优先级高的在最后 ,数值越小越靠后,优先级越高
采用读写锁,控制并发
import cn.hutool.cache.CacheListener; import cn.hutool.cache.CacheUtil; import cn.hutool.cache.impl.LRUCache; import cn.hutool.json.JSONUtil; import java.util.AbstractMap; import java.util.Comparator; import java.util.Map.Entry; import java.util.PriorityQueue; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.springframework.util.ObjectUtils; /** * 根据优先级 + LRU 缓存数据 * * @author fulin * @since 2023/11/15 16:11 */ public class PriorityLRUCache { private PriorityLRUCache() { } // 存储最大值 private static int maxSize = 3; // 缓存时间 单位ms private static int time = 90000; public static void setMaxSize(int maxSize) { PriorityLRUCache.maxSize = maxSize; } public static void setTime(int time) { PriorityLRUCache.time = time; } // lru 存储 单位ms private static final LRUCache