LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“若是数据过去被访问屡次,那么未来被访问的频率也更高。git
而后我先定义一个缓存对象MyCache,这里有一个泛型用来存对象,而后有一个useCount记录被使用次数,接下去是建立时间和最近使用时间。github
使用构造方法来初始化一些值:算法
由于使用了Priorityqueue因此要实现Comparable接口,并且更具useCount来比较缓存
而后咱们就能够进入下一步操做啦,定义一个PriorityQueue做为全局变量,这个限制一些最大缓存的数量,还有用一个object用来作同步块,队列中若是没有就加入队列中,这里就先不写set的状况,分布式
而后根据优先队列的特性来删除哪些不经常使用的元素,由于根据排序,优先队列会把咱们最想要的数据放在头部,因此调用poll方法,就能够实现删除最少使用的那一个,固然这里我能够选择删除固定数量的不经常使用数据,或者删除必定比例的数据,这个使用中能够用定时器或者分布式任务来清除缓存。测试
由于考虑哪些数据相等,我这里重写了hashCode和equals方法,这里只是调用缓存对象的比较,可是对于那些没有重写的缓存对象T,可能就会有问题啦,因此可能有的设计就会用序列化后的数据。设计
由于PriorityQueue只是作了一次的排序,因此我须要在用户修改后的数据也要更新顺序,因此我想把原来的数据删了,而后再添加一词,使用次数加1,最近使用时间也更新啦,只是这里我遍历了一边队列,效率比较低,只是说这里先考虑这个最近不经常使用淘汰,实际过程确定是查询为主。对象
而后咱们测试下:blog
输出:排序
LRU(Least recently used)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“若是数据最近被访问过,那么未来被访问的概率也更高”。
那么我想就是把MyCache里面的排序根据时间来指定就好了,最近最久远的排在队列的前面淘汰掉。
固然这里只是想用PriorityQueue写着玩!
未完待续