Skip to content

FIFO & LRU & LFU

Tony Shen edited this page Feb 9, 2019 · 6 revisions

在 core 模块中,Memory 的默认实现 FIFOMemoryImpl、LRUMemoryImpl、LFUMemoryImpl 分别使用 FIFO、LRU、LFU 算法来缓存数据。

FIFO

RxCache 通过使用 LinkedList 存放缓存的 keys、ConcurrentHashMap 存放缓存的数据,可以实现 FIFO 算法。

LRU

LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。

RxCache 使用 ConcurrentHashMap 和 ConcurrentLinkedQueue 实现该算法。如果某个数据已经存放在缓存中,则从 queue 中删除并添加到 queue 的第一个位置。如果缓存已满,则从 queue 中删除最后面的数据。并把新的数据添加到缓存。

LFU

LFU是Least Frequently Used的缩写,即最近最不常用使用。

LRU 是淘汰最长时间未被使用的数据,而 LFU 是淘汰一定时期内被访问次数最少的数据。LFU 会记录数据在一定时间内的使用次数。

import com.safframework.rxcache.RxCache;
import com.safframework.rxcache.memory.impl.LFUMemoryImpl;

/**
 * Created by tony on 2018/10/22.
 */
public class TestLFUCache {

    public static void main(String args[]) {

        RxCache.config(new RxCache.Builder().memory(new LFUMemoryImpl(10)));

        RxCache rxCache = RxCache.getRxCache();
        rxCache.save("test1",1);
        rxCache.save("test2",2);
        rxCache.save("test3",3);
        rxCache.save("test4",4);
        rxCache.save("test5",5);

        System.out.println(rxCache.get("test1",Integer.class).getData());

        rxCache.save("test6",6);

        System.out.println(rxCache.get("test2",Integer.class).getData());
        System.out.println(rxCache.get("test3",Integer.class).getData());
        System.out.println(rxCache.get("test4",Integer.class).getData());

        rxCache.save("test7",7);
        rxCache.save("test8",8);

        System.out.println(rxCache.get("test2",Integer.class).getData());
        System.out.println(rxCache.get("test3",Integer.class).getData());
        System.out.println(rxCache.get("test4",Integer.class).getData());

        rxCache.save("test9",9);
        rxCache.save("test10",10);
        rxCache.save("test11",11);
        rxCache.save("test12",12);

        System.out.println(rxCache.get("test2",Integer.class).getData());
        System.out.println(rxCache.get("test3",Integer.class).getData());
        System.out.println(rxCache.get("test4",Integer.class).getData());

        rxCache.save("test13",13);
        rxCache.save("test14",14);

        System.out.println(rxCache.get("test1",Integer.class).getData());

        rxCache.clear();

        rxCache.save("test1",1);
        rxCache.save("test2",2);
        rxCache.save("test3",3);
        rxCache.save("test4",4);
        rxCache.save("test5",5);

        System.out.println(rxCache.get("test1",Integer.class).getData());
    }
}