1. 缓存用的是装饰模式,首先定义了Cache接口,其它装饰类实现了这个接口,每个装饰类实现自己的功能
默认的缓存采用hashmap
2. 装饰类有
1)日志cache:在getObject记录日志,输出缓存命中比例
2)SoftCache和WeakCache:通过软引用和弱引用来实现缓存,很典型待详细分解
主要实现思想为用 SoftCache和WeakCache存储数据的value,缓存的key还是放在原来的代理中。当垃圾回收的时候弱引用或者软引用被回收。而key还存在,缓存通过定义一个private final ReferenceQueue<Object> queueOfGarbageCollectedEntries;
将垃圾回收的元素key存放在了队列中,下一次putObject 时将回收掉的缓存key清除掉
主要实现思想为用 SoftCache和WeakCache存储数据的value,缓存的key还是放在原来的代理中。当垃圾回收的时候弱引用或者软引用被回收。而key还存在,缓存通过定义一个private final ReferenceQueue<Object> queueOfGarbageCollectedEntries;
将垃圾回收的元素key存放在了队列中,下一次putObject 时将回收掉的缓存key清除掉
3)SynchronizedCache缓存:get、put方法都加了synchronized关键字,同步操作
4)ScheduledCache缓存:定时清理缓存,每隔一段时间定时清理一次缓存,默认为1小时
5) SerializedCache: 序列化缓存,定义了serialize()deserialize()两个方法对对象进行序列化和反序列化,get和put对象时通过调用序列化方法将对象进行序列化和反序列化
主要部分
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(value);
oos.flush();
oos.close(); 6) FifoCache:先进先出缓存,定义一个lLinklist存储缓存key,当队列满了之后去掉队头,将新加入的对象加入队尾
7) LruCache: 就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉,判断过期数据的过程交给了LinkedHashMap
keyMap = new LinkedHashMap<Object, Object>(size, .75F, true)
其中第三个参数要为true,如果为false则这个map只是一个有顺序的,迭代出元素的顺序跟加入元素的顺序相对应。
public void setSize(final int size) final关键字有什么作用?
final关键字要求了传入的size不能被再赋值
keyMap = new LinkedHashMap<Object, Object>(size, .75F, true)
其中第三个参数要为true,如果为false则这个map只是一个有顺序的,迭代出元素的顺序跟加入元素的顺序相对应。
public void setSize(final int size) final关键字有什么作用?
final关键字要求了传入的size不能被再赋值
定义了一个继承了LinkedHashMap的内部类来存储缓存数据,重写了removeEldestEntry方法。当map缓存数据量超过设定值时将eldestKey指向eldest.getKey()
8) 还有事务缓存,设置了两个map。插入或者删除的同时将数据插入这两个map中,回滚时从临时map里将数据取出