缓存回收策略
1 基于空间
即设置缓存的【存储空间】,如设置为10MB,当达到存储空间时,按照一定的策略移除数据。
2 基于容量
基于容量指缓存设置了【条目的最大值】,当缓存的条目超过最大大小,则按照一定的策略将旧数据移除。
3 基于时间
TTL(Time To Live ):存活期,即缓存数据从缓存中创建时间开始直到它到期的一个时间段(不管在这个时间段内有没有访问都将过期)。
TTI(Time To Idle):空闲期,即缓存数据多久没被访问过将从缓存中移除的时间。
4 基于Java对象引用
软引用:如果一个对象是软引用,那么当JVM堆内存不足时,垃圾回收器可以回收这些对象。软引用适合用来做缓存,从而当JVM堆内存不足时,可以回收这些对象腾出一些空间供强引用对象使用,从而避免OOM。
弱引用:当垃圾回收器回收内存时,如果发现弱引用,则将立即回收它。相对于软引用有更短的生命周期。
注意:弱引用/软引用对象只有当没有其他强引用对象引用它时,垃圾回收时才回收该引用。即如果有一个对象(不是弱引用/软引用)引用了弱引用/软引用对象,那么垃圾回收时不会回收该引用对象。
=============================================================================
回收算法
使用【基于空间】和【基于容量】的会使用一定的策略移除旧数据,常见的如下。
FIFO(First In First Out):先进先出算法,即先放入缓存的先被移除。
LRU(Least Recently Used): 最近最少使用算法,使用时间距离现在最久的那个被移除。
LFU(Least Frequently Used):最不常用算法,一定时间段内使用【次数(频率)】最少的那个被移除。
实际应用中基于LRU的缓存居多,如Guava Cache、Ehcache支持LRU。